三次握手

简单理解

三资握手的目的是:确认自己的接收能力和发送能力OK,还要确认对方的接收能力和发送能力OK;

  1. A发送给B,B收到了; B知道自己的接收能力OK,对方的发送能力OK;
  2. B回复给A,A收到了; A知道自己的接收能力OK,自己的发送能力OK,对方的接收能力OK,对方的发送能力OK;(但是B还不知道自己的发送能力和A的接收能力是否OK,所以需要第三次握手)
  3. A发送给B,B收到了; B知道自己的发送能力OK;A的接收能力OK;

状态机

三次握手

为什么建链接要三次?

保证能成功通知对方自己的ISN(Initial Sequence Number,这个ISN是作为自己以后数据通信的序号)。

主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。

如何保证数据到达

数据重传机制

示例

客户端:C (192.168.103.34)
服务端:S (14.18.201.48)

第一次握手:
首先C发起连接请求 [syn] Seq=2070720725
C进入SYN_SEND状态;

第二次握手:
接着S收到请求后,返回 [syn ack] Seq=3747916590 Ack=2070720726
S进入SYN_RECV状态;

第三次握手:
C收到S返回的信息,验证成功后返回确认信息 [ack] Seq=2070720726 Ack=3747916590
C进入ESTABLISH状态。S收到后也进入ESTABLISH状态。

注意:wireshark默认显示的sequence number是相对的数字 ,可以通过如下图的方式取消

参考资料