传输层-第九节:TCP报文段的首部格式
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了传输层-第九节:TCP报文段的首部格式相关的知识,希望对你有一定的参考价值。
- 获取pdf:密码7281
- 专栏目录首页:【专栏必读】王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记、题目题型总结、注意事项、目录导航和思维导图
- 王道考研408计算机组成原理万字笔记
- 王道考研408数据结构+计算机算法设计与分析万字笔记
- 王道考研408操作系统+Linux系统编程万字笔记
文章目录
本节对应视频如下
一:TCP报文段首部概述
TCP报文段首部:为了实现可靠传输,TCP采用了面向字节流的传输方式,但是TCP在发送数据时,是从发送缓存中取出一部分或全部字节并给其添加一个首部使之成为TCP报文段后再进行发送。一个TCP报文段由首部和数据载荷两部分构成,TCP全部功能都由其首部中的各字段体现
和IP数据报首部格式类似,TCP报文段首部格式也是有固定首部(20字节)和扩展首部(最大40字节)构成
二:各字段作用概述
(1)源端口和目的端口
源端口: 占16比特,写入源端口号,用来标识发送该TCP报文段的应用进程
目的端口: 占16比特,写入目的端口号,用来标识接收该TCP报文段的应用进程
如下图,假设主机中的浏览器进程要访问Web服务器中的Web服务器进程
-
当在浏览器地址栏中输入了Web服务器的域名后,浏览器进程会构建一个封装有HTTP请求的TCP报文段
-
该报文段首部中的源端口字段会填写一个短暂端口号,例如这里的
49152
,用来表示发送该报文段的浏览器进程;目的端口字段会填写熟知端口号80
,因为使用HTTP协议的Web服务器进程默认监听该端口
-
Web服务器收到该TCP报文段后,从中解封出HTTP请求报文,并根据TCP报文段首部中目的端口字段的值
80
,将HTTP请求报文上交给Web服务器进程
-
Web服务器进程根据HTTP请求报文的内容进行相应处理并构建一个HTTP响应报文
-
HTTP响应报文需要封装为TCP报文段发送,该报文段首部中的源端口字段会填写熟知端口号
80
,用来标识发送该TCP报文段的Web服务器进程;目的端口字段会填写49152
,这是主机中需要接收该TCP报文段的浏览器进程所对应的端口号
-
主机收到该TCP报文段后,从中解封出HTTP响应报文,并根据TCP报文段首部中目的端口号字段值
49152
,将HTTP响应报文上交给浏览器进程
-
浏览器进程对HTTP响应报文的内容进行解析并显示
(2)序号、确认号和ACK(实现可靠传输)
A:概述
序号: 占32比特,取值范围为 [ 0 , 2 32 − 1 ] [0, 2^32-1] [0,232−1],序号增加到最后一个后,下一个序号会回到0。序号用于指出本TCP报文段数据载荷的第一个字节的序号
例如下图,首部中序号字段应填入十进制166,用来指出数据载荷的第一个字节的序号为166
确认号: 占32比特,取值范围为 [ 0 , 2 32 − 1 ] [0, 2^32-1] [0,232−1],确认号增加到最后一个后,下一个确认号会回到0。确认号用于指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号, 同时也是对之前收到的所有数据的确认
例如,若确认号为 n n n,则表明到序号 n − 1 n-1 n−1为止的所有数据都已正确接收,期望收到序号为 n n n的数据
确认标志位ACK: 只有当取值为1时确认号字段才有效,取值为0时确认号字段无效。TCP规定在连接建立后所有传送的TCP报文段都必须把ACK置1
B:举例
如下图
-
TCP客户端进程发送一个TCP报文段
-
该报文段首部中序号字段的取值为201,这表示该TCP报文段数据载荷的第一个字节的序号为201
-
假设数据载荷长度为100字节,首部中确认号字段为800,这表示TCP客户端进程收到了TCP服务端进程发来的序号到799为止的全部数据,现在期望收到序号从800开始的数据
-
为了使确认号字段有效,首部中确认标志位ACK的值必须为1
-
TCP服务端进程收到该报文后段后,也给TCP客户端进程发送TCP报文段
-
该报文段首部中序号字段的取值为80,这表示该TCP报文段数据载荷的第一个字节的序号为800,这正好与TCP客户端进程的确认相匹配
-
假设数据载荷长度为200字节,首部中确认号字段为301,这表示TCP服务端进程收到了TCP客户端端进程发来的序号到300为止的全部数据,现在期望收到序号从301开始的数据
-
为了使确认号字段有效,首部中确认标志位ACK的值必须为1
(3)数据偏移
数据偏移: 占4比特,并以4字节为单位。用于指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远。该字段实际上指出了TCP报文段的首部长度
- 首部固定长度为20字节,因此数据偏移字段的最小值为 ( 0101 ) 2 (0101)_2 (0101)2
- 首部固定长度为60字节,因此数据偏移字段的最大值为 ( 1111 ) 2 (1111)_2 (1111)2
(4)保留
保留: 占6比特,保留为今后使用,但目前应该置为0
(5)窗口
窗口: 占16比特,以字节为单位。用于指出发送本报文段的一方的接收窗口。窗口值作为接收方让发送方设置其发送窗口的依据。这是以接收方的接收能力来控制发送方的发送能力,称为流量控制
(6)校验和
校验和: 占16比特,检查范围包括TCP报文段的首部和数据载荷两部分。在计算校验和时,要在TCP报文段的前面加。上12字节的伪首部
(7)SYN、FIN、RST、PSH
同步标志位SYN: 用于在TCP连接建立时同步序号
终止标志位FIN: 用于释放TCP连接
复位标志位RST: 用于复位TCP连接
- 当RST=1时,表明TCP连接出现了异常,必须释放连接,然后再重新建立连接
- RST置1还用来拒绝一个非法的报文段或拒绝打开一个TCP连接
推送标志位PSH: 接收方的TCP收到该标志位为1的报文段会尽快上交应用进程,而不必等到接收缓存都填满后再向上交付
(8)URG和紧急指针
紧急标志位URG:
- 取值为1时紧急指针字段有效
- 取值为0时紧急指针字段无效
紧急指针: 占16比特,以字节为单位,用来指明紧急数据的长度。当发送方有紧急数据时,可将紧急数据插队到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据,紧急数据之后是普通数据
(9)选项
选项: 可以增加TCP的功能
- 最大报文段长度MSS选项:TCP报文段数据载荷部分的最大长度。
- 窗口扩大选项:为了扩大窗口(提高吞吐率)
- 时间戳选项:
- 用来计算往返时间RTT
- 用于处理序号超范围的情况,又称为防止序号绕回PAWS
- 选择确认选项:用来实现选择确认功能
(10)填充
填充: 由于选项的长度可变,因此使用填充来确保报文段首部能被4整除,因为数据偏移字段,也就是首部长度字段,是以4字节为单位的
三:总结
字段名 | 长度 | 作用 |
---|---|---|
源端口 | 16个比特 | 标识发送该TCP报文段的应用进程 |
目的端口 | 16个比特 | 标识接收该TCP报文段的应用进程 |
序号 | 32个比特 | 指出数据载荷的第一个字节的序号 |
确认号 | 32个比特 | 指出期望收到下一个第个字节的序号 |
数据偏移 | 4个比特 | 指出数据载荷部分起始距报文段的起始多远 |
保留 | 6个比特 | 保留为今后使用 |
URG | 1个比特 | 决定紧急指针字段是否生效 |
ACK | 1个比特 | 决定确认号字段是否生效 |
PSH | 1个比特 | 决定是否可以尽快交付应用进程 |
RST | 1个比特 | 用于复位TCP连接 |
SYN | 1个比特 | 用于在TCP连接建立时同步序号 |
FIN | 1个比特 | 用于释放TCP连接 |
窗口 | 16个比特 | 指出发送本报文段的一方的接收窗口 |
校验和 | 16个比特 | 数据校验 |
紧急指针 | 16个比特 | 指明紧急数据的长度 |
选项 | 长度可变 | 增加TCP的功能 |
填充 | 长度可变 | 确保报文段首部能被4整除 |
以上是关于传输层-第九节:TCP报文段的首部格式的主要内容,如果未能解决你的问题,请参考以下文章