常见网络报文的格式

作者:李佶澳  更新时间:2017/10/28 12:31:28

  编程    linux  network    刷新

目录

说明

收集的一些报文格式。

TCP/IP与OSI七层模型

|------------------|------------------|------------------|
|                  |                  |                  |
|     应用层       |                  |                  |
|                  |                  |                  |
|------------------|                  |                  |
|                  |                  |                  |
|     表示层       |    应用层        |    应用层        |
|                  |                  |                  |
|------------------|                  |                  |
|                  |                  |                  |
|     会话层       |                  |                  |
|                  |                  |                  |
|------------------|------------------|------------------|
|                  |                  |                  |
|     传输层       |     传输层       |    传输层        |
|                  |                  |                  |
|------------------|------------------|------------------|
|                  |                  |                  |
|     网络层       |   网络互联层     |   网络互联层     |
|                  |                  |                  |
|------------------|------------------|------------------|
|                  |                  |                  |
|    数据链路层    |    数据链路层    |                  |
|                  |                  |                  |
|------------------|------------------|    网络接口层    |
|                  |                  |                  |
|     物理层       |     物理层       |                  |
|                  |                  |                  |
|------------------|------------------|------------------|

      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。

IEEE802.2/802.3 rfc1042

|<-------- 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)

以太网 rfc894

|<------以太网 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的长度字段和以太网的类型字段值域没有交集,所以可以将其两者分开。

PPP

+------+-------+-----+------+--------------------------------------------------+--------+-----+
|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层协议

2.5层协议建立在链路层协议上,但是不涉及到网络层的内容. 有的目的是在链路层上做虚拟,例如802.1Q协议用来建立Vlan. 有的目的是为网络层的服务作支撑,例如arp

802.1Q Virtual Lan (vlan)

以太帧中的类型号是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 

pppoe

在以太网上实现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

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

网络层

ip rfc791

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头进行校验,数据部分的校验由上层协议负责

传输层

tcp rfc793

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            |
|-------------------------------------|
|          .....                      |
---------------------------------------

udp rfc

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

rfc7348

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个字节。

应用层

DNS

  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
|------------------------------------------------|
|                      域名                      |
|-----------------------|------------------------|
|        类型           |          类            |
|------------------------------------------------|
|                   生存时间                     |
|------------------------------------------------|
|    资源数据长度       |      资     源         |
|------------------------                        |
|            数                  据              |
|------------------------------------------------|

域名:  响应资源记录的中的域名有时候是偏移值

BFD

运行udp上

BFD

BFD(双向转发检测协议)用于网络故障检测,提供小于1秒的检测时间。

BFD-Control 报文采用UDP封装,目的端口3784 BFD-Echo 报文采用UDP封装,目的端口3785

BGP

运行在tcp上

BGP(边界网关协议) 和其他的BGP交换路由信息。

GIOP

运行在tcp上

GIOP

GIOP 通过TCP报文的钱四个字符GIOP标记。

关注加微信,一般不闲聊(直接说事)

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  微信公众号精选文章  发现知识星球