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

TCP协议的一些知识

TCP(Transmission Control Protocol) 传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

三次握手的过程

  • 第一次握手:主机A发送位码为syn=1,随机产生seq number=1000的数据包到服务器,主机B由SYN=1知道,A要求建立联机
  • 第二次握手:主机B收到主机A发送的请求后,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=2000的包
  • 第三次握手:主机A收到主机B发送的请求后,想B发送ack number=(主机B的seq+1),主机B收到后,A与B建立连接成功

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

 小结

 想必上面的过程很多人都是知道的,但是TCP为什么一定要是三次握手,而不是二次或者四次握手呢,或者换句话来问,tcp三次握手,到底握的是什么,也就是互相交换了什么信息呢

TCP握手的本质(一句话)

 TCP握手的本质其实很简单,就是主机A和主机B互相交换seq(Sequence Number),同时双方记录对方的seq

TCP传输的精髓 

TCP连接的一方A,由操作系统动态随机选取一个32位长的***(Initial Sequence Number)作为seq,假设A的初始***为1000,以该***为原点,对自己将要发送的每个字节的数据进行编号,1001,1002,1003…,并把自己的初始***ISN告诉B,让B知道什么编号是合法的,什么是不合法的,同时B也可以对每一个编号的数据进行确认.如果A收到B的ack是2001,说明从1001到2000,这些字节已经成功抵达,B的操作同理

说一下为什么不能是二次握手或者是四次握手呢

 这里我们模拟一下二次握手的过程

  • 第一次握手:主机A发送位码为syn=1,随机产生seq number=1000的数据包到服务器,主机B由SYN=1知道,A要求建立联机
  • 第二次握手:主机B收到主机A发送的请求后,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=2000的包,同时保存主机A的初始编***ISN,也就是主机A发送过来的seq number = 1000

这时就出现了问题,因为主机A并没有给主机B回复是否接收成功seq,所以B并不知道A是否成功接收到了自己给A发送的自己的初始序号ISN,如果B给A发的第二次握手数据在中途丢失,那么主机A与主机B就无法就seq达成一致,也就无法进行数据的传输