TCP 三次握手和四次挥手,其实都是一个机制在帮忙,即“一说一听”的双向确认。
开始通信时,为什么要三次握手?
服务器:SYN
客户端:ACK-SYN
服务器:ACK
SYN 都是在说:我能发送。
ACK 都是在说:我能接收。
所以这个过程,就是两个人在先后确认:
你能听到吗?(我能说)
我能听到。(我能收)你呢?(我也能说)
我也能听到。(我也能收)
这和攀岩时的搭档确认,是几乎一样的,双方都不能要么聋、要么哑,更不能又聋又哑。这里的服务器和客户端,其实可以替换成任意两个个体。
结束通信时,为何变成了四次挥手?这里直接用甲、乙取代:
甲:FIN(我说完了)
乙:ACK(收到,你说完了)
乙:FIN(我也说完了)
甲:ACK(收到,你也说完了)
变成四次的唯一原因是,乙确认甲说完,与自己决定说完,是两件独立的事,所以通常分开。如果乙在确认时,也已经准备好结束自己的发送,那照样能压缩成三步:
甲:FIN
乙:ACK-FIN
甲:ACK
看到吗,仅仅是用 FIN 替换了通讯开始时的 SYN,模式是完全一样的。