最近在面试被这两个问题整的有点懵逼,在这里写一些个人的理解
为什么是三次挥手
从接收和发送能力来考虑,双方都得知道对方的接收能力和发送能力是否正常。
客户端得确认:对方的接包能力和收到能力是否正常。
服务端得确认:对方的接包能力和收到能力是否也正常。
第一次客户端发送报文,这个时候双方都不知道对方的收送能力。
服务端接收到报文,返回确认报文,这个时候服务端知道了客户端的发送能力正常。
客户端收到确认报文,知道了服务端的接收和发送能力都是正常的,但是服务端是不确定客户端的接收能力是否正常,所以客户端需要在发生一个报文给服务端,证明自己的发送能力是正常的。
另外一个解释是从网络延迟角度来考虑
第一次报文在网络中延迟,客户端会发送第二次报文,建立连接和断开连接后,如果这个报文发送到了服务端,那么就会以为客户端又要建立连接
为什么是4次握手
数据的传输是双工的,双方都得让对方知道自己的数据传输完了,知道对方数据传输完了才可以进行关闭。
客户端要确定的事情:对方的数据是否传输完毕,我没有数据要传输这件事对方是否知道?
服务端要确认的事情:对方的数据是否传输完毕,我没有数据要传输这件事对方是否也知道?
第一次客户端发送报文,服务端接收到报文,服务端知道了客户端的数据已经传输完毕了,发送确认报文,这个确认报文用于表示"我知道了你的数据已经传完了,但我还有一些数据没有传完"。
客户端接收到确认报文,知道了服务端的数据还没有传输完成,送达了自己没有数据要传输这件事。
服务端再次发送报文,表示自己的数据已经传输完全了,客户端接收到报文,确定了对方数据传完了,但是服务端还不知道自己没有数据要传输这件事对方是否知道,所以客户端需要再次发送一个报文去告诉服务端我收到了你的消息。