Skip to content

Latest commit

 

History

History
58 lines (34 loc) · 5.51 KB

2019-05-07-运输层-TCP 首部报文段.md

File metadata and controls

58 lines (34 loc) · 5.51 KB

首先TCP 是面向字节流的。这个流指的是流入到进程或从进程流出的字节序列。面向字节流的含义是:应用程序与 TCP 的交互是一次一个数据块(大小不等),但是 TCP 把应用程序交下来数据仅仅看成是一连串的无结构字节流。而 TCP 不知道所传送字节流的含义。

一、TCP首部报文段格式

一个 TCP 报文段分为首部和数据两部分,只有弄清楚 TCP 首部中各字段的作用才能更好地掌握 TCP 的工作原理。

这里写图片描述

Source Port And Destination Port(源端口与目的端口):各占 2 个字节,分别写入源端口号与目的端口号。

Sequence Number(序列号):占 4 个字节,范围是[0, 232 - 1],序号增加到 232 - 1 后,下一个序号就又回到 0。在 TCP 连接中传送的字节流中的每一个字节都要按顺序编号,起始序号在连接建立时就完成设置。因此序列号可以用来解决网络包乱序(reordering)问题。

例如,一个报文段的序号是 301,而携带的数据共有 100 个字节。这就表明:本报文段的数据的第一个字节的序号是 301,最后一个字节的序号是 400。显然下一个报文段的数据序号要从 401 开始。

Acknowledgement Number(确认号):占 4 个字节,表示期望收到对方下一个报文段的第一个数据字节的序号。可以用来解决丢包的问题。

例如:B 收到了 A 发送过来的一个报文段,序号字段值为 501,而长度是 200 字节(序号 501 - 700),这表明 B 正确地收到了 A 发送的 200 个字节的数据。于是 B 在发送给 A 的确认报文段中把确认号设置为 701。若确认号等于 N,表明:到序号 N - 1 为止的所有数据都已经正确接收到。

Offset(数据偏移):占 4 位,指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。这个字段实际上是指出 TCP 报文段的首部长度。

Reserved(保留):保留为今后使用,目前应置为 0。

TCP Flags:数据包的属性,用于控制 TCP 的状态机。下面介绍其中的一些属性

  • URG(紧急):当 URG=1 时,表明紧急指针字段有效,代表该报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。于是发送方就把紧急数据插在本报文段数据的最前面,通常与 Urgent Pointer 一起配合使用。
  • ACK(确认):只有当 ACK=1 时确认号字段才有效,代表这个封包为确认封包。当 ACK=0 时,确认号无效。TCP 规定,在连接建立后所有传送的报文段都必须把这个字段的值置为 1。
  • RST(复位):当RST=1时,表明TCP连接中出现严重差错(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。

Window(窗口):占 2 个字节,窗口值是一个 [0, 216 - 1] 之间的整数。该字段用于指示接接收方愿意接受的字节数量,主要用于流量控制。

例如:发送了一个报文段,其确认号是 701,窗口字段值为 1000。这就告诉对方:“从 701 序号开始算起,我(发送此报文段的一方)的接收缓存空间还可以接收 1000 个字节数据,字节序号是 701 - 1700,你在给我发送数据时,必须要考虑到这一点”。窗口字段值明确的指出了现在允许对方发送的数据量,窗口值通常是在不断的动态变化着。

Checksum(校验和):占 2 个字节,校验和字段检验的范围包括首部和数据两部分。

Urgent Pointer(紧急指针):占 2 个字节,紧急指针仅在 URG = 1时才有意义,它指出本报文段中的紧急数据的字节数。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。

TCP Options(选项):长度可变,最长可达 40 字节。当没有使用“选项时”,TCP 的首部长度是 20 字节。

二、序号和确认号学习案例

在这里插入图片描述

  • ①:主机 A 告知主机 B,我发送的数据序号从 42 开始,你发送 79 序号之前的数据已经接收,所以你下次需要从 79 序号开始向我传输数据
  • ②:主机 B 使用 79 序号向主机 A 发送数据,并返回 Ack 为 43 表示你发送的 43 序号之前的所有数据已经接收,所以你下次需要从 43 序号开始向我传输数据
  • ③:主机 A 使用 43 序号向主机 B 发送确认,并返回 Ack 为 80 表示你发送的 80 序号之前的所有数据已经接收

三、总结

上面有几个头部信息非常重要:

  • Sequence Number 是包的序号,用来解决网络包乱序(reordering)问题
  • Acknowledgement Number 就是 ACK——用于确认收到,用来解决丢包的问题
  • Window 又叫 Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控的问题

参考资料: 《计算机网络》 by 谢希仁 《计算机网络自顶向下》 by James.F.Kurose TCP 的那些事儿 By 陈皓:https://coolshell.cn/articles/11564.html