一、概要
Sequence Number设计中的一个基本概念是,所有通过 TCP 连接发送的数据字节都有一个序列号。由于每个字节都是有序的,因此每个字节都可以被确认。所采用的确认机制是累积性的,因此,对序列号 X 的确认表示所有不包括 X 的字节都已被接收。这种机制使得在重传的情况下可以方便地进行重复检测。段内字节的编号规则是,紧接着头部的第一个数据字节是最低编号的,后续字节按顺序编号。
实际的序列号空间是有限的,尽管非常大。该空间范围从 0 到 2^32 - 1。由于空间是有限的,所有涉及序列号的算术运算都必须以2^32为模进行。这种无符号算术运算保留了序列号之间的关系,使其在从2^32 - 1 循环到 0 时仍然保持一致。计算机的模运算有一些细微之处,因此在编程比较这些值时需要特别小心。符号 "=<" 表示 "小于或等于"(mod 2^32)。
二、序列号说明
TCP 必须执行的典型序列号比较包括:
(a) 确定一个确认是否指向某个已发送但尚未确认的序列号。
(b) 确定一个段占用的所有序列号是否已被确认(例如,移除重传队列中的该段)。
(c) 确定一个传入段是否包含预期的序列号(即,该段是否“重叠”接收窗口)。
在发送数据后,TCP 将接收到确认。处理确认时需要进行以下比较:
-
SND.UNA = 最早未确认的序列号
-
SND.NXT = 下一个要发送的序列号
-
SEG.ACK = 来自接收 TCP 的确认(接收 TCP 预计的下一个序列号)
-
SEG.SEQ = 段的第一个序列号
-
SEG.LEN = 段中数据占用的字节数(包括 SYN 和 FIN)
-
SEG.SEQ + SEG.LEN - 1 = 段的最后一个序列号
一个新的确认(称为“可接受的确认”)是指满足以下不等式的确认:
SND.UNA < SEG.ACK =< SND.NXT
如果一个段在重传队列中的序列号和长度之和小于或等于传入段中的确认值,则该段被完全确认。
当数据被接收时,需要进行以下比较