为了实现可靠传输,TCP 采用了
面向字节流
\color{red}面向字节流
面向字节流的方式。
但 TCP 在发送数据时,是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为
TCP
报文段
\color{red}\texttt{TCP} 报文段
TCP报文段后进行发送。
-
一个
TCP报文段由 首部 \color{red}首部 首部和 数据载荷 \color{red}数据载荷 数据载荷两部分构成; -
TCP的全部功能都体现在它首部中各字段的作用。


1、源端口/目的端口字段

源端口:占 16 16 16比特,写入源端口号,用来 标识发送该 TCP 报文段的应用进程 \color{red}标识发送该 \texttt{TCP} 报文段的应用进程 标识发送该TCP报文段的应用进程。
目的端口:占 16 16 16 比特,写入目的端口号,用来 标识接收该 TCP 报文段的应用进程 \color{red}标识接收该 \texttt{TCP} 报文段的应用进程 标识接收该TCP报文段的应用进程。
假设游览器进程要访问 Web 服务器的进程
为了简单起见:仅从运输层端口号这个角度来举例说明,而不考虑其他细节
- 例如:
ARP,域名解析,TCP建立连接等
当在游览器地址栏中输入 Web 服务器的域名后
游览器进程会构建一个有 HTTP 请求报文的 TCP 报文段
该报文段首部的源端口字段会填写一个短暂的端口号
- 例如: 49152 49152 49152
- 用来标识发送该报文段的游览器进程
目的端口字段会填写熟知端口号
80
80
80
- 因为使用
HTTP协议的Web服务器进程默认监听该端口

Web 服务器收到该 HTTP 报文段后,从中解封出 HTTP 报文
- 并根据
TCP报文段首部中目的端口字段的值 80 80 80,将HTTP请求报文上交给Web服务器进程。
Web 服务器进程根据 HTTP 请求报文的内容进行相应处理
- 并构建一个
HTTP响应报文
HTTP 响应报文需要封装成 TCP 报文段进行发送
该报文段首部的源端口字段会填写熟知端口号
80
80
80
- 用来标识发送该报文段的游览器进程
目的端口字段会填写
49152
49152
49152
- 这是主机中需要接收该
TCP报文段的游览器进程所对应的端口号

客户端收到该 HTTP 报文段后,从中解封出 HTTP 报文
- 并根据
TCP报文段首部中目的端口字段的值 49152 49152 49152,将HTTP请求报文上交给游览器进程。
游览器进程对 HTTP 响应报文的内容进行解析并显示

2、与TCP实现可靠传输的序号字段、确认号字段、确认标志位字段ACK

2.1、序号字段(32 bit)
序号:占 32 32 32 比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],序号增加到最后一个后,下一个序号就又回到 0 0 0。
指出本 TCP 报文段数据载荷的第一个字节的序号 \color{red}指出本\texttt{TCP}报文段数据载荷的第一个字节的序号 指出本TCP报文段数据载荷的第一个字节的序号。
数据载荷中的每个字节数据都有序号,如下所示
- 注意:它们使字节数据的序号而不是内容

对于上述,首部中序号字段的值: 166 166 166
- 用来指出
TCP报文段数据载荷的第一个字节的序号
2.2、确认号字段(32 bit)&确认号标志位字段ACK(1 bit)

确认号:占 32 32 32 比特,取值范围 [ 0 , 2 32 − 1 ] [0,2^{32}-1] [0,232−1],确认号增加到最后一个后,下一个确认好就又回到 0 0 0。
指出期望收到对方下一个 TCP 报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。 \color{red}指出期望收到对方下一个\texttt{TCP}报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。 指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认。
- 即:若确认号 = n n n,则表明到序号 n − 1 n-1 n−1 为止的所有数据都已正确接收,期望接收序号为 n n n 的数据。
确认标志位 ACK:
-
取值为 1 1 1 时确认号字段才有效;
-
取值为 0 0 0 时确认号字段无效。
TCP 规定 , 在连接建立后所有传送的 TCP 报文段都必须把 ACK 置 1 \color{red}\texttt{TCP}规定,在连接建立后所有传送的\texttt{TCP}报文段都必须把\texttt{ACK}置1 TCP规定,在连接建立后所有传送的TCP报文段都必须把ACK置1。
2.3、三者的作用
TCP 客户进程发送一个 TCP 报文段
-
该报文段首部中序号字段的取值为: 201 201 201
这表示该
TCP报文段数据载荷的第一个字节的序号为 201 201 201。 -
假设数据载荷的长度为: 100 100 100 字节
-
首部中确认号的取值为: 800 800 800
这表示
TCP客户进程收到了TCP服务器进程发来的序号到 799 799 799 的全部数据,现在希望收到序号从 800 800 800 开始的数据 -
为了使确认号字段有效,首部中的确认标识位
ACK的值必须设置为 1 1 1

TCP 服务器进程收到该报文段后,也给 TCP 客户进程发送 TCP 报文段
-
该报文段首部中序号字段的取值为: 800 800 800
这表示该
TCP报文段数据载荷的第一个字节的序号为 800 800 800。这正好与
TCP客户进程的确认相匹配 -
假设数据载荷的长度为: 200 200 200 字节
-
首部中确认号的取值为: 301 301 301
这表示
TCP服务器进程收到了TCP客户进程发来的序号到 300 300 300 的全部数据,现在希望收到序号从 301 301 301 开始的数据 -
为了使确认号字段有效,首部中的确认标识位
ACK的值必须设置为 1 1 1

3、数据偏移字段(4 bit)

数据偏移:
-
占 4 4 4 比特,并以 4 4 4 字节为单位。
-
用来指出 TCP 报文段的数据载荷部分的起始处距离 TCP 报文段的起始处有多远 \color{red}用来指出 \texttt{TCP} 报文段的数据载荷部分的起始处距离\texttt{TCP}报文段的起始处有多远 用来指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。
-
这个字段实际上是指出了
TCP报文段的首部长度。-
首部固定长度为 20 20 20 字节,因此数据偏移字段的最小值为 ( 0101 ) 2 (0101)_2 (0101)2
-
首部最大长度为 60 60 60 字节,因此数据偏移字段的最大值为 ( 1111 ) 2 (1111)_2 (1111)2
-

4、保留字段(6 bit)

保留:占 6 6 6 比特,保留为今后使用,但目前应置为 0 0 0。
5、窗口字段(16 bit)

窗口:占 16 16 16 比特,以字节为单位。 指出发送本报文段的一方的接收窗口 \color{red}指出发送本报文段的一方的接收窗口 指出发送本报文段的一方的接收窗口。
-
窗口值作为接收方让发送方设置其发送窗口的依据。
-
这是以接收方的接收能力来控制发送方的发送能力,称为流量控制。
注意:发送窗口的大小还取决于拥塞窗口的大小
- 也就是应该从
接收窗口和拥塞窗口中取小者
6、校验和(16 bit)

校验和:
-
占 16 16 16 比特,检查范围包括
TCP报文段的首部和数据载荷两部分。 -
与
UDP类似,在计算校验和时,要在TCP报文段的前面加上 12 12 12 字节的伪首部。
该检错算法与 TCP 的其他功能相比并不是重点
7、同步标志位 SYN (1 bit)

同步标志位 SYN :在 TCP 连接建立时用来同步序号。
例如:TCP 通过 “三报文握手” 建立连接的过程:TCP的连接建立

TCP 客户进程发送 TCP 连接请求报文段
-
首部中的同步标志位
SYN被置 1 1 1表明这是一个
TCP连接请求报文段
TCP 服务进程发送 TCP 连接请求确认报文段
-
首部中的同步标志位
SYN被置 1 1 1 ,确认位ACK也被置 1 1 1表明这是一个
TCP连接请求确认报文段
8、终止标志位 FIN(1 bit)

终止标志位 FIN :用来释放 TCP 连接
例如:TCP 通过 “四报文挥手” 释放连接的过程
不管是 TCP 客户进程还是 TCP 服务器进程
-
它们所发送出的
TCP连接释放报文段首部中的终止标志位FIN都被置 1 1 1表明这是
TCP连接释放报文段

9、复位标志位 RST(1 bit)

复位标志位 RST :
-
用来复位
TCP连接。 -
当 RST=1 \texttt{RST=1} RST=1 时,表明
TCP连接出现了异常,必须释放连接,然后再重新建立连接 -
RST置 1 1 1 还用来拒绝一个非法的报文段或拒绝打开一个TCP连接。
10、推送标志位 PSH(1 bit)

推送标志位 PSH :
- 接收方的
TCP收到该标志位为 1 1 1 的报文段 会尽快上交应用进程 \color{red}会尽快上交应用进程 会尽快上交应用进程, - 而不必等到接收缓存都填满后再向上交付。
11、紧急标志位 URG(1 bit) & 紧急指针字段(16 bit)

首部中的紧急标志位 URG 和 紧急指针字段用来实现紧急操作
紧急标志位 URG:
- 取值为 1 1 1 时紧急指针字段有效;
- 取值为 0 0 0 时紧急指针字段无效。
紧急指针:占 16 16 16 比特,以字节为单位,用来指明紧急数据的长度。
当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个 TCP 报文段中进行发送。
- 紧急指针会
指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据。
接收方接收到紧急标志位 URG 为
1
1
1 的报文段
- 会按照紧急指针字段的值从报文段数据载荷部分取出紧急数据,并 直接上交应用进程 \color{red}直接上交应用进程 直接上交应用进程
- 而不必在接收缓存中排队
12、选项(长度可变)

TCP 报文段首部除了
20
20
20 字节的固定部分,还有最大
40
40
40 字节的选项部分
增加选项可以增加 TCP 的功能
-
最大报文段长度 MSS 选项 \color{blue}最大报文段长度 \texttt{MSS}选项 最大报文段长度MSS选项:
TCP报文段数据载荷部分的最大长度。 -
窗口扩大选项 \color{blue}窗口扩大选项 窗口扩大选项:为了扩大窗口(提高吞吐率)。
-
时间戳选项 \color{blue}时间戳选项 时间戳选项:
-
用来计算往返时间
RTT -
用于处理序号超范围的情况,又称为防止序号绕回
PAWS。
-
-
选择确认选项 \color{blue}选择确认选项 选择确认选项:用来实现选择确认功能
13、填充

填充:由于选项的长度可变,因此使用填充来 确保报文段首部能被 4 整除 \color{red}确保报文段首部能被4整除 确保报文段首部能被4整除
- (因为数据偏移字段,也就是首部长度字段,是以 4 4 4 字节为单位的)。
若选项的长度加上 20 20 20 字节固定首部的长度不能能被 4 4 4 整除
- 则需要使用填充字段来确保首部能被 4 4 4 整除
14、小结



















