三次握手
为什么需要三次握手,网上有很多的资料解释,各种试图使用故事、比喻来达到通俗易懂的效果,然而并未触及核心。故事看着挺有道理,但依然不能解决疑惑。最终看到让人心悦诚服的回答就是一句话 因为 TCP 是双向通讯协议,作为响应一方(Responder) 要想初始化发送通道,必须也进行一轮 SYN + ACK
。TCP 为什么是三次握手,而不是两次或四次? - 安江泽的回答
A需要与B通信。 A 告诉B,我要与你通信,起始位置为xxx。 B 回复A 好的,我知道你的起始位置为xxx。 也就是两次握手足以让A向B发起通信。
然而tcp是双向通信协议,B也需要向A发起申请,因此还需要两次握手。
只不过出于优化的目的将B的回复和B对A的申请合并了而已。
因此,如果只需要单向通信,两次握手即可。
双向通信,三次握手是优化方案。
三次握手时的tcp报文
第一次握手:
客户端发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里
image.png
第二次握手 :
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即X+1。
image.png
第三次握手:
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1
image.png
四次挥手
本质还是双向通信导致的。
A告诉B我要停止发送信息了,你不用接受了,免得浪费系统资源。 B说好的,我知道你不会发数据给我了。但这个时候B 还是可以发送数据的,当然B要尽快完成发送,就像java中做些final的事情,然后说,我也没有数据要发送了,A你可以准备删除套接字了。 A回复B是好的,我知道你也不会发送数据了,我先关闭了(这里其实会等待一段时间,容错性设计)。