一、 TCP协议 (Transmission Control Protocol)

TCP 是面向连接的、可靠的传输协议。为了保证可靠性,它的头部结构相对复杂。

1. TCP 协议的组成(头部结构)

标准的 TCP 头部通常是 20 字节(不含选项 Options),主要包含以下部分:

  • 源端口 (Source Port) & 目的端口 (Destination Port): 标识源应用和目标应用。

  • 序列号 (Sequence Number, Seq): 用于给数据包排序,解决乱序问题。

  • 确认号 (Acknowledgment Number, Ack): 期望收到对方下一个报文段的第一个数据字节的序号,用于确认收到数据。

  • 数据偏移 (Data Offset): 指示 TCP 头部的长度。

  • 保留位 (Reserved): 保留未来使用。

  • 标志位 (Flags) - 最核心部分

    • SYN: 发起连接。

    • ACK: 确认收到。

    • FIN: 结束连接。

    • RST: 重置连接(通常表示异常断开)。

    • PSH: 提示接收端立即将数据推送给应用层。

    • URG: 紧急指针有效。

  • 窗口大小 (Window Size): 用于流量控制,告诉对方自己还能接收多少数据。

  • 校验和 (Checksum): 校验头部和数据的完整性(防止物理线路误码)。

  • 紧急指针 (Urgent Pointer): 只有 URG 标志置位时才有效。

  • 选项 (Options): 可变长,如 MSS(最大报文段长度)、SACK(选择性确认)、时间戳等。

2. TCP 抓包重点看什么?

在 Wireshark 或 Tcpdump 中排查问题时,重点关注以下字段:

  1. Flags (标志位):

    • 看连接状态: 是否有完整的 3次握手 (SYN, SYN-ACK, ACK) 和 4次挥手

    • 看异常: 如果出现大量的 RST,说明连接被强制切断(防火墙拦截、端口未监听、服务崩溃)。

    • 看重传: 结合 Seq/Ack,如果看到同样的 Seq 重复出现,说明发生了重传,网络质量差或拥塞。

  2. Window Size (窗口大小):

    • Zero Window (零窗口): 如果接收端窗口变为 0,说明接收端处理不过来了,发送端会暂停发送。这是排查应用层性能瓶颈的关键。

  3. Stream Analysis (流分析):

    • 关注 RTT (往返时间),判断网络延迟。

    • 关注 Out-of-Order (乱序),判断链路是否不稳定。


二、 UDP协议 (User Datagram Protocol)

UDP 是无连接的、不可靠的传输协议,追求传输效率。

1. UDP 协议的组成(头部结构)

UDP 头部非常简单,固定为 8 字节

  • 源端口 (Source Port): 发送方的端口。

  • 目的端口 (Destination Port): 接收方的端口。

  • 长度 (Length): UDP 头部 + 数据载荷的总长度。

  • 校验和 (Checksum): 校验头部和数据的完整性(在 IPv4 中可选,IPv6 中强制)。

2. UDP 抓包重点看什么?

因为 UDP 很简单,没有握手和重传机制,抓包主要看:

  1. 数据载荷 (Payload):

    • 因为 UDP 头部信息少,分析重点通常在应用层数据本身(如 DNS 查询内容、RTP 音视频流数据)。

  2. 分片 (Fragmentation):

    • 如果 UDP 包过大(超过 MTU,通常 1500 字节),会在 IP 层被分片。抓包时需关注是否有IP分片 (IP Fragments),过多的分片会降低性能且容易被丢弃。

  3. 丢包:

    • UDP 自身不反馈丢包。你需要通过应用层表现(如视频卡顿、语音断续)结合抓包中的序列号(如果应用层协议有设计)来推断。

  4. ICMP Port Unreachable:

    • 如果发送 UDP 包后收到 ICMP 端口不可达报错,说明目标端口未开启。


三、 是否可以篡改?

答案是肯定的:TCP 和 UDP 都可以被篡改。

网络协议栈的设计初衷(上世纪80年代)主要解决的是连通性物理误码,而不是对抗恶意攻击

1. 为什么可以篡改?
  • 明文传输: 标准的 TCP/UDP 头部和载荷(Payload)在默认情况下都是明文的。中间人(Man-in-the-Middle, MitM)可以拦截、修改数据包,然后重新计算校验和并发给接收端。

  • 校验和 (Checksum) 脆弱: TCP/UDP 的 Checksum 算法(16位反码求和)只能检测物理传输中的随机错误(如比特翻转),无法防御恶意篡改。攻击者修改数据后,只需简单计算一个新的 Checksum 填进去,接收端就会认为数据是合法的。

2. 常见的篡改与攻击方式
  • TCP 注入/劫持: 攻击者监听到当前的 Seq 和 Ack 号后,可以伪造一个合法的数据包插入到连接中(例如插入一个 RST 包断开连接,或者插入恶意的 HTTP 重定向)。

  • NAT (网络地址转换): 实际上路由器做 NAT 就是合法的“篡改”,它修改了 TCP/UDP 头部的源 IP 和端口,并重新计算校验和。

  • UDP 欺骗: 由于 UDP 无连接,攻击者可以极其容易地伪造源 IP 地址发送 UDP 包(常用于 DDoS 反射攻击)。

3. 如何防止篡改?

既然 TCP/UDP 自身无法防篡改,必须依靠上层加密协议

  1. 应用层加密 (最常用):

    • TCP -> TLS/SSL (即 HTTPS): 在 TCP 之上加一层 TLS,对数据进行加密和完整性校验(MAC)。即使中间人修改了 TCP 包,解密后的校验也会失败,连接会被丢弃。

    • UDP -> DTLS / QUIC: 类似于 TLS,专门用于 UDP 的加密传输。

  2. 网络层加密:

    • IPsec (VPN): 在 IP 层对整个数据包(包括 TCP/UDP 头部和载荷)进行加密封装。

总结

特性TCPUDP
头部关键序列号、确认号、标志位(SYN/FIN/RST)、窗口大小源端口、目的端口、长度
抓包重点握手/挥手状态、重传率、零窗口、时延内容本身、IP分片、ICMP不可达错误
篡改极易篡改(需重新计算 Checksum)极易篡改(且极易伪造源地址)
防篡改方案使用 TLS/SSL (HTTPS)使用 DTLS 或 QUIC
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐