网络编程-再看TCP的四次挥手
副标题[/!--empirenews.page--]
前言 四次挥手 四次挥手的流程在很多地方都可以看到,这里简略介绍一下,其最常见流程如下图所示: 其大体流程如下:
作为一种最常见的四次挥手场景,我们可能习以为常了,但需要注意的是,连接的断开并不只有这种情况,还可以是服务端发起主动关闭,或者双方同时发起,但这不是本文关注的重点。我们直接看看四次挥手有哪些需要注意的。 什么是TCP的半关闭 TCP半关闭指的是一端结束发送后还能够接受来自另一端的数据。也就是说,虽然客户端准备断开连接并且发送了FIN报文,客户端还是可以接收来自服务端的数据。不过这种关闭方式不能使用close接口,而需要使用shutdown:
并且how参数值为SHUT_WR,即1,表明shutdown for writing ,仅关闭本端的发送。 为什么要四次挥手 为什么建立一个TCP连接需要三次握手,而终止一个连接需要四次挥手呢?这是因为TCP半关闭造成的。由于一个TCP连接是全双工的,在两个方向上都能传输数据,因此两个方向就需要单独关闭。所以这个流程是这样的:
因而整个过程需要四次挥手。 为什么要TIME_WAIT状态 TIME_WAIT也称为2MSL等待时间。MSL为报文最大生存时间,它是任何报文在被丢弃前存在于网络内的最长时间。这个时间在不同类型的系统中可能有所不同,但这不是关键。在我个人的机器上,可以借助netstat命令和nc命令通过下面的方式观察到。在终端1监听1234端口:
在终端2连接到1234端口:
在终端3通过netstat命令观察:
然后在终端1按ctrl+c,终止连接,立刻观察终端3的结果,我们发现:
我们可以观察到,服务端当前处于TIME_WAIT,且有一个timewait的定时器,为1分钟。 netstat命令和nc命令的使用可以分别参考《不可不知的网络命令-netstat》和《网络工具中的”瑞士军刀“-nc》。 TIME_WAIT状态的存在主要考虑以下两个方面:
(编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |