TCP 三次握手

学会表达和表达清楚、及表达得漂亮,我始终觉得是门技术和艺术。

非专业科班出生,面试时也是吃过 TCP 三次握手,及四次挥手的亏,看了又忘,忘了又看,始终不能深刻记忆。要想深刻记忆,要学会找方法和动脑子思考。我来讲一下我对 TCP 三次握手的理解。

第一次

客户端发送 seq=j 的 sync 包到服务器。

第二次

服务端收到 sync 包后,回复 ack=j+1,及 seq=k 的 syn 给客户端。

第三次

客户端收到 sync 包后,回复 ack=k+1 的sync 包给服务端。就此建立连接。

总结

客户端与服务端建立 TCP 连接时,发送真正数据之前的三次握手通信。为什么发送数据之前要进行三次握手呢?又为什么不是四次握手呢?

seq=j 相当于问对方你准备好了吗,ack=j+1 表示我准备好了。

假如同学 a 和同学 b 要相互给东西(比如矿泉水,方便面啥的)。
第一次,a 问b:“你准备好了吗?”,
第二次,b 听到后,回复 a 说:“我准备好了,你准备好了吗?”,
第三次,a 听到后,回复 b 说:“我也准备好了。”
然后 a、b 都伸出一只手做好准备接东西的状态,另一只手也都可以相互可以扔东西了。此时,双方算是 TCP 连接建立完成了。

说白了,就是问一下对方准备好没?然后回复一下 准备好了。这就是一问一答,算 2 次传递消息。一问一答只能确定一方准备好了,因为是相互传数据,所以也需要询问另一方准备好没,因为第 2 次回复给客户端时,可以顺带问客户端准备好没,所以TCP连接是三次,而不是四次。