TCP 头部格式

TCP (Transmission Control Protocol)

1.面向连接的、可靠的、基于字节流的传输层通信协议。
2.数据传输时,将应用层的数据流分割成报文段并发送给目标节点的 TCP 层。
3.TCP 为了不丢失包,就给每个数据包一个序号,对方收到则发送 ACK 确认,未收到则重传。
4.使用校验和来校验数据在传输过程中是否有误。


TCP 头部格式

字段名称长度(比特)含义
发送方端口号(Source Port)16发送网络包的程序的端口号。 IP 地址确定网络上唯一的一台主机,端口号确定主机上唯一的进程。
接收方端口号(Destination Port)16网络包的接收方的端口号。
序号(发送数据的顺序编号)(Sequence Number)32发送方告知接收方该网络包发送的数据相当于所有发送数据的第几个字节。
ACK 号(接收数据的顺序编号)32接收方告诉发送方已经接收到了所有数据的第几个字节。其中,ACK 是 acknowledge 的缩写。
数据偏移量(Offset)4由于头部有可选字段,长度不固定,数据偏移量表示 TCP 报文的数据距离 TCP 起始处有多远。 表示数据部分的起始位置,也可以认为表示头部的长度。
保留6该字段为保留,现在未使用。
控制位(TCP Flags)6该字段中的每个比特分别表示以下通信控制含义。
URG:表示紧急指针字段有效。
ACK : 表示接收数据序号字段有效。一般表示数据已被接收方收到。
PSH : push 标志,表示接收方接收到数据应立刻将数据发送给应用程序,而不是放于缓冲区排队。
RST : 强制断开连 接,用于异常中断的情况或者拒绝连接请求。
SYN: 发送方和接收方相互确认序号,表示连接操作。
FIN:表示断开连接。
滑动窗口(Winodw Size)16接收方告知发送方窗口大小(即无需等待确认可一起发送的数据量),以此来控制发送数据的速率,从而达到流量控制。
校验和(Checksum)16用于检查是否出现错误。将 TCP 头部 和 TCP 数据计算所得,由发送方计算和存储,并由接收方校验。
紧急指针16只有当 TCP Flags 中的 URG 为 1 时候有效。表示应急处理的数据位置。
可选字段可变长度出了上面的固定字段之外,还可以添加可选字段,但除了连接操作之外,很少使用可选字段。这部分最多 40 字节,TCP头部最长 60 个字节。

RST 标志位出现的情况

在某些特殊的条件下,TCP 连接的一端会向另一端发送携带 RST 标志的报文段,即复位报文段,以通知对方关闭连接或者重新建立连接。

  1. 访问不存在的端口。或者该端口正被处于 TIME_WAIT 状态的连接占用时,发送端会收到复位报文段。
  2. 异常终止连接。数据交换完成之后,一方给另一方发送结束报文段,这是正常终止连接的方式。TCP 还提供了异常终止一个连接的方法,即给对方发送一个复位报文段,一旦发送了这个复位报文段,发送端所有排队等待发送的数据都将被丢弃。应用程序可以使用选项 SO_LINGER 来发送复位报文段,以异常终止一个连接。
  3. 半打开连接。服务器关闭或者异常终止了连接,而客户端没有接收到结束报文段(如发生了网络故障),此时客户端还维持着原来的链接,而服务器重启,也已经丢失了该连接的任何信息了。这种状态称为半打开状态。如果此时客户端往处于半打开状态的连接写入数据,则对方将回应一个复位报文段。

RST 标志位举例

在理想情况下,每一个连接都会以 TCP 终止来正常结束。但在现实中,连接经常会断掉。举例来说,这可能是由于一个潜在的攻击者正在进行端口扫描,或者仅仅是主机配置错误所导致的。在这些情况下,就需要使用设置了 RST 标志的 TCP 的数据包。RST 标志来表示连接被异常终止,或拒绝连接请求。

如下图,此时 192.168.100.138 正在请求目标 ip 192.168.100.1的 80 端口,但因为 192.168.100.1 此时并没有监听 80 端口,因此回复了 ACK/RST 报文,此时 RST 表示拒绝连接请求 :

同时从上图中可以看到 RST 报文的 Win = 0,即滑动窗口大小为 0,告知接收复位报文段的一端应该关闭连接或者重新连接,而不能回应这个复位报文段。


扩展

SYN 为 1 表示进行连接,这是因为将SYN 设为 1 并告知初始序号这一操作仅在连接过程中出现,因此发送SYN 为 1 的网络包就表示发起连接的意思。实际上,SYN 是 Synchronize(同步)的缩写,意思是通过告知初始序号使通信双方保持步调一致,以便完成后续的数据收发检查,这才是 SYN 原本的含义。

### TCP头部结构及各字段详解 TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。它的头部结构包含了多个字段,用于控制和维护数据传输过程中的各种操作。 #### 1. 源端口号 (Source Port) 源端口号是一个16位的字段,用来标识发送方的应用程序或进程。它帮助操作系统区分来自不同应用程序的数据流[^2]。 ```plaintext 0-65535 的范围表示可能的端口号。 ``` #### 2. 目的端口号 (Destination Port) 目的端口号也是一个16位的字段,用来标识接收方的应用程序或进程。这个字段确保接收到的数据能够被传递到正确的应用层服务。 #### 3. 序列号 (Sequence Number) 序列号是一个32位的字段,用于标记当前数据包的第一个字节在整个数据流中的位置。这使得接收方可按照顺序重新组装数据段。 #### 4. 确认号 (Acknowledgment Number) 确认号同样是一个32位的字段,在ACK标志位设置的情况下有效。该字段告诉发送方下一个期望接收的字节编号,从而实现可靠的数据传输机制。 #### 5. 数据偏移/首部长度 (Data Offset or Header Length) 这是一个4位的字段,定义了TCP头部的大小,单位是以4字节为增量。由于选项字段的存在,TCP头部的实际长度可能会变化,通常最小值为20字节。 #### 6. 标志位 (Flags) 以下是几个重要的标志位及其功能: - **URG**: 表示紧急指针字段是否有效。如果设置了 URG,则表明有优先级较高的数据需要立即处理[^1]。 - **ACK**: 当 ACK 被置为 1 时,确认号字段才具有意义。这是最常见的标志之一,用于标准的数据交换过程中。 - **PSH**: 告诉接收方应该立即将数据推送给上层应用而不等待缓冲区填满。 - **RST**: 如果出现了严重错误或者异常情况,可以使用 RST 来重置连接。 - **SYN**: 同步序号,用于发起新的连接请求。在三次握手中首次出现并告知初始序列号[^3]。 - **FIN**: 结束通信的一方可以通过 FIN 提议终止会话。双方都需要分别关闭自己的写入通道才能完全结束一次完整的双向连接。 #### 7. 窗口大小 (Window Size) 窗口大小是一个16位的字段,指示发送方允许接收多少字节的新数据而无需进一步确认。这种流量控制方法有助于防止快速主机压垮慢速主机的情况发生。 #### 8. 校验和 (Checksum) 校验和采用的是简单有效的奇偶检验算法,覆盖整个TCP报文段的内容——既包括头部也包括实际负载部分。发送者负责计算并将结果存放在这一16位字段里;接收者则再次执行相同的运算来验证数据完整性。 #### 9. 紧急指针 (Urgent Pointer) 只有当URG标志设定了的时候才会考虑此16位数值的意义。它指出相对于序列号而言,有多少个字节属于高优先级的信息。 #### 10. 选项 (Options) 虽然不是必需项,但某些情况下可扩展基本的功能集。比如最大分段尺寸(MSS),时间戳等等都是常见的例子。这部分最长可达40字节。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值