TCP首部格式
表格索引:
源端口 | 目的端口 | |||
序号 | ||||
确认号 | ||||
数据偏移 | 保留 | ACK等 | 窗口 | |
检验和 | 紧急指针 |
TCP报文段首部格式图
源端口与目的端口:
各占16位
序号:占32比特,取值范围0~232-1。当序号增加到最后一个时,下一个序号又回到0。用来指出本TCP报文段数据载荷的第一个字节的序号
。
确认号:占32比特,取值范围0~232-1。当序号增加到最后一个时,下一个序号又回到0。用来指出期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号,同时也是对之前收到的所有数据的确认
。
数据偏移:
- 占4比特,该字段的取值
以4字节为单位
。 - 指出TCP报文段的数据载荷部分的起始处距离TCP报文段的起始处有多远,这实际上指出了
TCP报文段的首部长度
。
保留:
- 占6比特
- 保留为今后使用
- 目前置为0
窗口:
- 占16比特,该字段的取值
以字节为单位
。 - 指出发送本报文段的一方的
接收窗口的大小
,即接收缓存的可用空间大小,这用来表征接收方的接收能力
. - 在计算机网络中,经常
用接收方的接收能力的大小来控制发送方的数据发送量
,这就是所谓的流量控制
。
检验和:
- 占16比特
- 用来
检查整个TCP报文段在传输过程中是否出现了误码
。
发送方检验和计算方法:
(1)将TCP首部中检验和字段的值置为0。
(2)将伪首部、TCP首部以及数据载荷这三部分划分成若干个2字节的字。若伪首部、TCP首部以及数据载荷这三部分的总长度不是偶数个字节,则在最后添加1个“全0”字节。
(3)对划分出的全部2字节的字进行反码算数运算求和,并将求和结果取反码。
(4)将步骤③得到的结果写入TCP首部中的检验和字段。
与IPv4数据报首部检验和的计算方法类似,
差别仅在于前者只对首部进行检验。
接收方通过检验和字段的值判断TCP报文段在传输过程中是否误码的方法:
(1)给接收到的TCP报文段前面添加一个12字节的伪首部。
(2)将伪首部、TCP首部以及数据载荷这三部分划分成若干个2字节的字。
(3)对划分出的全部2字节的字进行反码算数运算求和,并将求和结果取反码。
(4)若步骤③得到的结果为0,则表示TCP报文段在传输过程中没有误码。否则,表示出现了误码。
确认标志位ACK:只有当ACK取值为1时,确认号字段才有效
。ACK取值为0时,确认号字段无效。TCP规定:在TCP连接建立后,所有传送的TCP报文段都必须把ACK置1
。
同步标志位SYN:
- 用于TCP“三报文握手”
建立连接
。 - 当
SYN=1且ACK=0
时,表明这是一个TCP连接请求报文段
。 - 对方若
同意建立连接
,则应在响应
的TCP报文段的首部中使SYN=1且ACK=1
。 - 综上所述,SYN为1的TCP报文段要么是一个连接请求报文段,要么是一个连接响应报文段。
终止标志位FIN:
- 用于TCP“四报文挥手”
释放连接
。 - 当
FIN=1
时,表明此TCP报文段的发送方已经将全部数据发送完毕,现在要求释放TCP连接
。
复位标志位RST:
- 用于
复位TCP连接
。 - 当
RST=1
时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接
。 - RST置1还用来
拒绝一个非法的TCP报文段或拒绝打开一个TCP连接
。
推送标志位PSH:
- 发送方TCP把PSH置1,并立即创建一个TCP报文段发送出去,而不需要积累到足够多的数据再发送。
- 接收方TCP收到PSH为1的TCP报文段,就尽快地交付给应用进程,而不再等到接收到足够多的数据才向上交付。
出于效率的考虑,TCP的发送方可能会延迟发送数据,而TCP的接收方可能会延迟向应用进程交付数据。这样可以一次处理更多的数据。 |
但是当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,应用进程可以通知TCP使用推送(PUSH)操作。 |
紧急标志位URG:
- 当URG=1时,紧急指针字段有效。
- 当URG=0时,紧急指针字段无效。
紧急指针:
- 占16比特,以字节为单位,用来指明紧急数据的长度。
- 当
发送方有紧急数据
时,可将紧急数据“插队
”到发送缓存的最前面,并立刻封装到一个TCP报文段中进行发送。紧急指针会指出本报文段数据载荷部分包含了多长的紧急数据
,紧急数据之后是普通数据。 接收方收到紧急标志位为1的TCP报文段
,会按照紧急指针字段的值从报文段数据载荷中取出紧急数据
并直接上交应用进程,而不必在接收缓存中排队
。
选项与填充:
- 选项是一些可选择添加的字段,如窗口扩大选项等等
- 填充是若选项字段的长度加上20字节固定首部的长度不能被4字节整除时,需要填充相应数量的比特0,以确保首部长度能被4字节整除。