常见网络报文的格式

Tags: 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标记。


linux

  1. 重学 cgroups: 入门指引、基本概念和 cgroup v1 基础使用
  2. 在用户态观测 Linux 内核函数的调用情况(调用次数、传入参数、运行时长等)
  3. 系统性能分析方法论: 统计图谱工具
  4. Linux关闭swap失败,swapoff failed: cannot allocate memory
  5. Linux内核功能eBPF入门学习(二): BCC中的eBPF应用与bpftrace等
  6. Linux内核功能eBPF入门学习(一): BPF、eBPF、BCC等基本概念
  7. CentOS7/6内核升级的简单方法: 借助ELRepo,用yum命令更新内核
  8. cgroups: cgroup controller 汇总和参数(文件接口)
  9. cgroups: cgroup v1 和 cgroup v2 详细介绍
  10. Linux FUSE(用户态文件系统)的使用: 用libfuse创建FUSE文件系统
  11. 火焰图生成工具nginx-systemtap-toolkit使用时遇到的问题
  12. Linux内核参数用途记录
  13. Linux的nftables的使用
  14. Linux网络调试: iptables规则、连接跟踪表、报文跟踪
  15. 怎样获取Linux kernel相关的知识?Linux内核文档汇总
  16. linux中疑难问题的调查方法
  17. 服务器存在较多的FIN_WAIT1和TIME_WAIT状态的连接
  18. linux的tcp连接
  19. linux的traffic control
  20. DNS的benchmark工具
  21. cgroups: 基本概念&入门指引
  22. Linux的Network Tunnel技术
  23. Linux的网络namespace
  24. Linux上的物理网卡与虚拟网络设备
  25. 发包工具、改包工具
  26. 网络流量控制技术
  27. Linux内核调试、修改
  28. 常见网络报文的格式

network

  1. 怎样规划多DMZ区的安全企业网?
  2. Linux上的物理网卡与虚拟网络设备
  3. 怎样理解1.488Mpps?
  4. 这样子用零雀云翻墙
  5. 翻墙的原理与实践
  6. 匿名网络
  7. 网络虚拟化
  8. 常见网络报文的格式

推荐阅读

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

友情链接:  李佶澳的博客  小鸟笔记  软件手册  编程手册  运营手册  网络课程  收藏文章  发现知识星球  百度搜索 谷歌搜索