TCP 为什么是三次握手,为什么不是两次或四次?

关注者
1863
被浏览
263775

115 个回答

TCP 实现可靠的传输协议,是靠 seq 确认完成的。因此建立一个可靠的单向通道需要至少一次 SYN 和 ACK 完成 seq 的确定,并且在今后的通讯中依靠 ACK seq(+1) 来确保发送成功。事实上作为连接发起方,在 SYN_SENT 后如果收到确认 ACK, 那么既进入 ESTABLISHED 状态。因此下图是错误的:


靠谱的状态转换看这个图:


而之所以存在 3-way hanshake 的说法,是因为 TCP 是双向通讯协议,作为响应一方(Responder) 要想初始化发送通道,必须也进行一轮 SYN + ACK。由于 SYN ACK 在 TCP 分组头部是两个标识位,因此处于优化目的被合并了。所以达到双方都能进行收发的状态只需要 3 个分组。

所以实际上理解成两次(单向通讯)和四次(不考虑合并)也未尝不可。
三次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,今天balabala……”

两次握手:
“喂,你听得到吗?”
“我听得到呀”
“喂喂,你听得到吗?”
“草,我听得到呀!!!!”
“你TM能不能听到我讲话啊!!喂!”
“……”


四次握手:
“喂,你听得到吗?”
“我听得到呀,你听得到我吗?”
“我能听到你,你能听到我吗?”
“……不想跟傻逼说话”