TCP三次连接和四次断开

www.net130.com     日期:2012-7-19    浏览次数:
来源:CSNA '; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">网络分析论坛

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页,当前在第1页  1  2  3  

分享道
相关新闻