浅谈TCP三次握手和四次挥手
学习三次握手和四次挥手前,先了解下几个基础的概念。
Seq:数据段序号,我们都知道TCP是提供有序传输的,有序传输的基础就是数据段序号,接收方在收到发送方乱序包的情况下可以根据Seq进行重新排序,确保接收的数据是正常的。
Len:数据段长度,数据段长度不包括TCP头部,就是TCP除头部以外的内容,比如涵盖的HTTP数据。
Ack:确认号,即接收方向发送方确认自己收到的数据。
用wireShark来看看一个TCP传数据的过程图,认识下这几个概念。
除了如上几个概念外,在截图中的方括号内还有SYN、ACK这几个标记位需要了解下,这些标记位是存在TCP头中的。
SYN:建立连接
FIN:释放连接
RST:重置连接
PSH:尽可能快的将数据送往接收进程
还有ACK(确认序号有效)和URG(紧急指针域有效)。
理解了这些概念,咱们再通过wireShark来理解三次握手。
1、 客户端携带SYN标记,初始序号Seq为X(开启了相对序号时如图中所示为0),请求与服务端建立连接,服务端同意后麻烦Ack=X+1;
2、 服务端收到请求后,同意建立连接,Ack为X+1,同时也请求与客户端建立连接(SYN),初始序号为Y,麻烦客户端同意后也请Ack=Y+1;
3、 客户端收到请求后,同意连接,Ack为Y+1,序号为X+1。
示意图如下:
再来理解下四次挥手,按照各路教材及大师的作品过程和示意图是这样的。
1、客户端向服务端发起请求断开连接,携带FIN标记,Seq为X,请求与服务端断开连接,服务端同意后麻烦Ack=X+1;
2、服务端收到请求后,Ack=X+1,断开连接;
3、服务端也向客户端发起请求断开连接,携带FIN标记,Seq为Y,请求与客户端断开连接客户端同意后麻烦Ack=Y+1;
4、客户端收到请求后,Ack=Y+1,断开连接;
但是我用wireShark抓到的包却是这样的。抓取了一下午都抓不到如上的过程。
对于这样的场景,我只能怀疑是不是服务端做了优化,所以我又找了局域网下的两台电脑做了下测试发现结果还是这样的。
对于这样的结果,求交流。