我们知道,TCP有如下特性:
- TCP不断从应用程序层接收数据。
- 它将数据分为多个块,其中每个块都是一系列字节为单位的数据块集合。
- 然后,通过向数据块中添加TCP标头来创建TCP段。
在本文中,我们将讨论TCP序列号。
TCP序列号
- 发送方发送的每个TCP段都包含一些字节的数据。
- TCP为每个数据字节分配一个唯一的编号以进行标识。
- 此唯一编号称为TCP序列号。
目的
序列号用于以下目的:
- 它有助于唯一地标识每个数据字节。
- 它有助于将数据分段为TCP分段,并在以后重新组装它们。
- 它有助于跟踪已传输和接收了多少数据。
- 如果以错误的顺序接收到数据,则有助于将数据放回正确的顺序。
- 当数据在传输中丢失时,它有助于请求数据。
最大序列号数
- 在TCP标头中,序列号是一个32位字段。
- 因此,最大可能的序号数= 2^32^ 。
- 这些序列号在[0 , 2^32^ – 1].范围内。
注意
- 可能的序列号的最大数量= 2^32^。
- 这并不意味着使用TCP只能发送2^32^字节= 4 GB数据。
- 循环的概念允许使用TCP发送无限的数据。
循环的概念
循环状态的概念
当2^32^个 序列号全部用完之后,如果需要继续发送数据,序列号就翻过来从头开始使用。
一般来说,
- 如果选择的初始序列号是X。
- 然后使用从X到2^32^ – 1,然后从到0到X-1的序列号。
- 然后,将序列号包裹起来以发送更多数据。
例
- 考虑使用的初始序列号为0。
- 然后,在发送4 GB数据后,所有序列号都会用完。
- 要发送更多数据,请从头开始重用序列号。
- 可以一次又一次地包装,以发送越来越多的数据。 循环时间-**
- 耗尽所有2^32^个序列号所花费的时间称为循环时间。
- 它取决于网络的带宽,即字节流出的速率。
- 带宽越大,循环时间越短,反之亦然。
循环时间 ∝ 1 /带宽
公式
如果网络带宽= x字节/秒,则
TCP网段的生命周期
在现代计算机中:
- TCP段的生存时间为180秒或3分钟。
- 这意味着在发送TCP段之后,在最坏的情况下可能需要3分钟到达接收方。
TCP序列号为什么可以循环?
TCP可以循环序列号,因为
- 每一个TCP段的寿命仅为180秒。(注意,不是TCP的会话寿命,是TCP发出去的每一个数据块。)
- 循环时间远大于TCP段的生存时间。
- 因此,当序列号循环时,就不可能存在任何具有相同序列号的段。
- 因此,即使在循环之后,所有字节的序列号在任何给定时间都是唯一的。
减少循环时间
循环时间可以减少到与TCP段的生命周期相同。
这是因为
- TCP段的使用寿命结束后,可以认为该段不再存在。
- 因此,该段使用的序列号将释放并可以重复使用。
为了实现上述内容:
- 序列号的数量必须与段中的生存时间相等。
公式
为了使循环时间等于TCP段的生命周期。
序列号字段中所开启的bit值=log~2~ (TCP段的生命周期x带宽)
- 位数将大于32位。
- 额外的位将附加在TCP标头的“选项”字段中。
TCP中基于序列号循环时间的实践问题
问题01:
给定网络带宽为1 MB /秒。计算循环时间。
答案
我们知道,
- 循环时间=使用所有2^32^个序列号所需的时间。
- TCP为数据的每个字节分配一个序列号。
要计算循环时间,我们只需要计算发送2 个32字节数据将花费多少时间。
现在,
- 给定带宽= 1 MB /秒= 10 6字节/秒。
- 这意味着10个6字节的数据在1秒钟的时间内发送。
- 因此,将在时间=(1/10^6^)x 2^32^秒中发送2^32^字节的数据。
- 答案决后,我们得到1.19个小时。
从而,
- 如果带宽= 1 MB /秒,将花费1.19个小时来消耗所有2^32^个序列号。
- 循环时间= 1.19小时。
或者,
使用公式,我们有
循环时间
= 2^32^ /10^6^秒
= 1.19小时
问题02:
如果网络带宽为1 GBps,那么必须在“选项”字段中添加多少个额外的位,以使循环时间等于网段的生存时间?
答案
为了使循环时间等于TCP段的生存时间,
所需的序列号数= TCP段生命周期内发送的字节数
我们知道
- TCP段的生存时间= 180秒。
- 网络带宽= 1 GBps(给出)
现在,
- 1秒内传输的字节数= 1 GB
- 因此,在180秒内传输的字节数= 180 GB = 180 x 2^30^字节
- 因此,所需的序号数量= 180 x 2^30^
假设需要序列号字段中的y个位数来表示值180 x 2^30^。
因此,我们有
2^y^ = 180×2^30^
ylog2 = log(180 x 2^30^)
y =log~2~(180 x 2^30^)
y = log~2~180 +log~2~ 2^30^
y = 7.49 + 30
y≅38
从这里,
- 序列号所需的总位数= 38位。
- 在TCP标头中,序列号字段是一个32位字段。
- 因此,需要在“选项”字段中附加额外的位= 38 – 32 = 6位。
或者,
使用公式,我们有
所需总位
=log~2~(TCP段的寿命x带宽)
=log~2~(180 x 2^30^)
=log~2~180 +log2 2^30^
= 7.49 + 30
= 38
从这里,
- 序列号所需的总位数= 38位。
- 在TCP标头中,序列号字段是一个32位字段。
- 因此,需要在“选项”字段中附加额外的位= 38 – 32 = 6位。
问题03:
在最大TPDU大小为128字节,最大TPDU寿命为30秒和8位序列号的网络中,每个连接的最大数据速率是多少?
(TPDU是作为该段的传输层协议数据单元。)
答案
鉴于
- 最大段大小(MSS)= 128字节
- 段寿命= 30秒
- 序列号中的位= 8
现在,
- 使用8位= 2^8^ = 256的最大可能序列号数。
- 因此,可以唯一标识的最大字节数= 256个字节。
- 段的生命周期= 30秒。
- 因此,可以在30秒内发送的最大数据量= 256个字节。
从而,
每个连接的最大数据速率
= 256字节/ 30秒
≈68位/秒
问题04:
假设宣告窗口的长度为1 MB。如果从整个序列号空间中随机选择一个序列号,那么该序列号落在宣告窗口内的概率是多少?
答案
我们知道,
- 序列号字段中的位数= 32位。
- 因此,最大可能的序列号数= 2^32^。
- 这些序列号可以唯一地标记2^32^字节的数据。
- 宣告窗口大小= 1 MB = 2^20^字节,使用2^20^个 序列号。
因此,所需概率
= 2^20^ / 2^32^
= 1/2^12^