TCP/UDP报文结构

1,840 阅读3分钟

一、TCP报文结构

  • 当没有使用可选部分,TCP的包头(Header length)是20字节
参数名称 长度/bit 说明
源端口 16 发送方的端口号
目的端口 16 接收方的端口号
序号(seq number) 32 从发送端向接收端发送的字节流编号
确认号(ack number) 32 接收方回发的应答顺序号
偏移 4 表示TCP包头长度,(长度的值 * 4)表示包头所占的字节数
保留位 6
URG 1 紧急标志位:1表示“紧急指针”有效
ACK 1 确认标志位:请求/应答状态。0为请求,1为应答
PSH 1 推送标志位:1表示需要将数据立刻发送给应用程序,不用再等到整个缓存都填满了后再向上交付
RST 1 复位标志位:1表示需要重连(置为1还用来拒绝一个非法的报文段或拒绝打开一个连接)
SYN 1 同步标志位:握手时使用,1表示连接请求报文,此时报文段不能携带数据
FIN 1 终止标志位:1表示需要断开连接
窗口 16 表示从本报文段首部中的确认号算起,接收方目前允许对方一次发送的数据量(单位:Byte)
校验和 16 包括首部和数据这两部分的CRC16,需要加上12字节的伪首部
紧急指针 16 指出本数据段中为紧急数据的字节数,紧急数据无须缓存,当前窗口大小为0也是可以发送紧急数据
可选部分 0 ~ 40 长度必须是 32 bits 的整数倍
数据部分 N

TCP/UDP伪首部

  • 计算校验和需要在UDP数据报之前增加12字节的伪首部。
  • 伪首部仅仅是为了计算校验和,不向下传送也不向上递交。
  • 这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。
  • 伪首部供12个字节
  • 格式如下:
参数名称 长度/bit 说明
源地址 32 发送方的IP地址
目的地址 32 接收方的IP地址
placeholder 8 必须为0,用于填充对齐
协议号 8 TCP:6;
UDP:17;
头长度 16 UDP/TCP头长度

1. TCP三次握手

第一次

  • SYN = 1 (表示客户端向服务端发起连接请求)
  • seq number = x(随机值)

第二次

  • ACK = 1(表示服务端应答客户端的连接请求)
  • ack number = seq number + 1 (即 x + 1)

  • SYN = 1(表示服务端向客户端发起连接请求)
  • seq number = y(随机值)

第三次

  • ACK = 1(表示客户端应答服务端的连接请求)

  • ack number = seq number + 1 (即 y + 1)

  • seq number = x + 1

2. TCP四次挥手

第一次

  • FIN = 1(表示客户端向服务端发送断开连接请求)
  • seq number = n

第二次

  • ACK = 1(表示服务端应答客户端的断开连接请求)
  • ack number = seq number + 1 (即 n + 1)

第三次

  • FIN = 1 (表示服务端向客户端发送断开连接请求)
  • seq number = m

第四次

  • ACK = 1 (表示客户端应答服务端的断开连接请求)
  • ack number = seq number + 1 (即 m + 1)

二、UDP报文结构

参数名称 长度/bit 说明
源端口 16 发送方的端口号
目的端口 16 接收方的端口号
总长度 16 首部 + 数据内容
校验和 16 数据(伪首部 + 首部 + 数据内容)的校验和
数据部分 N