来源:CSNA >网络分析论坛
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 的建立连接、传输数据和关闭连接三个过程的抓包分析,成功的验证
了前面所说的理论。
我通过上边的数据相比其他的TCP说明还是有了一些了解,但可能实验中数字太大,不容易分析,现在把蔡老师的图上上,也许会更好理解一些。
我就不再做说明了,上边的原理已经很清楚了。
转载于:https://blog.51cto.com/xingxia/1210528