阳山做网站/优化网站技术
Tcp连接 : 建立&断开 - 3次握手 4次挥手
- 一、报文的格式
- 二、建立Tcp连接(3次握手)
- 1、过程
- 2、3次握手 - 目的
- 三、断开TCP连接(4次挥手)
- 1、过程
- 2、等待2MSL原因
- 3、4次挥手 - 原因
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
一、报文的格式
1、源端口 & 目标端口
① 端口
- 在一台机器上,一个进程对应一个端口。端口的作用就是用来唯一标识这个进程。有了端口号,接受到报文后才能够知道将报文发送到哪个进程。
② 源端口
- 源端口标识发起通信的那个进程
③ 目的端口
- 目的端口标识接受通信的那个进程。
2、序号(Seq)
- 序号:Seq(Sequence Number)序号占32位,用来标识从计算机A发送到计算机B的数据包的序号,计算机发送数据时对此进行标记。
3、确认号(Ack)
- 确认号:Ack(Acknowledge Number)确认号占32位,客户端和服务器端都可以发送,Ack = Seq + 1。
4、标志位
- 标志位:每个标志位占用1Bit,共有6个,分别为 URG、ACK、PSH、RST、SYN、FIN,具体含义如下:
标志位 | 英文 | 含义 |
---|---|---|
SYN | Syncronization | 同步位,一般用于建立一个新连接 |
FIN | Finish | 完成符,表示断开一个连接 |
URG | Urge | 紧急位,设置为1时,首部中的紧急指针有效;为0时,紧急指针没有意义。 |
ACK | Acknowledge | 确认 (响应) 符,表示发来的数据已确认接收无误。 |
PSH | Push | 传输符,表示有 DATA数据传输 |
RST | Reset | 复位符,表示连接重置,用以异常的关闭连接。 |
二、建立Tcp连接(3次握手)
1、过程
① 第一次握手
建立连接时,客户端发送SYN包,报文首部中的同步序号SYN=1,同时选择一个初始序列号 seq=x 到服务器,并进入SYN_SENT状态,等待服务器确认。
② 第二次握手
TCP服务器收到请求报文后,如果同意连接,则发出确认报文。确认报文中应该 ACK=1,SYN=1,确认号是ack=x+1,同时也要为自己初始化一个序列号 seq=y,此时,TCP服务器进程进入了SYN_RCVD(同步收到)状态。
③ 第三次握手
客户端收到服务器的SYN+ACK包后,还要向服务器发送确认报文(ACK=1,ack=y+1,自己的序列号seq=x+1),此时,TCP连接建立,客户端进入ESTABLISHED(已建立连接)状态此包发送完毕,完成三次握手。
2、3次握手 - 目的
-
客户端发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达服务器。
-
本来这是一个早已失效的报文段。但服务器收到此失效的连接请求报文段后,就误认为是客户端再次发出的一个新的连接请求。于是就向客户端发出确认报文段,同意建立连接。
-
客户端不会向服务器的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。
三、断开TCP连接(4次挥手)
1、过程
① 第一次挥手
Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
② 第二次挥手
Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
③ 第三次挥手
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
④ 第四次挥手
Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1, Server进入CLOSED状态,完成四次挥手。
2、等待2MSL原因
MSL是Maximum Segment Lifetime英文的缩写,即"报文最大生存时间", 他是任何报文在网络中存在的最长时间,超过这个时间报文将被丢弃。2MSL即2倍的报文最大存活时间。
-
当主动发起关闭方发送完最后一个ACK包后无法确认对方是否有收到这个ACK包,所以2MSL的时间能保证如果对方没收到会重发第三次挥手的FIN包,且这个包有足够的时候发送回来。
-
如果在这个时间内还没收到重发的FIN包,便可以证明对方已收到该ACK包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。
-
在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。
3、4次挥手 - 原因
-
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。
-
但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。
-
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。