当前课程知识点:计算机网络 > 第五章 运输层 > 5.2 TCP报文段首部格式 > TCP报文段首部格式
今天讲解TCP报文段首部格式
第一部分内容
TCP虽然是面向字节流的
但TCP传送的数据单元却是报文段
一个TCP报文段分为首部和数据两部分
而TCP的全部功能
体现在它首部中的各字段的作用
因此
需要详细了解一下
TCP首部各字段的作用
下面讨论一下TCP报文段首部格式
TCP报文段首部
一个TCP报文段
分为首部和数据两部分
而TCP的全部功能都体现在它
首部中各字段的作用
TCP报文段首部的前20个字节是固定的
后面有4n个字节
是根据需要而增加的选项
n是整数倍
因此TCP首部的最小长度是20字节
1.源端口和目的端口
源端口和目的端口字段
各占2个字节
端口是运输层与应用层的服务接口
运输层的复用和分用功能
都要通过端口号才能实现
2.序号
(1)占4个字节
序号范围是0到2^32 - 1
共2^32个序号
序号增加到2^32-1后
下一个序号就又要回到0了
TCP是面向字节流的
在一个TCP连接中
传送的字节流中的
每一个字节都按顺序编号
整个要传送的字节流的
起始序号必须在连接建立时设置好
(2)首部中的序号字段
这个则是指
本报文段所发送的数据的
第一个字节的序号
例如
一报文段的序号是501
而待接收的数据共有100字节
这就表明
本报文段的数据的
第一个字节的序号是501
最后一个字节的序号是600
显然
下一个报文段的序号应该从601开始
即下一个报文段的序号字段值应为601
这个字段的序号也叫“报文段序号”
3.确认号
占4个字节
是期望收到对方下一个报文段的
第一个数据字节的序号
例如
B正确收到了A
发送过来的一个报文段
其序号的字段值是501
而数据长度是200个字节
即序号是从501到700
这表明B正确收到了A发送到的
序号700为止的数据
因此
B期望收到A的下一个数据序号是701
于是B在发送给A的确认报文段中
把确认号置为701
要注意的是
现在确认号不是501
也不是700
而是701
总之如果确认号为 N
则表明到序号N-1为止的
所有数据都已经正确收到
4. 数据偏移
这个占4位
它指出TCP报文段的
数据起始处
距离TCP报文段的起始处有多远
这个字段实际上是指出
TCP报文段的首部长度
由于首部中还有长度不确定的选项字段
因此数据偏移字段是必要的
但应该注意
数据偏移字段的单位是32位字
即以4字节的字为计算单位
由于4位二进制
最大能表示的数是15
因此数据偏移的最大值是60字节
这也是TCP首部的最大字节
也就是说
选项长度不能超过40个字节
5. 保留字段
这个字段占6位
保留为今后使用
但目前应置为0
接着下面有6个控制位
用来说明本报文段的性质
第六个字段
紧急URG字段
当URG等于1时
表明紧急指针字段有效
它告诉系统此报文段中有紧急数据
应尽快发送
也就是相当于高优先级别的数据
而不要按原来的排队顺序来传送
例如
如果已经发送了很长的一个程序
要在远地的主机上运行
但后来发现了一些问题
需要取消该程序的运行
因此用户会从键盘发出中断命令
如果此时不使用紧急数据
那么这两个字符将存储在
接收TCP的缓存末尾
只有在所有的数据被处理完毕后
这两个字符才被交付接收方的应用进程
这样做就浪费了很多时间
当UDP置为1时
发送应用进程
就告诉发送方的TCP
我这有紧急数据要传送
于是发送方TCP
就把紧急数据插入到
本报文段数据的最前面
而在紧急数据后面的数据
仍然是普通数据
这时要与首部中紧急字段指针配合使用
7. 确认ACK位
仅当ACK等于1时
确认字段才有效
当ACK等于0时
我们认为确认号是无效的
TCP规定
在连接建立后
所有的传送的报文段
都必须把ACK置为1
8. 推送PSH位
当两个应用进程进行交互式的通信时
有时在一端的应用进程
希望在键入一个命令后
立刻就能收到对方的响应
在这种情况下
TCP就可以使用推送操作
这时发送方TCP把PSH置为1
并立即创建一个报文段发送出去
而接收方TCP
收到PSH等于1的报文的时候
就尽快地交付接收应用进程
而不再等到整个缓存区
都填满了后再向上交付
9. 复位RST位
当RST等于1时
表明TCP连接中出现了严重错误
如果由于主机崩溃或其他原因造成
此时我们必须释放连接
然后再重新创建传输连接
RST置为1
还用来拒绝一个非法的报文段
或拒绝打开一个连接
10. 同步SYN位
在建立连接时用来同步序号的
当SYN等于1而ACK等于0时
表明这是一个连接请求报文段
对方若同意建立连接
则应在响应的报文段中
使用SYN等于1和ACK等于1
因此SYN置为1就表示
这是一个连接请求或连接接受报文
11. FIN位
这个是用来释放一个连接的
当FIN等于1的时候
表明此报文段的发送的数据
已经发送完毕
并要求释放运输连接
12 窗口
窗口占2个字节
窗口值是(0,2^16-1)之间的一个整数
窗口值是接收方告诉发送方
从本报文段首部中的确认号算起
接收方目前允许对方发送的数据量
以字节为单位计算
之所以要有这个限制
是因为接收方的数据缓存空间是有限的
窗口值作为接收方
让发送方设置其发送窗口的依据
例如 发送方发送了一个报文段
其确认号是701 窗口字段是1000
这就是告诉发送方
从701算起
我(即接收报文段的一方)的接收缓存空间
还可再接受1000个字节的数据
其字节序号是701~1700
你在给我发数据时必须考虑到这一点
总之 窗口字段明确指出了
现在允许对方发送的数据量
并且窗口值经常在动态变化
13 检验和
这个字段占2字节
检验和字段检验的范围
包括首部和数据这两个部分
和UDP用户数据报一样
在计算检验和时
要在TCP报文段的前面
加上12个字节的伪首部
伪首部的格式
和UDP用户数据报的伪首部一样
但应把伪首部第4个字段中的17改为6
这是由于TCP的协议号是6
把第5字段中的UDP中的长度改为TCP长度
接收方收到此报文段后
仍要加上这个伪首部来计算检验和
若使用的是IPV6协议
则相应的伪首部也要进行改变
14 紧急指针
这个字段占2个字节
紧急指针仅在URG=1时才有意义
它指出本报文段中的紧急数据的字节数
因此 在紧急指针指出了
紧急数据的末尾在报文段中的位置
当所有紧急数据都处理完毕时
TCP就告诉应用程序恢复到正常操作
值得注意的是
即使窗口为0时也可以发送紧急数据
15 选项
长度可变 最长可达4字节
当没有使用“选项”时
TCP的首部长度是20字节
TCP最初只规定了一种选项
即最大报文段长度MSS
注意MSS这个名词含义
MSS是每一个TCP报文段中的
数据字段的最大长度
数据字段加上TCP首部
才等于整个的TCP报文段
所以MSS并不是整个TCP报文段的最大长度
而是TCP报文段长度减去TCP首部长度的值
为什么要规定一个最大报文长度MSS呢
这并不是考虑接受方的接收缓存
可能存放不下TCP报文段中的数据
实际上 MSS与接收窗口值没有关系
我们知道 TCP报文段的数据部分
至少要加上40字节的首部
TCP首部20字节和IP首部20字节
这样才能组装成一个IP数据报
若选择较小的MSS长度
那么网络的利用率就大大降低
设想在极端情况下
当一个TCP报文段只含有1个字节的数据时
在IP层传输的数据报的开销至少有40字节
包括TCP报文段的首部和IP数据报的首部
这样 对网络的利用率就不会超过1/41
到了数据链路层还要加上一些开销
但反过来 若TCP报文段非常长
那么在IP层传输时
就有可能要分解成多个短数据报片
在终点要把收到的各个短数据报片
组成原来的TCP报文段
当传输出错时还要进行重传
这些也都会使开销急剧增大
所以为了提高对网络的利用率
减少传输的开销
因此 MSS应尽可能大些
只要在IP层传输时不需要分片就行
由于IP数据报所经历的路径是动态变化的
因此在这条路径上确定的
不需要的分片的MSS
如果改走另一条路径就可能需要进行分片
因此最佳的MSS是很难确定的
在连接过程中
双方都把自己能够支持的MSS写入这一字段
以后就按照这个数值传输数据
两个传送方向可以有不同的MSS值
若主机未填写这一项
则MSS的默认字段是536个字节长度
因此 所有在互联网上的主机
都应该接受的报文段长度是
536+20也就是556个字节
窗口扩大选项
它的作用是为了扩大窗口
我们知道
TCP首部中窗口字段长度是16位
因此最大的窗口大小为64K字节
虽然这对早期的网络是足够用的
但对于包含卫星信道的网络
传播时延和带宽都是很大的
要获得高吞吐量需要更大的窗口大小
窗口扩大选项占用3个字节
其中有一个字节表示移位值S
新的窗口值等于TCP首部中的
窗口位数从16增大到16+S
移位值允许使用的最大值是14
相当于窗口最大值增大到2^(16+14-1)
也就是2^29
窗口扩大选项可以在
双方初始建立TCP连接时进行协商
如果连接的某一端实现了窗口扩大
当它不再需要扩大其窗口时
可发送S=0选项
使窗口大小回到16
时间戳选项
这个选项占用10个字节
其中最主要的字段是时间戳字段
占用4字节
和时间戳回送回答字段
同样占用4字节
时间戳选项有以下两个概念
第一 用来计算往返时间RTT
发送方在发送报文段时
把当前时钟的时间值放入时间戳字段
接收方在确认该报文段时
把时间戳字段复制到时间戳回送回答字段
因此 发送方在收到确认报文后
可以准确地计算出RTT来
第二 用于处理TCP序号超过2^32的情况
这又称为防止序号绕回PAWS
我们知道 TCP报文段的序号只有32位
而每增加2^32个序号
就会重复使用原来用过的序号
当使用高速网络时
在一次TCP连接的数据传送中
序号很可能被重复使用
例如 当使用1.5Mbit/s的速度
发送报文段时
序号重复要6小时以上
但若用2.5Gbit/s的速率发送报文段
则不到14秒钟序号就会重复
为了使接收方能够把新的报文段
和迟到很久的报文段区分开
则可以在报文段中加上这种时间戳
16 填充字段
这是为了使整个首部长度
是4字节的整数倍进行填0操作
以上是TCP报文段首部格式(2)单元内容
-1.1 计算机网络的发展历程及其在信息时代中的作用
-1.2 互联网的组成
--互联网的组成
-1.3 电路交换和分组交换
-1.4 计算机网络的性能
--计算机网络的性能
-1.5 计算机网络体系结构和层次划分
-第一章
-2.1 数据通信系统模型
--数据通信系统模型
-2.2 导向型传输媒体
--导向型传输媒体
-2.3 光导纤维
--光导纤维
-2.4 非导向型传输媒体
--非导向型传输媒体
-2.5 信道的极限容量
--信道的极限容量
-2.6 信道复用技术
--信道复用技术
-2.7 ADSL
--ADSL
-第二章
-3.1 数据链路层的三个基本问题
-3.2 CSMA/CD协议
-3.3 虚拟局域网
--虚拟局域网
-3.4 扩展的以太网
--扩展的以太网
-3.5 高速以太网
--高速以太网
-第三章
-4.1 分类的IP地址-划分子网
-4.2 无分类编址-构造超网
-4.3 ICMP协议
--ICMP协议
-4.4 路由器结构
--路由器结构
-4.5 RIP协议
--RIP协议
-4.6 IP多播
--IP多播
-第四章
-5.1 用户数据报协议UDP
-5.2 TCP报文段首部格式
-5.3 可靠传输工作原理
--可靠传输工作原理
-5.4 字节为单位的滑动窗口实现
-第五章
-6.1 网络应用层
--网络应用层
-6.2 DNS
--DNS
-6.3 FTP
--FTP
-6.4 HTTP
--HTTP
-6.5 P2P
--P2P
-6.6 计算机网络面临的安全性威胁
-6.7 防火墙
--防火墙
--第六章
-7.1 交换机基本配置
--交换机基本配置
-7.2 路由器基本配置
--路由器基本配置
-7.3 交换机端口隔离
--交换机端口隔离
-7.4 跨交换机实现相同VLAN通信
-7.5 动态路由
--动态路由
-7.6 静态路由
--静态路由