一、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 |