互联网基础-TCP网络中的握手协议

有一些网络基础的同学都知道TCP连接需要三次握手,断开需要4次握手。但是如果要说TCP连接建立和断开过程中,连接状态是如何变化的,估计很难说出具体情况,下面我们看一张图,描述了TCP连接状态变化过程:

互联网基础-TCP网络中的握手协议

TCP连接状态变化

这里有几个问题需要注意:

1、为什么建立连接时还需要第3次确认

  • 主要防止已经失效的连接请求报文突然又传送到了服务器,从而产生错误。

2、为什么关闭连接是4次握手

  • 关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

3、为什么客户端在TIME-WAIT阶段要等2MSL

  • 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失。如果服务器已经发送了FIN+ACK报文请求断开了,但还没有收到客户端的回应,服务器会认为自己发送的请求断开报文丢失,于是服务器又会重新发送一次;而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
  • 防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。

熟悉tcp连接状态变化过程,对一些网络定位很有帮助;在linux服务器上面,通过netstat命令可以看到服务器当前所有TCP连接和状态,比如敲下如下命令看到的结果(关于netstat命令的使用可以通过帮助文档去学习):

<code>netstat -anltp | less

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      1548/php-fpm: maste
tcp        0      0 0.0.0.0:17902           0.0.0.0:*               LISTEN      503/sshd
tcp        0      0 127.0.0.1:63791         0.0.0.0:*               LISTEN      30946/redis-server
tcp        0      0 172.27.0.2:80           10.241.193.251:64636   SYN_RECV    -
tcp        0      0 172.27.0.2:80           10.174.169.193:14651   SYN_RECV    -
tcp        0      0 172.27.0.2:80           10.117.181.16:29235    SYN_RECV    -/<code>


分享到:


相關文章: