计算机网络 四次握手
Peng's Blog 只记录和技术相关的东西

计算机网络 四次握手


TCP的传输连接管理 — TCP连接的释放

四次握手

客户端A,服务器端B.

释放连接之前,在进行数据传送,都处于ESTABLISHED状态,即已建立连接。
在谢希仁的书上是说,数据传输结束之后,通信的双方都可以释放连接。
这里演示的是客户端A主动释放连接。

第一次握手

客户端A的应用程序先向其TCP发出释放报文段,并停止传输数据,主动关闭TCP连接。
A把释放报文段首部的 终止控制位FIN = 1,其序号 seq = u,u 等于已传送过来的数据的最后一个字节的序号加1。
此时,客户端A进入 FIN-WAIT-1状态。

第二次握手

服务器端B收到释放报文段后,发出确认,ACK=1,确认号是 ack = u+1,而这个确认报文段自己的序号是seq = v ,v等于B前面已经传送过的数据的最后一个字节的序号加 1 。
然后服务器B就进入到 CLOSE-WAIT状态,即等待关闭。
此时!!! 处于半关闭状态。
即:A已经没有数据发送到B,但是B如果有数据要发送给A的话,A仍然要接收。
也就是说,A到B这个方向的连接已经关闭,B到A这个方向的连接并没有关闭,可能还要持续一段时间。

第三次握手

客户端A收到服务器端B的确认后,进入FIN-WAIT-2状态,等待B发出的连接释放报文段。
如果B已经没有数据要发送给A了,那么B就会发出释放报文段: FIN = 1,ACK = 1,假定B的序号 seq = w。B还必须重复上次已发送的确认号 ack = u+1
这时,服务器B就进入 LAST-ACK状态了,即最后确认状态,等待A的确认。

第四次握手

客户端A收到服务器B发来的报文后,对此进行确认。在确认报文段,把 ACK = 1,序列号 seq = u+1,确认号 ack = w+1
然后进入到TIME-WAIT(时间等待)状态。
注意,四次握手之后,连接并没有马上被释放掉。必须经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
MSL叫做最长报文段寿命,建议设置为两分钟
设置两倍最长报文段寿命的目的是:
1.保证A发送的最后一个ACK报文段能够到达B。这个报文段可能会丢失,B收不到最后的确认,就会超时重传,然后A因为还没关闭,所以就能再次传送最后的ACK报文。
2.为了防止“已失效的请求连接报文段”出现在本次连接中,2MSL时间后,就可以是的本连接持续时间内所发生的所有报文段都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。

四次握手的过程图解

enter description here

关于四次握手的一些面试题

TCP链接中主动断开链接netstat观察可能出现的状态流转是:
正确答案: C D 你的答案: C D (正确)
A.ESTABLISHED->CLOSE_WAIT->TIME_WAIT->CLOSED
B.ESTABLISHED->TIME_WAIT->CLOSE_WAIT->CLOSED
C.ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
D.ESTABLISHED->FIN_WAIT_1->TIME_WAIT->CLOSED

下面有关TCP协议的描述,说法错误的是?
正确答案: D 你的答案: D (正确)
A.TCP使用窗口机制进行流量控制
B.由于TCP连接是全双工的,因此每个方向都必须单独进行关闭,需要四次握手
C.TCP连接建立需要三次握手
D.被动关闭socket后,会进入到TIME_WAIT状态


Comments

评论功能暂停使用,如需跟作者讨论请联系底部的GitHub