挥手4次也要做什么?
由于TCP的连接是全双工的,因此断开连接需要分别断开两个通道,但四次摆动是断开两个通道和释放资源。
TCP提供所谓的半关闭,即连接的一端完成他的发送后,可以接收来自另一端的数据的能力。
TCP/IP详细信息卷I
在本例中,客户端为主动启动器,服务器为被动关闭侧。
首先,客户端主动向服务器发出Req。 此服务器包含FIN标识符位=1,其中客户机的Seq序列号n表示当前客户机连接的当前序列号。
在第2步中,服务器端接收到包含此FIN的Req消息后,如果检查无误,将立即向客户端返回ACK消息。 消息内部的ACK标志位为1,Seq编号为FIN请求消息的Seq编号1。 此时的Sever会积极地向Server上的APP应用层程序发送结束标识符。 然后,APP应用层程序可以确定是立即关闭,还是在服务器上该连接的数据处理后,向客户端发送一条FIN消息以关闭另一半的连接。
在第3步中,服务器端处理连接上Pending居住的数据,然后APP应用程序进行名为close的连接。 客户端积极地向客户端发送FIN的Req消息。 消息内部带有FIN=1的结束符识别符位和服务器端的Seq序列号。
在第4步中,客户端在收到相应的FIN消息后,会主动通知APP应用层程序,告知您必须关闭此连接。 然后,客户端将包含ACK=1的标识位和FIN的REQ带来的Seq 1的ACK消息返回给服务器,以断开其他方向的信道。
为什么需要挥手4次?
因为TCP是全双工协议,所以必须单独移除每个通道。 4挥手的目的是停止数据传输,回收资源。 这时,两个端点两个方向的序列号没有任何关系,两个方向都没有数据传输的情况下,必须等待拆除虚拟链路,不像初始化时那么简单。 找到SYN标志后初始化序列号,确认SYN的序列号。 因此,必须单独单向结束这个方向的数据传输。
挥手三次会怎么样? 在三次情况下,被动关闭端在收到FIN消息后,必须同时回复ACK和服务器端的FIN消息。 如果服务器端不需要在该连接上处理Pending消息,则可以。 如果服务器端关闭其他方向的连接需要时间的话,这样的3次挥手也不能满足条件。
4挥手状态的转换?
客户端:
established---server---FIN _ wait _1--- -与服务器端发送来的fin相对应的ack----fin_wait_2----server
服务器端:
established----客户端的fin-closed _ wait--关闭服务器端的APP应用程序以接收客户端对fin----last_ACK----fin的ack响应
Tcp/ip详细信息卷I
其中4次挥手与Scoket函数的对应关系如下。
照片来自网络。 如果有侵害的话请通知我。 立即删除
4挥手失败会怎么样?
在4次挥手中,最典型的场景是Client成为TIME_WAIT后的2MSL的时间处理。 (备注) MSL是TCP消息中最大的生存时间,它是任何消息段被丢弃之前在网络中的最大时间。 )
设置2MSL的目的是处理服务器端重新发送最后一个FIN时客户端可以发送最后一个ACK的时间。
在此时间段内,无论是客户端还是服务器端,都最好不要重用此TCP上的端口。 否则,基于此端口新建立的连接可能会被错误地清除。 详细情况如下。
step 1:服务器向客户端发送的最后一个FIN由客户端接收,也向服务器发送了ACK,但服务器没有接收到此ACK。 step2:于是客户端复用了这个端口号码,创建了新的连接。 这里设为newConnection。 step3:Server在此过程中向客户端发送了重新发送的FIN。 刚刚在客户端上创建的新连接将再次关闭。
参考资料:
3359 blog.csdn.net/QQ _ 34501940/article/details/5119726
3359 blog.csdn.net/vary all/article/details/80348850
TCP/IP详细信息卷1
欢迎使用公众号:灰子学技术