跳至主要內容

三次握手与四次挥手

yyshino大约 3 分钟

photo_2023-03-30_20-10-24
photo_2023-03-30_20-10-24
photo_2023-03-30_20-10-51
photo_2023-03-30_20-10-51
photo_2023-03-30_20-10-56
photo_2023-03-30_20-10-56
photo_2023-03-30_20-11-00
photo_2023-03-30_20-11-00

三次握手与四次挥手,虽然我工作中目前还没有涉及网络编程这一方面的东西,但是难免面试老是要被问到,算是个高频的必备知识点了。

三次握手,目的有3个。

**第一个目的是为了防止在网络阻塞时,历史连接乱入,导致造成混乱。**如果是两次握手,则在第二次握手时不加以校验,服务端与一个旧的连接建立通信。有了三次握手,能够在第二次握手时校验,校验成功则正常进行第三次握手,否则发送RST信号。

**第二个目的是为了同步双方的初始化序列号。**从这个层面上来说,可以把3次握手看作是4次握手的精简版,即两轮SYN-ACK,各自发送SYN并接收应答信号。只不过中间第二次握手的应答和第三次握手的SYN可以合二为一。(相较于4次挥手,由于被动方可能还有数据要发送,所以FIN和ACK必须分离,所以是4次)

**第三个目的是为了避免资源的浪费。**在网络阻塞情况下,客户端可能多次发送SYN请求,如果只有两次握手,由于服务端无法得知客户端是否接受到ACK信号并建立起连接,只能在每次接受到SYN信号时都主动建立一个连接。故在SYN冗余情况下,重复分配资源,造成浪费。而三次握手的机制得以在第二次握手时进行校验,校验成功通过第三次握手应答后才建立起连接,避免了资源浪费。

四次挥手,原因是上面目的二提到的,通信双方其中一方主动请求断开连接时,另一方可能还有数据要发送,故需要把被动方的ACK和FIN分开成两次挥手。

主动发起断连的一方会有TIME_WAIT的状态,需要等待2MSL,原因是:一方面,等待足够长的时间,能够让滞留在网络中的历史数据消失,以至于下一次在相同端口建立TCP连接时,旧数据不至于在握手时造成数据混乱。另一方面,2MSL确保被动关闭连接的一方能够被正确关闭。因为第四次挥手的ACK信号可能由于网络阻塞或数据丢失而没到达被动方,被动方将一直处于LAST_ACK的状态。本来会有个超时重发机智,重新进行第三次挥手发送FIN信号,重新等待接收四次挥手的ACK,但如果主动关闭方老早就断连了,则永远没人处理重发的信号,被动方永远等在LAST_ACK。

而2MSL正好是第三次挥手和第四次挥手的往返时间之和

转自https://t.me/https1024/11474