从第一次了解到TCP的连接方式到现在有一年半了,但好像一直没有把三次握手的由来弄透彻,解释上总有一些瑕疵在,现在来说说昨晚的思考。
对于一个通信链路,由于种种原因发送方发送的消息未必能传达到接收方,所以一条消息发送出去了,但没人回,有两种情况:一是数据没有传送成功,二是传送成功但对方没有立即回应。当我们规定,在试探链路时,发送的消息必须回应,这样如果发送方依然没有收到回应,则可以判断是链路出了问题,如果收到回应说明链路可通,可以安心发送了。(所以叫你一声你要答应才礼貌)
但这只是单向发送,作为被接收的一方只是发送了一个应答,站在它的角度,它能接收对面来的消息说明来路可通,但并不知道去路是否可通。而如果发送方收到应答后,此时该方知道来去路都是通的(establish),所以它还需要把这个消息告诉对方,让对方也放心。
所以三次握手的本质是在一开始确立全双工的关系。同样四次挥手也是如此,只不过分解成了两次应答,让先发送完的一方先告知对方自己已发完,但对方未必发完,所以只好分开确认。如果两边速度完全一样则也可以合并成三次挥手。
除此之外还有双方默认消息在一定时间内没有回应为此时链路不通,重新改送,多次发送不通则失败,所以收到对方的重复消息说明我方刚才的消息没有送到,需重发。(与三次握手的思想不冲突,柔和在一起形成基本通信协议)