TCP序列号和确认号详解
在网络分析中,读懂TCP序列号和确认号在的变化趋势,能够帮助咱们学习TCP协议以及排查通信故障,如经过查看序列号和确认号能够肯定数据传输是否乱序。但我在查阅了当前不少资料后发现,它们大多只简单介绍了TCP通信的过程,并无对序列号和确认号进行详细介绍,结合实例的讲解就更没有了。近段时间因为工做的缘由,须要对TCP的序列号和确认号进行深刻学习,下面即是我学习后的一些知识点总结,但愿对TCP序列号和确认号感兴趣的朋友有必定帮助。
1. 序列号和确认号的简介及做用
TCP 协议工做在OSI的传输层,是一种可靠的面向链接的数据流协议,TCP之因此可靠,是由于它保证了传送数据包的顺序。顺序是用一个序列号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序列号的包。在TCP传送一个数据包时,它会把这个数据包放入重发队列中,同时启动计时器,若是收到了关于这个包的确认信息,便将此数据包从队列中删除,若是在计时器超时的时候仍然没有收到确认信息,则须要从新发送该数据包。另外,TCP经过数据分段中的序列号来保证全部传输的数据能够按照正常的顺序进行重组,从而保障数据传输的完整。
2. TCP的通信过程
在TCP通信中主要有链接的创建、数据的传输、链接的关闭三个过程!每一个过程完成不一样的工做,并且序列号和确认号在每一个过程当中的变化都是不一样的。
2.1 TCP创建链接
TCP创建链接,也就是咱们常说的三次握手,它须要三步完成。在TCP的三次握手中,发送第一个SYN的一端执行的是主动打开。而接收这个SYN并发回下一个SYN的另外一端执行的是被动打开。
这里以客户端向服务器发起链接来讲明。
1) 第1步 :客户端向服务器发送一个同步数据包请求创建链接,该数据包中,初始序列号(ISN)是客户端随机产生的一个值,确认号是0;
2) 第2步 :服务器收到这个同步请求数据包后,会对客户端进行一个同步确认。这个数据包中,序列号(ISN)是服务器随机产生的一个值,确认号是客户端的初始序列号+1;
3) 第3步 :客户端收到这个同步确认数据包后,再对服务器进行一个确认。该数据包中,序列号是上一个同步请求数据包中的确认号值,确认号是服务器的初始序列号+1。
注意 :由于一个SYN将占用一个序号,因此要加1。
初始序列号(ISN)随时间而变化的,并且不一样的操做系统也会有不一样的实现方式,因此每一个链接的初始序列号是不一样的。TCP链接两端会在创建链接时,交互一些信息,如窗口大小、MSS等,以便为接着的数据传输作准备。
RFC793指出ISN能够看做是一个32bit的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在之后被重复传输,而致使某个链接的一端对它做错误的判断。
2.2 TCP传输数据
在TCP创建链接后,就能够开始传输数据了。TCP工做在全双工模式,它能够同时进行双向数据传输。这里为了简化,咱们只谈服务器向客户端发送数据的状况,而客户端向服务器发送数据的原理和它是相似的,这里便不重复说明。
服务器向客户端发送一个数据包后,客户端收到这个数据包后,会向服务器发送一个确认数据包。
传输数据的简要过程以下:
1) 发送数据 :服务器向客户端发送一个带有数据的数据包,该数据包中的序列号和确认号与创建链接第三步的数据包中的序列号和确认号相同;
2) 确认收到 :客户端收到该数据包,向服务器发送一个确认数据包,该数据包中,序列号是为上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+所该数据包中所带数据的大小。
数据分段中的序列号能够保证全部传输的数据按照正常的次序进行重组,并且经过确认保证数据传输的完整性。
2.3 TCP关闭链接
前面咱们提到,创建一个链接须要3个步骤,可是关闭一个链接须要通过4个步骤。由于TCP链接是全双工的工做模式,因此每一个方向上须要单独关闭。在TCP关闭链接时,首先关闭的一方(即发送第一个终止数据包的)将执行主动关闭,而另外一方(收到这个终止数据包的)再执行被动关闭。
关闭链接的4个步骤以下:
1) 第1步 :服务器完成它的数据发送任务后,会主动向客户端发送一个终止数据包,以关闭在这个方向上的TCP链接。该数据包中,序列号为客户端发送的上一个数据包中的确认号值,而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小;
2) 第2步 :客户端收到服务器发送的终止数据包后,将对服务器发送确认信息,以关闭该方向上的TCP链接。这时的数据包中,序列号为第1步中的确认号值,而确认号为第1步的数据包中的序列号+1;
3) 第3步 :同理,客户端完成它的数据发送任务后,就也会向服务器发送一个终止数据包,以关闭在这个方向上的TCP链接,该数据包中,序列号为服务器发送的上一个数据包中的确认号值,而确认号为客户端发送的上一个数据包中的序列号+该数据包所带数据的大小;
4) 第4步 :服务器收到客户端发送的终止数据包后,将对客户端发送确认信息,以关闭该方向上的TCP链接。这时在数据包中,序列号为第3步中的确认号值,而确认号为第3步数据包中的序列号+1;
注意 :由于FIN和SYN同样,也要占一个序号。理论上服务器在TCP链接关闭时发送的终止数据包中,只有终止位是置1,而后客户端进行确认。可是在实际的 TCP实现中,在终止数据包中,确认位和终止位是同时置为1的,确认位置为1表示对最后一次传输的数据进行确认,终止位置为1表示关闭该方向的TCP链接。
3. 实际数据包分析
结合上面的理论,下面咱们访问网页来捕获数据包,经过实际的数据包来验证序列号和确认号在TCP链接创建、传输数据以及关闭链接时的变化。
打开科来网络分析系统,首先为减小数据干扰,在过滤器中设置只捕获TCP协议的数据,而后开始捕获,同时,访问www.csna.cn ,待页面下载完成后,中止捕获。
这次环境中,客户端为192.168.0.92,服务器为:222.77.187.23。
3.1 TCP创建链接
在捕获的数据包中,首先咱们来查看创建链接的三次握手信息,而且观察数据包中序列号和确认号的变化。为了让你们看的更加明白,我在这里使用了“添加数据包注释”的功能。
咱们先来查看创建链接的第一步,如图1所示。
(图1 创建链接第一步)
图1中,客户端向服务器发起一个同步请求数据包,请求链接服务器的80端口,客户端随机产生一个初始序列号(ISN)为2712239078,确认号为0。
注意 :在实际状况中,咱们访问网站首先进行的是域名解析,这里咱们设置了过滤器因此没有捕获到DNS数据包。
接下来咱们再看创建链接的第二步。如图2。
(图2 创建链接第二步)
图2 中,服务器收到客户的同步请求数据包后,并向客户端发送一个同步确认数据。这个数据包中,服务器随机产生一个初始序列号(1288781508),同时,将客户端发送的初始序列号(ISN)加1(2712239078+1=2712239079)以做为确认号发回给客户段进行确认。
咱们再来查看创建链接的第三步,以下图3。
(图3 创建链接第三步)
图3 中,客户端收到这个同步确认数据包后,再次对服务器进行一次确认。在这个数据包中,序列号为上一个数据包的确认号(2712239079),确认号为服务器的初始序列号(ISN)加1(1288781508+1=1288781509),以对服务器的同步确认数据包进行确认,这样TCP链接就创建了。
3.2 TCP传输数据
TCP链接创建后,立刻就开始传输数据,这里客户端主动向服务器发送一个GET请求,来提交本身的请求信息。
下面咱们就来看客户端发送给服务器的GET请求数据包,如图4所示,
(图4 传输数据)
图4中的是客户端向服务器发送的GET请求据数据包,咱们注意看序列号和确认号的值!该数据包中,序列号为2712239079,确认号为1288781509,这和三次握手的第三步的数据包中的序列号和确认号相同。
从图4中看出这个数据包的大小为1018字节,其中减去14字节Ethernet报头,20字节的IP报头,20字节的TCP报头和4字节的FCS (1018-14-20-20-4=960),获得传输的数据大小为1432。咱们将该数据包中的序列号加上该数据大小(即2712239079+960 =2712240039),发现与“下一个序列号”的值彻底吻合,也就是下一个数据包中服务器发送给客户端的数据包中的确认号,如图5所示。
(图5 确认收到)
注意 :“下一个序列号”是科来网络分析系统为了方便用户查找下一个连续数据包,而根据数据包序列号和确认号自动计算得出,该字段在实际数据包中是不存在的。
3.3 TCP关闭链接
在传输数据完成以后,TCP会关闭链接,这里是服务器主动关闭该方向上的TCP链接。咱们继续来观察捕获的数据包,先来看关闭链接的第一步,这里是服务器主动发起关闭,如图6。
(图6 关闭链接第一步)
图6 中,服务器向客户端主动发起确认位和终止位同时置为1的数据包,确认位置1表示对最后一次传输的数据进行确认,终止位置1表示关闭该方向的TCP链接,关闭服务器和客户端的TCP链接。在这个数据包中,序列号为客户端发送的上一个数据包中所带的确认号值(1288781777),而确认号为服务器发送的上一个数据包中的序列号+该数据包所带的数据的大小(2712238597+1432=2712240039);
而后客户端收到该终止数据包,会对服务器发送一个确认数据包,该数据包中,序列号为第1步中的确认号值(2712240039),而确认号为第1步的数据包中的序列号+1(1288781777+1=1288781778);
咱们注意观察序列号和确认号的变化状况,如图7所示。
(图7 关闭链接第二步)
随后,就是来自客户端被动发起的关闭,它与服务器主动发起的关闭同理,只不过此次是被动关闭客户端方向上的TCP链接,咱们就不重复说明,如图8和图9所示。
(图8 关闭链接第三步)
(图9 关闭链接第四步)
咱们根据以上对TCP的创建链接、传输数据和关闭链接三个过程的抓包分析,成功的验证了前面所说的理论。api