TCP 的特点与 TCP 报文段

TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非常复杂的一个协议,后面的连接管理、可靠传输、流量控制和拥塞控制,全都要通过首部中的字段来实现。

真题考过首部各字段(2012)、序号和确认号的含义(2009、2016)以及首部最小长度(2021)。本页有两道错题:TCP 分割数据的单位(MSS),以及 32 位序号在高速链路上多久会用完。

机制

5.3.1 TCP 的特点

  1. TCP 是面向连接的传输层协议,TCP 连接是一条逻辑连接。
  2. 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是一对一的。
  3. TCP 提供可靠交付的服务,保证传送的数据无差错、不丢失、不重复且有序。
  4. TCP 提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此 TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
    • 发送缓存用来暂时存放以下数据:①发送应用程序传送给发送方 TCP 准备发送的数据;②TCP 已发送但尚未收到确认的数据。
    • 接收缓存用来暂时存放以下数据:①按序到达但尚未被接收应用程序读取的数据;②不按序到达的数据。
  5. TCP 是面向字节流的,虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅视为一连串的无结构的字节流。

TCP 和 UDP 在发送报文时所采用的方式完全不同。UDP 报文的长度由发送应用进程决定,而 TCP 报文的长度则根据接收方给出的窗口值和当前网络拥塞程度来决定。 若应用进程传送到 TCP 缓存的数据块太长,则 TCP 就把它划分得短一些再传送;若太短,则 TCP 也可等到积累足够多的字节后再构成报文段发送出去。

5.3.2 TCP 报文段

TCP 传送的数据单元称为报文段。TCP 报文段既可用来运载数据,又可用来建立连接、释放连接和应答。一个 TCP 报文段分为首部和数据两部分,整个 TCP 报文段作为 IP 数据报的数据部分封装在 IP 数据报中。其首部的前 20B 是固定的,TCP 首部最短为 20B,后面有 字节是根据需要而增加的选项,长度为 4B 的整数倍。

行(每行 32 位)字段(位数)
第 1 行源端口(16)· 目的端口(16)
第 2 行序号(32)
第 3 行确认号(32)
第 4 行数据偏移(4)· 保留(6)· URG · ACK · PSH · RST · SYN · FIN(各 1)· 窗口(16)
第 5 行检验和(16)· 紧急指针(16)
可变部分选项(长度可变)+ 填充

TCP 的全部功能体现在其首部的各个字段中,各字段意义如下(TCP 报文段首部中各字段的分析 2012 年考过):

  1. 源端口和目的端口。各占 2B,分别表示发送方和接收方使用的端口号。
  2. 序号(TCP 首部中序号、确认号的含义 2009、2016 年考过)。占 4B,范围为 ,共 个序号。TCP 连接中传送的字节流中的每个字节都要按顺序编号,序号字段值指的是本报文段所发送的数据的第一个字节的序号。例如,一报文段的序号字段值是 301,而携带的数据共有 100B,表明本报文段的数据的最后一个字节的序号是 400,因此下一个报文段的数据序号应从 401 开始。
  3. 确认号。占 4B,是期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 ,则表明到序号 为止的所有数据都已正确收到。例如,B 正确收到了 A 发送过来的一个报文段,其序号字段是 501,而数据长度是 200B(序号 501~700),这表明 B 正确收到了 A 发送的到序号 700 为止的数据。因此 B 期望收到 A 的下一个数据序号是 701,于是 B 在发送给 A 的确认报文段中把确认号置为 701。
  4. 数据偏移(首部长度,TCP 首部的最小长度 2021 年考过)。占 4 位,这里不是 IP 数据报分片的那个数据偏移,而是表示首部长度(首部中还有长度不确定的选项字段),它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。“数据偏移”的单位是 32 位(以 4B 为计算单位)。因为 4 位二进制数能表示的最大值为 15,所以 TCP 首部的最大长度为 60B。
  5. 保留。占 6 位,保留为今后使用,但目前应置为 0。
  6. 紧急位 URG。当 URG=1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。紧急数据被插入至报文段数据的最前面,而在紧急数据后面的数据仍是普通数据,因此要与首部中的紧急指针字段配合使用。
  7. 确认位 ACK。仅当 ACK=1 时确认号字段才有效。当 ACK=0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
  8. 推送位 PSH。两个应用进程进行交互式通信时,都希望在键入一个命令后立即就能收到对方的响应,此时发送方 TCP 把 PSH 置 1,接收方 TCP 收到 PSH=1 的报文段后,就尽快交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  9. 复位位 RST。当 RST=1 时,表示 TCP 连接中出现严重差错(如主机崩溃等),必须释放连接,然后重新建立传输连接。此外,它还可用于拒绝一个非法的报文段。
  10. 同步位 SYN。当 SYN=1 时表示这是一个连接请求或连接接受报文。当 SYN=1,ACK=0 时,表明这是一个连接请求报文,若对方同意建立连接,则应在响应报文中使用 SYN=1,ACK=1(5.3.3)。
  11. 终止位 FIN。用来释放一个连接。当 FIN=1 时,表明此报文段的发送方的数据已发送完毕,并要求释放传输连接。
  12. 窗口。占 2B,范围为 。窗口值告诉对方,从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。接收方的数据缓存空间是有限的,因此窗口值作为接收方让发送方设置其发送窗口的依据。例如,设确认号是 701,窗口字段是 1000,这表明从 701 号算起,发送此报文段的一方还有接收 1000 字节数据(字节序号为 701~1700)的接收缓存空间(5.3.5)。
  13. 检验和。占 2B。检验和字段检验的范围包括首部和数据两部分。计算检验和时,和 UDP 一样,要在 TCP 报文段的前面加上 12B 的伪首部(只需将 UDP 伪首部的协议字段的 17 改成 6,UDP 长度字段改成 TCP 长度,其他的和 UDP 一样,5.2.2)。
  14. 紧急指针。占 2B。紧急指针仅在 URG=1 时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据在报文段数据的最前面)。即使窗口为零,也可以发送紧急数据。
  15. 选项。长度可变,最长可达 40B。当不使用选项时,TCP 首部长度是 20B。TCP 最初只规定了一种选项,即最大报文段长度(Maximum Segment Size,MSS),它是 TCP 报文段中的数据字段的最大长度。之后又陆续增加了窗口扩大、时间戳等选项。
  16. 填充。这是为了使整个首部长度是 4B 的整数倍。

计算模板

序号与确认号

  1. 报文段序号为 ,携带 字节数据,则数据占序号 ,下一个报文段的序号为 。
  2. 对这个报文段的确认号为 (期望的下一个字节)。
  3. SYN 和 FIN 报文段即使不携带数据,也各消耗一个序号;不携带数据的纯 ACK 不消耗序号(5.3.3)。

序号绕回时间

序号字段 32 位,按字节编号,共 个序号。以速率 (字节/秒)发送,用完全部序号所需时间 。

边界

错题复盘:TCP 按 MSS 分割数据,重传也以 MSS 为单位

王道 5.3.7 第 12 题:当 TCP 在传送大量数据时,是以( )的大小将数据进行分割发送的,进行重发时同样也是以此为单位的(A. MSS B. 字节 C. 比特 D. MTU)。答案 A。

MSS 是 TCP 报文段中数据字段的最大长度。TCP 传送大量数据时,把字节流按不超过 MSS 的大小切成报文段发送;超时重传的也是这样的报文段。

选 B 是把”序号按字节编号”与”数据按什么单位分割”混为一谈:TCP 给每个字节编号,但并不一个字节发一个报文段。选 D 是把两层的上限混了:MTU 是链路层帧的数据部分上限(3.6.2),限制的是整个 IP 数据报;MSS 是 TCP 这一层的上限,限制的是报文段的数据部分。以太网上 MSS 通常取 B,正是为了让报文段装进 IP 数据报后不必分片。

错题复盘:40Gb/s 下 TCP 的 32 位序号不到 1 秒就会绕回

王道 5.3.7 第 15 题:TCP 在 40Gb/s 的线路上传送数据,若 TCP 充分利用了线路的带宽,则经过( )的时间 TCP 会发生序号绕回(使用了之前用过的字节序号,已知 )(A. 859ms B. 85.9ms C. 8.59ms D. 0.859ms)。答案 A。

TCP 的序号是按字节编号的,共 个。40Gb/s B/s,用完所有序号的时间为 s ms。

题目给出的 0.859 已经是秒,换算成毫秒是 859ms;直接选 D 是漏了单位换算。题中已把比特换成了字节(),这一步若忘了,也会差 8 倍。

序号按字节编号,不按报文段编号。 序号字段是本报文段数据第一个字节的序号,确认号是期望收到的下一个字节的序号。

确认号有效需要 ACK=1。 连接建立后所有报文段的 ACK 都必须为 1;只有最初的 SYN 请求报文段 ACK=0。

数据偏移是首部长度,不是分片偏移。 单位 4B,与 IP 首部长度字段的单位相同,与 IP 片偏移(8B)无关(4.2.1)。

窗口字段是接收方给发送方的限制。 从确认号算起,单位是字节。

TCP 首部最短 20B,UDP 首部固定 8B。 TCP 首部有选项,所以最长 60B(2021)。

口径差异:窗口 16 位、保留 6 位、MSS 的取值

教材口径:窗口字段占 2B,最大 字节;保留 6 位,目前应置 0;MSS 是数据字段的最大长度。

标准口径:高速长距离链路上 64KB 的窗口远远不够,窗口扩大选项在建立连接时协商一个移位值,窗口最大可到约 1GB;时间戳选项同时用来防止上面错题中的序号绕回造成混淆。原来的 6 位保留位中,现已有 2 位用于显式拥塞通知(CWR、ECE)。MSS 由双方在 SYN 报文段中各自通告,常见值为以太网上的 1460B。

考试按教材口径作答。

对照速查

说法对错
TCP 连接可以是一对多的❌(只能一对一)
TCP 是面向报文的❌(面向字节流;UDP 面向报文)
TCP 报文长度由发送应用进程决定❌(由接收方窗口和网络拥塞程度决定)
TCP 首部最短 20B,最长 60B✅
序号字段是本报文段第一个数据字节的序号✅
确认号 表示序号 为止的数据都已收到❌(到 为止)
数据偏移以 4B 为单位✅
连接建立后所有报文段的 ACK 都置 1✅
窗口为 0 时不能发送任何数据❌(紧急数据可以)
MSS 是 TCP 报文段的最大长度(含首部)❌(只算数据字段)
TCP 检验和也要加 12B 伪首部✅(协议字段为 6)

考点

  • TCP 特点:面向连接、一对一、可靠、全双工(两端各有发送缓存和接收缓存)、面向字节流
  • 首部 20B 固定 + 选项,最长 60B(2021)
  • 序号(第一个字节)与确认号(期望的下一个字节)(2009、2016)
  • 六个标志位:URG、ACK、PSH、RST、SYN、FIN(2012)
  • 窗口:从确认号算起、以字节为单位;检验和含伪首部
  • MSS:数据字段的最大长度

链接