收集的一些报文格式。
|------------------|------------------|------------------|
| | | |
| 应用层 | | |
| | | |
|------------------| | |
| | | |
| 表示层 | 应用层 | 应用层 |
| | | |
|------------------| | |
| | | |
| 会话层 | | |
| | | |
|------------------|------------------|------------------|
| | | |
| 传输层 | 传输层 | 传输层 |
| | | |
|------------------|------------------|------------------|
| | | |
| 网络层 | 网络互联层 | 网络互联层 |
| | | |
|------------------|------------------|------------------|
| | | |
| 数据链路层 | 数据链路层 | |
| | | |
|------------------|------------------| 网络接口层 |
| | | |
| 物理层 | 物理层 | |
| | | |
|------------------|------------------|------------------|
OSI七层 TCP/IP五层 TCP/IP四层
在libnids-1.24的nids_init()(libnids.c:583)中处理了以下的链路层协议(通过pcap_datalink()探测):
|----------------------|---|---|---|---|
| DLT_PRISM_HEADER | | | | |
| DLT_IEEE802_11_RADIO | | | | |
| DLT_IEEE802_11 | | | | |
| DLT_NULL | | | | |
| DLT_EN10MB | | | | |
| DLT_PPP | | | | |
| DLT_IEEE802 | | | | |
| DLT_RAW | | | | |
| DLT_SLIP | | | | |
| DLT_LINUX_SLL | | | | |
| DLT_FDDI | | | | |
| DLT_PPP_SERIAL | | | | |
MTU:
MTU是链路层对网络层限制,MTU为1500,表示链路层的负载最大为1500。
|<-------- 802.3 MAC------->|<------- 802.2 LLC------->|<--802.2 SNAP-->|
+----------+---------+------+--------+---------+-------+-----------+----+----------------+----+
|目的MAC | 源MAC | 长度 | DSAP AA| SSAP AA |cntl 03|org code 00|类型| 数据 |CRC |
+----------+---------+------+--------+---------+-------+-----------+----+----------------+----+
6 6 2 1 1 1 3 2 38 - 1492 4
长度: 后续字节的长度(不包括CRC)
|<------以太网 rfc 894 ---->|
+----------+---------+------+------------------------------------------------------------+----+
|目的MAC | 源MAC | 类型 | 数据 |CRC |
+----------+---------+------+------------------------------------------------------------+----+
6 6 2 46 - 1500 4
类型取值:
* 0x0800 -- IPv4
* 0x0806 -- ARP
* 0x8035 -- RAPP
* 0x86DD -- IPv6
* 0x8847 -- MPLS Label
* 0x8863/0x8864 -- PPPoE(Discovery阶段/Session阶段)
* 0x8100 -- 802.1Q tag
IEEE802.2/802.3和以太网是两种类型的链路层协议,802.3的长度字段和以太网的类型字段值域没有交集,所以可以将其两者分开。
+------+-------+-----+------+--------------------------------------------------+--------+-----+
|0x7E | 0xFF | 0x03| 协议| 数据 | FCS |0x7E |
-------+-------+-----+------+--------------------------------------------------+--------+-----+
1 1 1 1-2 <1500 2-4 1
协议取值:
* 0x0021 -- Internet Protocol
* 0x8021 -- Internet Protocol Control Protocol
* 0xC021 -- Link Control Protocol
* 0xC023 -- Password Authentication Protocol
* 0xC223 -- Challenge Handshake Authentication Protocol
PPP帧以0x7E标识开始和结束,第二字节(Address域)原先用于唯一标识对方,现在已经没有意义,协议规定全部使用广播地址 (0xFF)。
第三字节(Control域)也没有实际意义,协议规定使用0x03,第四字节(协议)标识数据使用的协议
2.5层协议建立在链路层协议上,但是不涉及到网络层的内容. 有的目的是在链路层上做虚拟,例如802.1Q协议用来建立Vlan. 有的目的是为网络层的服务作支撑,例如arp
以太帧中的类型号是0x8100,在以太帧中的格式如下:
|<------以太网 rfc 894 ------>|<-------------------- 802.1Q data ------------------------->|
+----------+---------+--------+------------------------------------------------------------+----+
|目的MAC | 源MAC | 0x8100 | 数据 |CRC |
+----------+---------+--------+------------------------------------------------------------+----+
6 6 2 46 - 1500 4
802.1Q在MAC地址与type之间增加了TAG(PRI CFI TAG),指明报文所属的VLAN,802.1Q数据格式如下:
+----+-----+----+------------+-------------------------------------------------+
|PRI | CFI | ID | Type | 数据 |
+----+-----+----+------------+-------------------------------------------------+
3bit 1bit 12bit 2
PRI: 帧优先级,priority
CFI: 规范标识位,canonical
ID: VLAN ID
在以太网上实现PPP协议.
+----+------+------+-----------+-------+-----------------------------------------+
|Ver | Type | Code | SessionID | Length| PPP Packet |
+----+------+------+-----------+-------+-----------------------------------------+
4bit 4bit 8bit 16bit 16bit
Ver: PPPoE版本号
Type: PPPoE类型
Code: PPPoE报文类型
0x00 会话数据,
0x07 PADO或PADT报文,
0x09 PADI报文,
0x19 PADR报文
0x65 PADS报文
SessionID:
SessionID: 会话ID,与源MAX和目的MAC确定了一个PPP会话
Length: 负载长度(不包括以太头和PPPoE头),即PPP Packet的长度
arp在以太帧中的协议号:0x0806
|<------以太网 rfc 894 ------>|<--------------------- arp data --------------------------->|
+----------+---------+--------+------------------------------------------------------------+----+
|目的MAC | 源MAC | 0x0806 | 数据 |CRC |
+----------+---------+--------+------------------------------------------------------------+----+
6 6 2 46 - 1500 4
arp数据格式:
+--------------+--------------+--------------+--------------+--------+-----------+----------+-----------+----------+
| HardwareType | ProtocolType | HardwareSize | ProtocolSize | Opcode | SenderMAC | SenderIP | TargetMAC | TargetIP |
+--------------+--------------+--------------+--------------+--------+-----------+----------+-----------+----------+
2 2 1 1 2
HardwareType: MAC地址类型
0x0001 ethernet
ProtocolType: 网络协议类型
0x0800 ipv4
Opcode: 操作
0x0001 request
rfc0791.txt rfc3168-The Addition of Explicit Congestion Notification (ECN) to IP.txt
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
version: 4bits 4,6
IHL: 4bits 头部长度,32bit为计数单位,最小为5
Type of Service: 8bits
0-2 Precedence(优先级)
3 0 Normal Delay,1 Low Delay
4 0 Normal Throughput,1 High Throughput
5 0 Normal Relibility,1 High Relibility
6-7 保留 (rfc3168定义了这两位,用来进行显示拥塞控制)
rfc3168当前状态是proposed standards(2012/11/21)
Precedence
111 - Network Control
110 - Internetwork Control
101 - CRITIC/ECP
100 - Flash Override
011 - Flash
010 - Immediate
001 - Priority
000 - Routine
Total Length: 16bits 整个报文长度(包括头部),8bit为计数单位
Identification: 16bits 数据包标识符,被拆分后的报文的标识符相同,发送者赋值
Flags: 3bits
0 保留
1 0 可以分段,1 不能分段
2 0 最后一个分段,1 还有后续的分段
Fragment Offset: 13bits 报文中的数据在分组前的包中的位置,以64bits为计数单位
Time to Live: 8bits
Protocol: 8bits 上层协议
Header Checksum: 16bits 仅仅是头部的校验
Source Address: 32bits
Destination Address: 32bits
Options: 可选的,长度不一定,主要用于测试
Padding: 填充,长度达到32bit的整数倍
IP层只对IP头进行校验,数据部分的校验由上层协议负责
rfc0793.txt Transmission Control Protocol rfc3168.txt The Addition of Explicit Congestion Notification (ECN) to IP 增加显示拥塞控制()
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在rfc3168中增加了显示拥塞控制,定义了两个新的标识位CWR和ECE,如下
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| | | C | E | U | A | P | R | S | F |
| Header Length | Reserved | W | C | R | C | S | S | Y | I |
| | | R | E | G | K | H | T | N | N |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Source Port: 16bits 源端口
Destination Port: 16bits 目的端口
Sequence Number: 32bits TCP报文的数据部分第一个字节的序列号,
在这个值上加上TCP报文的数据长度得到的值就是下一个报文的Sequence Number
Acknowledgement Number: 32bits 告知对方序列号为AckNum-1的报文已经收到,下一个报文的序列好应该为Acknowledgement Number
Data Offset: 4bits 报头长度,以32bits为单位
Reserved: 4bits 原先是6bits,RFC3168中添加了两个标识位,变成了4bits
CWR: 1bit 通知接收端已经收到了设置ECE标志的ACK
ECE: 1bit 在TCP三次握手时表明TCP端是否支持ECN(显示拥塞控制)
在传输数据时表明接收端发现了拥塞
URG: 1bit 紧急指针,告诉接受TCP模块紧急指针域指着紧要数据
ACK: 1bit 0 不包含确认序列号,1 包含确认序列号
PSH: 1bit 0 普通处理,1 接收方接收到后直接送到应用程序
RST: 1bit 0 ,1 重建连接
SYN: 1bit 0 ,1 发起连接
FIN: 1bit 0 ,1 发送者不再发送数据 结束连接
Window: 16bits 发送该报文的一方此时能够接受的数据大小,以8bit为单位
Checksum: 16bits 整个TCP报文的校验
Urgent Pointer: 16bits 紧临着紧急数据的第一个非紧急数据相对于序列号的正偏移
Options: 可选
Padding: 填充
data: 数据
tcp选项介绍:
MSS:
Maximum Segment Size
建立TCP连接时,在SYN报文中通报传往另一端的最大块数据长度。
kind len 最大报文段长度
--------------------------
| 2 | 4 | value |
--------------------------
1byte 1byte 2byte
Window Scale:
窗口扩大因子
在SYN报文中出现,tcp窗口扩大到2^(移位数)倍,即左移value位。
kind len 移位数
--------------------------
| 3 | 3 | value |
--------------------------
1byte 1byte 1byte
Timestamp:
时间戳
发送方在报文中放置一个时间戳值,接收方在确认时返回这个值以及接收时的时间戳值。
kind len 发送时间戳 确认时间戳
------------------------------------------
| 8 | 10 | value1 | value2 |
------------------------------------------
1byte 1byte 4byte 4byte
SACK:
Selective Acknowledgement
发送方建立连接时在SYN包里发送一个SACK-Permit,表示在今后的传输中希望收到SACK选项。
开始连接时接受方发送SACK选项,通过发送方已经接收的不连续的数据块。
SACK-Permit:
kind len
-------------
| 4 | 2 |
-------------
1byte 1byte
SACK:
kind len
---------------------------------------
| | 5 | len |
|-------------------------------------|
| Left Edge of 1st Block |
|-------------------------------------|
| Right Edge of 1st Block |
|-------------------------------------|
| ..... |
---------------------------------------
rfc768-User Datagram Protocol.txt
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| | |
| Length | Checksum |
+--------+--------+--------+--------+
|
| data octets ...
+---------------- ...
Source Port: 源端口
Destination Port: 目的端口
Length: 整个udp报文的长度,包括报头
CheckSum: 校验和
vxlan封装在udp协议中, 是udp报文的payload
+---------+--------------+--------+-------------+--------------------+
| Flags | PolicyID | VNI | Reserved | Ethernet Packet |
+---------+--------------+--------+-------------+--------------------+
2 2 3 1
Overlay的MTU设置为1500,当网络层数据长度为1500是,最终的underlay中的网络层数据长度为:
overlayData(1500) + overlay以太头(14) + vxlan头(8) + udp头(8) + IP头(20+) = 1550+
所以Underlay的MTU至少需要比Overlay的MTU大50个字节。
0 1 2 3 4 5 6 7 8 9 A B C D E F
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
ID 16bit 标识,用于请求报文与回复报文的配对
QR 1bit 报文类型, 0 查询报文, 1 回应报文
Opcode 4bit 查询类型, 0 标准查询, 1 反向查询, 2 请求服务器状态, 3-15 保留
AA 1bit 授权回答
TC 1bit 报文被分片
RD 1bit 递归查询
RA 1bit 支持递归查询
Z 3bit 保留字段, 必须为0
工作中遇到一种说法, Z的第一个bit表示返回的IP是否是容错IP
没有找到官方说明
RCODE 4bit 返回码
0 无错, 1 查询格式错误, 2 查询失败, 3 域名不存在, 4 不支持该类查询, 5 拒绝请求, 6-15 保留
QDCOUNT 16bit 无符号整数, 查询的条目的数目
ANCOUNT 16bit 无符号整数, 回复的记录的数目
NSCOUNT 16bit 无符号整数, 授权记录的数目
ARCOUNT 16bit 无符号整数, 额外记录的数目
查询问题记录格式:
0 16 32
|------------------------------------------------|
| 查询名 |
|-----------------------|------------------------|
| 查询类型 | 查询类 |
|------------------------------------------------|
查询名记录格式: 6 g e m i n i 3 t u c 4 n o a o 3 e d u 0 (计数+字符,计数为0,表示结束)
查询类: 名称 数值 描述
A 1 IP地址
NS 2 名字服务器
CNAME 5 规范名称
PTR 12 指针记录
HINFO 13 主机信息
MX 15 邮件交换记录
AXFR 252 对区域转换的请求
*/ANY 255 对所有记录的请求
响应资源记录格式:
0 16 32
|------------------------------------------------|
| 域名 |
|-----------------------|------------------------|
| 类型 | 类 |
|------------------------------------------------|
| 生存时间 |
|------------------------------------------------|
| 资源数据长度 | 资 源 |
|------------------------ |
| 数 据 |
|------------------------------------------------|
域名: 响应资源记录的中的域名有时候是偏移值
运行udp上
BFD(双向转发检测协议)用于网络故障检测,提供小于1秒的检测时间。
BFD-Control 报文采用UDP封装,目的端口3784 BFD-Echo 报文采用UDP封装,目的端口3785
运行在tcp上
BGP(边界网关协议) 和其他的BGP交换路由信息。
运行在tcp上
GIOP 通过TCP报文的钱四个字符GIOP标记。