本文主要是介绍非正常的连接释放以及可能引起的结果的分析总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、正常的连接释放
正常的连接释放过程需要完成四次挥手的过程。(图 1)第一次,客户端向服务器发出一个连接释放的报文。FIN=1,seq=u,告诉服务器,我需要发送的数据已经全部发送过去了。然后服务器收到客户端的释放连接请求后,向客户段发出确认报文,ACK=1,seq=v,ack=u+1,表示服务器已经知道客户端之后不会发送任何数据报文,但是此时服务器可能还有数据没有发送,所以服务器可能在接下来一段时间都在发送数据。当服务器在发送完最后的数据后,向客户端发出连接释放确认报文,FIN=1,ACK=1,seq=w, ack=u+1,实现第三次挥手,告知客户端,我的数据也全部发完了,我也想要释放连接了。第四次挥手,是客户端手袋服务器连接释放的报文之后,向服务器发出确认报文,ACK=1,seq=u+1,ack=w+1.服务器收到确认报文后,立即关闭连接,客户端在等待2MSL时长后,如果没有异常,将关闭连接。到此TCP连接实现释放。
以上过程中,也可是服务器的数据先发送完,具体过程类似。
二、非正常的连接释放的类型总结
在TCP连接过程中可能因为报文丢失或者报文到达的顺序等问题,引起非正常的连接释放结果。比如说,如果
- 双方同时发出连接释放请求,又同时发送确认;——同时关闭
- 若是双方同时发出连接释放请求,同时发送的确认中发生丢失。
- 若是双方同时发出连接释放请求,同时关闭后,收到确认报文。
(4)当客户端关闭并发送FIN报文的时候后,同收到FIN+ACK报文。
(5)A/B的连接已经释放,连接中在网络中的残留的TCP报文字段重现到达,这个报文字段可能是数据段,也可能是FIN段,也可能是ACK段。
(6)在B已经关闭连接,A还没有关闭连接的时候,已失效的连接请求字段到达B。
三、各种非正常连接释放可能引起的后果
1. 双方同时发出连接释放请求,又同时发送确认
如果客户机和服务器同时发送连接释放请求,即客户机发送报文FIN=1,seq=u,同时服务器发送报文FIN=1,seq=v,当客户机收到服务器发送的请求连接释放的报文后,向其发送确认关闭连接的报文:ACK=1,seq=u+1,ack= v+1;同时当服务器收到客户机发送的连接释放请求的报文后,向其发送确认报文:ACK=1,seq=v+1,ack=u+1。当服务器收到客户机发送的确认报文后,就关闭连接。当客户机收到服务器发送的确认报文后,就关闭连接。如果中间没有报文丢失的话,服务器和客户机会同时关闭连接。
2.若是双方同时发出连接释放请求,同时发送的确认中发生丢失。
(1)若只有一方丢失,则双方一定不是同时关闭。比如如果客户端发给服务器的确认报文丢失。首先不影响客户端收到服务器发送的确认报文,客户端在收到确认报文之后,会立即释放连接。而服务器虽然收不到确认报文,但是因为它发送过确认报文,他会在发送过确认报文之后的2MSL的时间后,释放连接。最终,客户机和服务器完成TCP连接的释放。
(2)若双方均丢失确认报文。则服务器和客户端均会在发送过确认报文后,等待2MSL时间后,释放连接。最终,服务器和客户机完成TCP连接释放。
3. 若是双方同时发出连接释放请求,同时关闭后,收到确认报文
比如在第二种情况下,确认报文并没有丢失,而是确认报文到达的时间长于等待的2MSL,此刻已经释放连接,收到的客户机(/服务器)会拒绝,因为根本没有发起连接请求。
4. 当客户端关闭并发送FIN报文的时候后,同收到FIN+ACK报文
即如果客户机在发送释放连接请求后,服务器还有数据没有发完,但是发送了确认报文丢失,继续发送数据报文,当数据报文发送完之后,发送了FIN和ACK报文。根据报文的seq大小,因为v<w,拒收旧报文,并不影响客户机发送确认服务器释放的报文,当服务器收到确认报文,会释放连接。而服务器在等待2MSL时间后,也会释放连接。至此服务器和客户机间的连接得到释放
5. A/B的连接已经释放,连接中在网络中的残留的TCP报文字段重现到达,这个报文字段可能是数据段,也可能是FIN段,也可能是ACK段
即假设服务器已经释放连接,网络中残留的报文在客户机TIME-WAIT阶段收到数据报文或FIN段或ACK段。客户机会拒收,因为seq的值不对。然后在到达2MSL时间后,释放连接。
6. 在B已经关闭连接,A还没有关闭连接,正处在TIME_WAIT阶段,已失效的连接请求字段到达A。
此时特指A服务器,B特指客户机。此时服务器会拒绝,因为此刻还没有和客户机完全释放连接,服务器还没有释放连接。这里不能看seq的序号大小,因为也可能时新的连接请求,每一次建立连接请求的时候seq开始的值是随机的。如果是新的连接,超过设定等待时间后,客户机会重新发送连接请求,此时若服务器等待了2MSL后,已经释放了连接。可以再接受新的连接请求。总之,不会造成混乱。
四、总结
序号seq很重要。TCP的计时器也很重要,尤其是时间等待计时器的2MSL。
这篇关于非正常的连接释放以及可能引起的结果的分析总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!