为了实现可靠传输,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 整除