Open huanzhiyazi opened 4 years ago
目录
关于 TCP 为什么需要三次握手建立连接、四次挥手断开连接,网上有很多标准的答案,很多讲的都非常不错。这里总结一下三次握手四次挥手中我认为最能帮助理解的原因分析。
先看一下三次握手建立连接的图示:
为什么需要三次握手呢?关键的原因是 通信双方为了相互确认对方收发信息的能力都是正常的。这也是 TCP 建立连接的目的。具体而言:
所以,经过以上三步,客户端和服务器都完全确认对方收发信息的能力都是正常的,连接建立成功,可以正常传输数据了。
先看一下四次挥手断开连接的图示:
需要四次挥手断开连接的关键原因是,通信双方为了相互确认对方不再发送数据给自己了。为什么只需要确认不再发送信息而不需要确认接收信息呢?因为接收信息是对方自己可以完全处理的事情,不需要自己关心,而对方如果还需要发送信息,那必须等待对方发完,否则最终自己接收到的信息可能就是不完整的。
具体而言:
<FIN_WAIT1>
<FIN_WAIT2>
<LAST_ACK>
<TIME_WAIT>
<CLOSE>
为什么客户端最后需要在 <TIME_WAIT> 状态等待 2MSL 的时间呢?因为网络是不可靠的,最后一个 ACK 报文可能丢失到不了服务器。服务器在发送完最后一个 FIN 之后,如果在超时时间内没有收到客户端的 ACK,会重发一次 FIN 给客户端,客户端会再重发一个 ACK 报文并重新计时。如果客户端不等待 2MSL 直接进入关闭状态,那么服务器可能永远收不到最后的 ACK 报文了,也就无法进入关闭状态了。
目录
1 三次握手建立连接[Top]
关于 TCP 为什么需要三次握手建立连接、四次挥手断开连接,网上有很多标准的答案,很多讲的都非常不错。这里总结一下三次握手四次挥手中我认为最能帮助理解的原因分析。
先看一下三次握手建立连接的图示:
为什么需要三次握手呢?关键的原因是 通信双方为了相互确认对方收发信息的能力都是正常的。这也是 TCP 建立连接的目的。具体而言:
所以,经过以上三步,客户端和服务器都完全确认对方收发信息的能力都是正常的,连接建立成功,可以正常传输数据了。
2 四次挥手断开连接[Top]
先看一下四次挥手断开连接的图示:
需要四次挥手断开连接的关键原因是,通信双方为了相互确认对方不再发送数据给自己了。为什么只需要确认不再发送信息而不需要确认接收信息呢?因为接收信息是对方自己可以完全处理的事情,不需要自己关心,而对方如果还需要发送信息,那必须等待对方发完,否则最终自己接收到的信息可能就是不完整的。
具体而言:
<FIN_WAIT1>
状态。<FIN_WAIT2>
状态,即等待服务器 FIN 报文过来的第二个阶段。<LAST_ACK>
状态,即等待最后确认状态。<TIME_WAIT>
状态,在这个状态下,需要等待 2MSL 时间(2个最大报文生存时间)后最终进入<CLOSE>
状态。同时向服务器发送最后一个 ACK 确认报文。为什么客户端最后需要在
<TIME_WAIT>
状态等待 2MSL 的时间呢?因为网络是不可靠的,最后一个 ACK 报文可能丢失到不了服务器。服务器在发送完最后一个 FIN 之后,如果在超时时间内没有收到客户端的 ACK,会重发一次 FIN 给客户端,客户端会再重发一个 ACK 报文并重新计时。如果客户端不等待 2MSL 直接进入关闭状态,那么服务器可能永远收不到最后的 ACK 报文了,也就无法进入关闭状态了。