tcp 三次握手和四次挥手(一些思考)

建立 tcp 连接的时候需要 CS 双方进行“三次握手”(3-way-handshake),而断开连接的时候却需要“四次分手”。为什么会这样?

撇开技术,拥抱生活

个人的一些撇开技术上的一些思考。首先任何东西的设计都是从生活中来的,当你认识一个新的朋友的时候,你当然是想尽快的与他认识,而离开的时候会舍不得,也会慢一些。这也就是握手三次就赶紧认识吧,离别的时候不舍,进行了四次握手。

同样在建立连接的时候,每次握手都是有时间开销的,所以在保证建立的情况下越少越好。如果浏览网页当然是希望页面越快的展现出来越好。

你和你的女朋友分手,双方要和平分手。

你说“我们不合适,分手吧,以后我不会再联系你了”,对你而言,你已经告诉她你要主动关闭联系的通道,你不会再联系她了。但你在不把她拉黑的情况下是不能阻止接收她的联系的。

当她舍不得的时候,就会疯狂的给你发短信,给你发你们的回忆,此时,他是接收得到的,但是他不回应你。这样单向的通道就已经断开了,由于是两个人的事,你断了她并没有断,她还在疯狂的挽回。

当她冷静下来之后,知道无可挽回的时候,她会说“好的,我也不会再联系你了,祝好。”,之后你便不会再收到她的任何信息,此时,双向的通道就都已断绝了。

为什么不是两次

如果是两次的话,也就是 CLIENT 发送了一个 SYN 和 seq 序号,SERVER 发送了一个 SYN seq2 序号和 ACK。

两次,相当于只是一轮对话,并不是很可靠。你给了我一个序号 seq,我回你一个 ack,并且告诉你我想要 seq2,就完事了?就能保证可靠了吗?并不是说你要a,好的,我给你a,这就可以保证我们之间的通信是可靠的,只能说明我们之间是有可能继续的。通过第三次的握手,那就是说,你要a,好的我给你a,我要b,你给了我b,这样的话,就经历了相当于一轮半的对话:

第一轮、你要a,我响应你,给你a,我要b。完成

第半轮、你给我b。好的,完成。我(服务器)知道你的线路是稳定,可以继续传数据了。

为什么不是四次

三次握手,也就是一轮半下来,服务器方面基本可以确定你的线路是可靠的,再进行半轮完成第四次握手就没有什么必要了,而且握手是有时间开销的。

tcp 三次握手和四次挥手(一些思考)_第1张图片
三次握手与四次分手

从原理上看,其实建立的时候是完全可以进行四次握手的,把 SERVER 发送的 SYN 和 ACK 分两次发送不就行了。

四次挥手

至于四次分,没别的原因,仅仅因为 tcp 是全双工的。有一点需要认识到,这个“四次挥手”是由两个“两次挥手”组成的,也就是说是两组组成的。

为什么等2MSL?

客户端要等待最后一个ack确实到达了,如果没有收到的话server会再发一个fin的。

你可能感兴趣的:(tcp 三次握手和四次挥手(一些思考))