浅谈TCP三次握手和四次挥手

时间:2022-12-04 23:32:53

学习三次握手和四次挥手前,先了解下几个基础的概念。

Seq:数据段序号,我们都知道TCP是提供有序传输的,有序传输的基础就是数据段序号,接收方在收到发送方乱序包的情况下可以根据Seq进行重新排序,确保接收的数据是正常的。

Len:数据段长度,数据段长度不包括TCP头部,就是TCP除头部以外的内容,比如涵盖的HTTP数据。

Ack:确认号,即接收方向发送方确认自己收到的数据。

用wireShark来看看一个TCP传数据的过程图,认识下这几个概念。

浅谈TCP三次握手和四次挥手

除了如上几个概念外,在截图中的方括号内还有SYN、ACK这几个标记位需要了解下,这些标记位是存在TCP头中的。

SYN:建立连接

FIN:释放连接

RST:重置连接

PSH:尽可能快的将数据送往接收进程

还有ACK(确认序号有效)和URG(紧急指针域有效)。

理解了这些概念,咱们再通过wireShark来理解三次握手。

浅谈TCP三次握手和四次挥手

1、  客户端携带SYN标记,初始序号Seq为X(开启了相对序号时如图中所示为0),请求与服务端建立连接,服务端同意后麻烦Ack=X+1;

2、  服务端收到请求后,同意建立连接,Ack为X+1,同时也请求与客户端建立连接(SYN),初始序号为Y,麻烦客户端同意后也请Ack=Y+1;

3、  客户端收到请求后,同意连接,Ack为Y+1,序号为X+1。

示意图如下:

浅谈TCP三次握手和四次挥手

再来理解下四次挥手,按照各路教材及大师的作品过程和示意图是这样的。

1、客户端向服务端发起请求断开连接,携带FIN标记,Seq为X,请求与服务端断开连接,服务端同意后麻烦Ack=X+1;

2、服务端收到请求后,Ack=X+1,断开连接;

3、服务端也向客户端发起请求断开连接,携带FIN标记,Seq为Y,请求与客户端断开连接客户端同意后麻烦Ack=Y+1;

4、客户端收到请求后,Ack=Y+1,断开连接;

浅谈TCP三次握手和四次挥手

但是我用wireShark抓到的包却是这样的。抓取了一下午都抓不到如上的过程。

浅谈TCP三次握手和四次挥手

对于这样的场景,我只能怀疑是不是服务端做了优化,所以我又找了局域网下的两台电脑做了下测试发现结果还是这样的。

浅谈TCP三次握手和四次挥手

对于这样的结果,求交流。