深入TCP(三):基于状态机的3次握手与4次挥手

2017-07-04 14:53 阅读 625 次 评论 1 条

前面已经介绍过TCP的相关特性,也遗留了TCP运输连接的建立和释放的面向连接机制,如果你对前两篇有了较为清晰的认识,那么连接建立、数据传送、连接释放也就顺理成章了。

TCP的3次连接过程

我们对上图TCP连接的三次握手过程宏观的说明一下:

第一次握手:建立连接时,客户端A发送SYN=1(SYN报文段不能携带数据,但要消耗一个序号),选择一个初始号seq=x到服务器B,进入同步已发送状态,等待B确认。

第二次握手:B收到连接请求后,向A发送确认报文。此时SYN和ACK都应置1,确认号为x+1,同时也为自己选择初始序号seq=y。此时B进入同步收到状态。

第三次握手:客户端A收到B的确认报文后,向服务器B发送确认包ACK=1,确认号ack=y+1,A的序号seq=x+1,此包发送完毕。A和B进入已建立连接状态。

我们将上述握手过程具体化,实际上就相当与打电话:


完成三次握手,客户端与服务器开始传送数据(省略)。


TCP的4次挥手过程

由于TCP是全双工的,因此每个方向都可以单独发起close操作,挥手过程如下:

第一次挥手:客户端A主动发送FIN=1包,用来关闭与服务器B之间的数据传送。A进入终止等待1状态。

第二次挥手:服务器B收到FIN=1的包后,发回一个ACK=1表示确认,确认序号为收到的序号+1。然后B进入关闭等待状态,A收到B的确认后,进入终止等待2状态,等待B发出连接释放报文。

第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN=1包给客户端A。然后进入最后确认状态。

第四次挥手:客户端A发送ACK=1表示对B的释放请求发出确认,并将确认序号设置为收到序号+1。然后进入时间等待状态。

TCP常见问题总结

⑴ 为什么TCP连接时3次握手,2次可以吗?

采用三次握手是为了防止失效的连接请求报文段突然又传送到对端主机,我们不妨模拟以下场景:

看到网上前篇一律,恰好在知乎上看见一个帖子分析一下:TCP3次握手的本质是信道不可靠,但是通信双方就某个问题达成了一致,无论你在消息中包含什么信息,三次通信是理论上的最小值,所以三次握手不是TCP本身的要求,而是为了满足"在不可靠信道上可靠地传输信息"这一需求所致。

⑵ TCP连接只需3次握手,为什么要4次挥手?

因为客户端的LISTEN状态下的SOCKET收到SYN报文的连接请求后,它可以把ACK和SYN放在一个报文里来发送。但关闭连接时,当收到对方的FIN通知时,它仅仅表示对方没有数据发送给你,但并不代表你不会给它发送数据,所以你可能不会立即关闭SOCKET,而是发送FIN报文给对方表示你同意现在可以关闭连接了,所以这里的ACK报文和FIN报文多数情况下是分开发送的。

⑶ 为什么TIME-WAIT状态必须要等待2MSL的时间?

版权声明:本文著作权归原作者所有,欢迎分享本文,谢谢支持!
转载请注明:深入TCP(三):基于状态机的3次握手与4次挥手 | 术与道的分享
分类:网络与安全 标签:, ,
1024do.com导航_术与道导航平台

发表评论


表情