起名TCP的1次握手(建立连接)和4遍挥手(关闭连接)(转)

转自:(http://www.cnblogs.com/Jessy/p/3535612.html)

方法二、docker pull mysql

查找Docker Hub上的mysql镜像

runoob@runoob:/mysql$ docker search mysql
NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                    MySQL is a widely used, open-source relati...   2529      [OK]       
mysql/mysql-server       Optimized MySQL Server Docker images. Crea...   161                  [OK]
centurylink/mysql        Image containing mysql. Optimized to be li...   45                   [OK]
sameersbn/mysql                                                          36                   [OK]
google/mysql             MySQL server for Google Compute Engine          16                   [OK]
appcontainers/mysql      Centos/Debian Based Customizable MySQL Con...   8                    [OK]
marvambass/mysql         MySQL Server based on Ubuntu 14.04              6                    [OK]
drupaldocker/mysql       MySQL for Drupal                                2                    [OK]
azukiapp/mysql           Docker image to run MySQL by Azuki - http:...   2                    [OK]
...

那里大家拉取官方的镜像,标签为5.6

runoob@runoob:~/mysql$ docker pull mysql:5.6

伺机下载达成后,大家就足以在地面镜像列表里查到REPOSITO哈弗Y为mysql,标签为5.6的镜像。


参照:

使用mysql镜像

http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF

运作容器

runoob@runoob:~/mysql$ docker run -p 3306:3306 --name mymysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
21cb89213c93d805c5bacf1028a0da7b5c5852761ba81327e6b99bb3ea89930e
runoob@runoob:~/mysql$ 

命令表达:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口

  • -v
    $PWD/conf/my.cnf:/etc/mysql/my.cnf:
    将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf

  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs

  • -v
    $PWD/data:/mysql_data:
    将主机当前目录下的data目录挂载到容器的/mysql_data

  • -e MYSQL_ROOT_PASSWORD=123456:开端化root用户的密码

http://hi.baidu.com/raycomer/item/944d23d9b502d13be3108f61

查阅容器运营状态

runoob@runoob:~/mysql$ docker ps 
CONTAINER ID    IMAGE         COMMAND                  ...  PORTS                    NAMES
21cb89213c93    mysql:5.6    "docker-entrypoint.sh"    ...  0.0.0.0:3306->3306/tcp   mymysql

Docker 安装 PHP

Docker 安装
Tomcat

 

笔记列表

   Brian

  153***2799@qq.com

风行官方MySQL(5.7.19)的docker镜像在开创时映射的配置文件目录有所分化,在此记录并享受给大家:

合法原版的书文:

The MySQL startup configuration is specified in the
file /etc/mysql/my.cnf, and that file in turn includes any files found
in the /etc/mysql/conf.d directory that end with .cnf. Settings in
files in this directory will augment and/or override settings
in /etc/mysql/my.cnf. If you want to use a customized MySQL
configuration, you can create your alternative configuration file in a
directory on the host machine and then mount that directory location
as /etc/mysql/conf.d inside the mysql container.

约莫意思是说:

MySQL(5.7.19)的暗中认可配置文件是 /etc/mysql/my.cnf
文件。假如想要自定义配置,提出向 /etc/mysql/conf.d 目录中开创 .cnf
文件。新建的文件能够任意起名,只要保险后缀名是 cnf
即可。新建的文本中的配置项能够覆盖 /etc/mysql/my.cnf 中的配置项。

具体操作:

先是必要创制将要映射到容器中的目录以及.cnf文件,然后再次创下设容器

# pwd
/opt
# mkdir -p docker_v/mysql/conf
# cd docker_v/mysql/conf
# touch my.cnf
# docker run -p 3306:3306 --name mysql -v /opt/docker_v/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d imageID
4ec4f56455ea2d6d7251a05b7f308e314051fdad2c26bf3d0f27a9b0c0a71414

指令表明:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口
  • -v
    /opt/docker_v/mysql/conf:/etc/mysql/conf.d:
    将主机/opt/docker_v/mysql/conf目录挂载到容器的/etc/mysql/conf.d
  • -e MYSQL_ROOT_PASSWORD=123456:开首化root用户的密码
  • -d: 后台运转容器,并重临容器ID
  • imageID: mysql镜像ID

查阅容器运营状态

# docker ps
CONTAINER ID IMAGE          COMMAND          ... PORTS                    NAMES
4ec4f56455ea c73c7527c03a  "docker-entrypoint.sh" ... 0.0.0.0:3306->3306/tcp   mysql

树立连接: 

理解:窗口和滑动窗口
TCP的流量控制

TCP使用窗口机制举办流量控制

怎样是窗口?

接连建立即,各端分配一块缓冲区用来存款和储蓄接收的数据,并将缓冲区的尺寸发送给另一端

接收方发送的确认消息中蕴藏了温馨剩余的缓冲区尺寸

剩余缓冲区上空的数量叫做窗口

2. TCP的流控进程(滑动窗口)

起名 1

TCP(Transmission Control Protocol) 传输控制协议

二遍握手

TCP是主机对主机层的传输控制协议,提供可信的总是服务,采纳一遍握手确认建立八个一而再:

位码即tcp标志位,有6种标示:

SYN(synchronous建立共同)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码)

Acknowledge number(确认号码)

客户端TCP状态迁移:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态迁移:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

 

起名 2

依次状态的意思如下: 
LISTEN – 侦听来自远方TCP端口的接连请求; 
SYN-SENT -在发送连接请求后伺机匹配的连天请求; 
SYN-RECEIVED – 在接收和发送三个老是请求后等候对连日请求的确认; 
ESTABLISHED- 代表多个开拓的连天,数据足以传递给用户; 
FIN-WAIT-1 – 等待远程TCP的总是中断请求,或先前的接连中断请求的肯定;
FIN-WAIT-2 – 从远程TCP等待连接中断请求; 
CLOSE-WAIT – 等待从本地用户发来的连年中断请求; 
CLOSING -等待远程TCP对连日中断的认可; 
LAST-ACK – 等待原来发向远程TCP的连年中断请求的承认; 
TIME-WAIT -等待丰裕的时间以确定保证远程TCP接收到连年中断请求的承认; 
CLOSED – 没有别的连接景况;

 

TCP/IP协议中,TCP协议提供保证的连天服务,选拔三回握手建立四个三番五次,如图1所示。

(1)第三回握手:建立连接时,客户端A发送SYN包(SYN=j)到劳动器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第③次握手:服务器B收到SYN包,必须承认客户A的SYN(ACK=j+1),同时协调也发送二个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第1次握手:客户端A收到服务器B的SYN+ACK包,向劳动器B发送确认包ACK(ACK=k+1),此包发送实现,客户端A和服务器B进入ESTABLISHED状态,达成一次握手。

成功一次握手,客户端与服务器起头传送数据。

肯定号:其数值等于发送方的发送序号
+1(即接收方期望接收的下三个种类号)。

起名 3

图1 TCP一遍握手建立连接  起名 4

TCP的许昌结构:
源端口 16位
指标端口 13人
序列号 32位
回应序号 三十四人
TCP头长度 4位
reserved 6位
控制代码 七人
窗口大小 十几人
偏移量 16位
校验和 16位
选项  32位(可选)
诸如此类大家得出了TCP黄冈的细微长度,为20字节

  • 首先次握手:
    客户端发送1个TCP的SYN标志地方1的包指明客户打算连接的服务器的端口,以及开首序号X,保存在德阳的体系号(Sequence
    Number)字段里。

  • 第3回握手:
    服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将承认序号(Acknowledgement
    Number)设置为客户的I S N加1以.即X+1。

 

  • 其三回握手.
    客户端再度发送确认包(ACK)
    SYN标志位为0,ACK标志位为1.还要把服务器发来ACK的序号字段+1,放在规定字段中发送给对方.并且在数码段放写ISN的+1

下边是实际的例子截图:

1.此图包蕴两有的新闻:TCP的一遍握手(方框中的内容) (SYN, (SYN+ACK),
ACK)

  1. TCP的数据传输 ([TCP segment of a reassembled
    PUD])能够看出,server是将数据TCP层对新闻包进行分片传输

(1)Server端收到HTTP请求如GET之后,构造响应新闻,当中指导网页内容,在server端的HTTP层发送音信200
OK->server端的TCP层; 
(2)server端的TCP层对新闻包进行分片传输; 
(3)client端的TCP层对接收到的逐条音信包分片回送响应; 
(4)client端的TCP层每回收到部分都会用ACK确认,之后server继续传输,client继续认可,直到完毕响应新闻的富有分片之后,Server发送组合HTTP响应包
200 O
K,此时在client端的音讯跟踪中才足以来得HTTP 200 OK的新闻包

起名 5 

关门连接:

 

出于TCP连接是全双工的,因而每种方向都不可能不独立开始展览关闭。那一个条件是当一方完毕它的数目发送职责后就能发送四个FIN来终止那么些主旋律的连天。收到一个 FIN只代表这一样子上一向不数据流动,3个TCP连接在接收三个FIN后还能发送数据。首先实行关闭的一方将执行积极关闭,而另一方执行被动关闭。

 CP的总是的拆除与搬迁必要发送七个包,由此称为5次挥手(four-way
handshake)。客户端或服务器均可积极发起挥手动作,在socket编制程序中,任何一方执行close()操作即可发生挥手操作。

(1)客户端A发送2个FIN,用来关闭客户A到服务器B的数目传送。 

(2)服务器B收到那些FIN,它发回3个ACK,确认序号为接受的序号加1。和SYN一样,三个FIN将占据3个序号。 

(3)服务器B关闭与客户端A的连天,发送多个FIN给客户端A。 

(4)客户端A发回ACK报文确认,并将确认序号设置为接到序号加1。 

TCP选拔6次挥手关闭连接如图2所示。

起名 6

 图2  TCP5遍挥手关闭连接

 

参见wireshark抓包,实地度量的抓包结果并从未严刻按挥手时序。笔者估摸是光阴距离太短造成。

 

浓密明白TCP连接的放走: 

 

**由于TCP连接是全双工的,由此种种方向都不可能不独立开始展览关闭。那规范是当一方达成它的数目发送职务后就能发送八个FIN来终止那么些主旋律的连天。收到四个FIN只表示这一样子上一向不多少流动,三个TCP连接在接到贰个FIN后仍是可以发送数据。首先进行倒闭的一方将执行积极关闭,而另一方执行被动关闭。
TCP协议的连日是全双工连接,3个TCP连接存在双向的读写通道。 
简易说来是
“先关读,后关写”,一共要求多个阶段。以客户机发起关闭连接为例:
1.服务器读通道关闭
2.客户机写通道关闭
3.客户机读通道关闭
4.服务器写通道关闭
闭馆行为是在发起方数据发送实现之后,给对方发生三个FIN(finish)数据段。直到接收到对方发送的FIN,且对方接收了收纳确认ACK之后,双方的数额通讯完全结束,进程中老是收到都急需重回确认数据段ACK。
详见进程:
    
先是品级  
客户机发送完数据现在,向服务器发送1个
FIN数据段,系列号为i
   
1.服务器收到
FIN(i)后,重回确认段ACK,种类号为i+1关闭服务器读通道
    2.客户机械收割到
ACK(i+1)后,关门客户机写通道
   (此时,客户机仍可以透过读通道读取服务器的数量,服务器仍可以因而写通道写多少)
    
其次品级 服务器发送完数据现在,向客户机发送3个FIN数据段,种类号为j;
   
3.客户机械收割到
FIN(j)后,再次来到确认段ACK,系列号为j+1闭馆客户机读通道
    4.服务器收到
ACK(j+1)后,闭馆服务器写通道
那是标准的TCP关闭七个阶段,服务器和客户机都能够倡导关闭,完全对称。
FIN标识是透过发送最终一块数据时设置的,标准的例证中,服务器还在发送数据,所以要等到发送完的时候,设置FIN(此时可称之为TCP连接处于
半闭馆状态,因为数量仍可从被动关闭一方向积极关闭方传送)。要是在服务器收到FIN(i)时,已经远非多少需求发送,能够在回去ACK(i+1)的时候就设置FIN(j)标识,那样就一定于能够统一第1步和第3步。读《Linux互连网编制程序》关闭TCP连接章节,作以下笔记:**

TCP的TIME_WAIT和Close_Wait状态

 

面试时见到应聘者简历中写领会网络,TCP编制程序,小编常问三个题材,TCP建立连接要求五遍握手?95%之上的应聘者都能答对是2遍。问TCP断开连接须要四回握手,7/10的应聘者能答对是捌回通讯。再问CLOSE_WAIT,TIME_WAIT是何许情况,怎么发生的,对劳务有哪些影响,怎么样破除?有一些同桌就回应不上来。不是自身扣细节,而是在通信为主的前端服务器上,必须有力量处理各样TCP状态。比如计算在本厂的一台前端机上高峰时刻TCP连接的图景,总结命令:

 

 

  1. netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’  

 

 

结果:

 

除此之外ESTABLISHED,能够看来连接数比较多的多少个状态是:FIN_WAIT1,
TIME_WAIT, CLOSE_WAIT,
SYN_RECV和LAST_ACK;下边包车型客车篇章就那多少个情景的发出条件、对系统的影响以及处理方式进行简易描述。

 

TCP状态

TCP状态如下图所示:

唯恐有点凌乱?再看看这些时序图

 

 

上面看下我们一般比较关切的三种TCP状态

SYN_RECV 

服务端收到建立连接的SYN没有收到ACK包的时候处在SYN_RECV状态。有四个相关系统安排:

 

1,net.ipv4.tcp_synack_retries :INTEGER

暗许值是5

对此远端的连日请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个SYN连接请求包。那是所谓的3回握手( threeway
handshake)机制的第二个步骤。那里决定内核在放弃连接在此之前所送出的 SYN+ACK
数目。不应有领先255,暗中认可值是5,对应于180秒左右时间。日常大家不对那么些值进行改动,因为我们意在TCP连接不要因为偶然的丢包而无法树立。

2,net.ipv4.tcp_syncookies

相似服务器都会设置net.ipv4.tcp_syncookies=1来严防SYN
Flood攻击。借使一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在爆发SYN+ACK应答报文后是无能为力吸收接纳客户端的ACK报文的(第①回握手无法形成),那种气象下服务器端一般会重试(再一次发送SYN+ACK给客户端)并等候一段时间后屏弃那么些未到位的接连,那段时日的长短我们誉为SYN
Timeout,一般的话这么些日子是分钟的数码级(大约为30秒-2分钟)。

 

那个地处SYNC_RECV的TCP连接称为半连连,并蕴藏在根本的半连接队列中,在基本收到对端发送的ack包时会查找半总是队列,并将适合的requst_sock音信囤积到形成三次握手的连天的行列中,然后删除此半接二连三。多量SYNC_RECV的TCP连接会招致半连接队列溢出,那样继续的连接建立请求会被基本直接丢掉,那正是SYN
Flood攻击。

 

能够行得通预防SYN Flood攻击的伎俩之一,正是SYN Cookie。SYN Cookie原理由D.
J. Bernstain和 埃里克 Schenk发明。SYN
Cookie是对TCP服务器端的2遍握手球组织议作一些修改,专门用来严防SYN
Flood攻击的一种手段。它的规律是,在TCP服务器收到TCP SYN包并赶回TCP
SYN+ACK包时,不分配贰个特别的数据区,而是基于这些SYN包计算出1个cookie值。在接到TCP
ACK包时,TCP服务器在依照那多少个cookie值检查这些TCP
ACK包的合法性。就算官方,再分配专门的数据区实行拍卖现在的TCP连接。

 

观望服务上SYN_RECV连接个数为:7314,对于贰个高并发连接的电视发表服务器,这一个数字相比较健康。

CLOSE_WAIT

发起TCP连接关闭的一方称为client,被动关闭的一方称为server。被动关闭的server收到FIN后,但未发生ACK的TCP状态是CLOSE_WAIT。出现那种现象相似皆以由于server端代码的难题,如果您的服务器上出现大量CLOSE_WAIT,应该要考虑检讨代码。

TIME_WAIT

根据TCP协议定义的贰次握手断开连接规定,发起socket主动关闭的一方
socket将跻身TIME_WAIT状态。TIME_WAIT状态将持续一个MSL(马克斯 Segment
Lifetime),在Windows下暗中同意为4分钟,即240秒。TIME_WAIT状态下的socket不可能被回收利用.
具体境况是对此3个拍卖大批量短连接的服务器,若是是由服务器主动关闭客户端的连接,将造成服务器端存在大批量的处于TIME_WAIT状态的socket,
甚至比处于Established状态下的socket多的多,严重影响服务器的拍卖能力,甚至耗尽可用的socket,结束服务。

 

怎么供给TIME_WAIT?TIME_WAIT是TCP协议用以保险被重新分配的socket不会受到在此之前残留的延期重发报文影响的编写制定,是必不可少的逻辑保险。

 

和TIME_WAIT状态有关的种类参数有一般由二个,本厂设置如下:

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_fin_timeout = 30

 

net.ipv4.tcp_fin_timeout,默认60s,减小fin_timeout,减少TIME_WAIT连接数量。

 

net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT
sockets重新用于新的TCP连接,暗许为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT
sockets的相当的慢回收,暗中认可为0,表示关闭。

为了有利于描述,作者给那一个TCP连接的一端起名为Client,给其余一端起名为Server。上海教室描述的是Client主动关闭的经过,FTP协议中就那样的。固然要描述Server主动关闭的长河,只要交流描述进度中的Server和Client就足以了,HTTP协议便是这么的。

讲述进度:
Client调用close()函数,给Server发送FIN,请求关闭连接;Server收到FIN之后给Client再次回到确认ACK,同时关闭读通道(不通晓就去看一下shutdown和close的差异),也正是说今后不能够再从那些三番五次上读取东西,今后read重返0。此时Server的TCP状态转化为CLOSE_WAIT状态。
Client收到对友好的FIN确认后,关闭 写通道,不再向连接中写入别的数据。
接下去Server调用close()来关闭连接,给Client发送FIN,Client收到后给Server回复ACK确认,同时Client关闭读通道,进入TIME_WAIT状态。
Server接收到Client对协调的FIN的确认ACK,关闭写通道,TCP连接转化为CLOSED,也便是关门连接。
Client在TIME_WAIT状态下要等待最大数额段生存期的两倍,然后才进去CLOSED状态,TCP协议关闭连接进度彻底结束。

以上正是TCP协议关闭连接的历程,现在说一下TIME_WAIT状态。
从地点能够见见,主动发起关闭连接的操作的一方将达到TIME_WAIT状态,而且那些情形要维持马克西姆um
Segment Lifetime的两倍时间。为何要那样做而不是直接进入CLOSED状态?

原因有二:
壹 、有限协助TCP协议的全双工连接能够可信关闭
二 、保证此次一连的重新数据段从网络中没有

先说第2点,若是Client直接CLOSED了,那么由于IP协议的不可信赖赖性或然是其它互连网原因,导致Server没有收到Client最终回复的ACK。那么Server就会在逾期过后继续发送FIN,此时出于Client已经CLOSED了,就找不到与重发的FIN对应的总是,最后Server就会收取EnclaveST而不是ACK,Server就会以为是连连错误把标题报告给高层。那样的场馆纵然不会造成数据丢失,但是却导致TCP协议不吻合保证延续的渴求。所以,Client不是直接进入CLOSED,而是要保险TIME_WAIT,当再一次接受FIN的时候,可以确定保证对方接到ACK,最后正确的关门连接。

何况第①点,如果Client直接CLOSED,然后又再向Server发起一个新连接,大家不可能保险那些新连接与刚关门的连日的端口号是见仁见智的。也正是说有或然新连接和老连接的端口号是相同的。一般的话不会生出什么难题,可是依然有特出景况出现:尽管新连接和已经倒闭的老连接端口号是一律的,假使前叁遍接二连三的少数数据照旧停留在网络中,那些延迟数据在建立新连接之后才抵达Server,由于新连接和老连接的端口号是一模一样的,又因为TCP协议判断不相同连接的依据是socket
pair,于是,TCP协议就觉得相当延迟的数码是属于新连接的,那样就和真正的新连接的多少包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,那样能够确认保证此次连接的有着数据都从互联网中流失。

种种协商都之前人一字不苟后获取的正儿八经,规范。从细节中都能感受到精细和严厉。每趟深刻都有同二个感到,精妙。

做个欢畅的融洽。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图