TCP在建立连接时,会进行三次握手,流程如图1所示:
![](https://i-blog.csdnimg.cn/blog_migrate/908e2c28e8fd45fdf4c52b558e8b1a61.png)
3次握手的主要目的是初始化Sequence Number 的初始值及协商一些通信双方的通信参数。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)。SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
第一步:Client首先向Server发送了SYN,seq为x,
第二步:Server向Client回复了SYN + ACK,seq为y,ACK为x+1,其中x为Client的seq
第三步:Client向Server发送ACK,值为y+1,其中,y为第二步Server的seq
其中,第一步及第二步是告知对方各自的起始seq,第三步是链接请求方向对方发送收到其SYN+ACK的确认包ACK。此时,你就会疑惑,如果第三步的ACK丢了怎么办,那么Server没有收到ACK,它并不知道Client是否有收到其SYN+ACK。那么你可能会想,Server收到ACK后,在回一个确认包,如果这样,那么Client在收到这个包后,是否还应该回复一个包?这样就陷入的无穷无尽的交互中。为了打破这种情况,于是将握手次数定为3。
通过 Wireshark 对三次握手进行抓包,如下图2所示:
![](https://i-blog.csdnimg.cn/blog_migrate/9443c0ebc7562b7001c97baee92195a4.jpeg)