寄存地

In order to be irreplaceable, one must always be different

0%

协议报文格式

以太网帧格式

以太网帧因为历史原因存在多个版本,这里最常用的IEEE802.3以太网帧格式。

以太网帧

参数 含义
Preamble 前导码,7个字节,用于数据传输过程中的双方发送、接收的速率的同步
SFD 帧开始符,1个字节,表明下一个字节开始是真实数据(目的MAC地址)
dst MAC 目的MAC地址,6个字节,指明帧的接受者
src MAC 源MAC地址,6个字节,指明帧的发送者
Length 长度,2个字节,指明该帧数据字段的长度,但不代表数据字段长度能够达到(216)字节
Type 类型,2个字节,指明帧中数据的协议类型
Data and Pad 数据与填充,46~1500个字节,包含了上层协议传递下来的数据,如果加入数据字段后帧长度不够64字节,会在数据字段加入“填充”至达到64字节
FCS 帧校验序列,4个字节,对接收网卡(主要是检测Data and Pad字段)提供判断是否传输错误的一种方法,如果发现错误,丢弃此帧。目前最为流行的用于FCS的算法是循环冗余校验(cyclic redundancy check –CRC

ARP报文格式

ARP协议号为0x0806

ARP报文格式

参数 含义
硬件类型 硬件地址的类型,值为1表示以太网地址
协议类型 要映射的协议地址类型。它的值为0x0800表示IP地址类型
硬件地址长度 以字节为单位,对于以太网上的IP地址的ARP请求或应答来说,值为6
协议地址长度 以字节为单位,对于以太网上的IP地址的ARP请求或应答来说,值为4
操作类型(OP) 1表示ARP请求,2表示ARP应答
发送者硬件地址 发送端MAC地址
发送者IP地址 发送端IP地址
目标硬件地址 目标MAC地址
目标IP地址 目标IP地址

ARP状态机如下

arp状态机

IPV4报文格式

IP数据包由首部和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。

IP报文格式

参数 含义
版本 占4位,IP协议的版本,目前的IP协议版本号为4,下一代IP协议版本号为6。
首部长度 占 4 位,IP报头的长度。固定部分的长度(20字节)和可变部分的长度之和。共占4位。最大为1111,即10进制的15,代表IP报头的最大长度可以为15个32bits(4字节),也就是最长可为15*4=60字节,除去固定部分的长度20字节,可变部分的长度最大为40字节。
服务类型 Type Of Service。 占 8 位,用来获得更好的服务.
总长度 总长度指首都及数据之和的长度,单位为字节。因为总长度字段为 16位,所以数据报的最大长度为 216-1=65535字节。在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元 MTU (Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度 (即首部加上数据部分)一定不能超过下面的数据链路层的MTU值,否则要分片。
标识 占 16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。但这个”标识”并不是序号,因为 IP是无连接的服务。数据报不存在按序接收的问题。当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报.
标志 占3 位,但目前只有2位有意义。标志字段中的最低位记为 MF(More Fragment)。MF=1即表示后面”还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。标志字段中间的一位记为DF(Don’t Fragment),意思是”不能分片”,只有当 DF=0时才允许分片。
片偏移 占 13位。较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以 8个字节为偏移单位,这就是说,每个分片的长度一定是 8字节(64位)的整数倍。
生存时间 占 8位,生存时间字段常用的英文缩写是TTL(Time To Live),其表明数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为 TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于 1 秒,就把TTL值减 1。当 TTL值为 0时,就丢弃这个数据报。
协议 占 8 位。协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
首部校验和 占 16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,都要重新计算一下首都检验和。
源地址 占32位。
目的地址 占32位。

Linux 内核相关结构体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//ip 头部结构体
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u8 ihl:4,
version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
__u8 version:4,
ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
/*The options start here. */
};

IP协议号

十进制 十六进制 关键字 协议 引用
0 0x00 HOPOPT IPv6逐跳选项 RFC 2460
1 0x01 ICMP 互联网控制消息协议(ICMP) RFC 792
2 0x02 IGMP 因特网组管理协议(IGMP) RFC 1112
3 0x03 GGP 网关对网关协议 RFC 823
4 0x04 IPv4 IPv4 (封装) RFC 791
5 0x05 ST 因特网流协议 RFC 1190, RFC 1819
6 0x06 TCP 传输控制协议(TCP) RFC 793
7 0x07 CBT 有核树组播路由协议 RFC 2189
8 0x08 EGP 外部网关协议 RFC 888
9 0x09 IGP 内部网关协议(任意私有内部网关(用于思科的IGRP))
10 0x0A BBN-RCC-MON BBN RCC 监视
11 0x0B NVP-II 网络语音协议 RFC 741
12 0x0C PUP Xerox PUP
13 0x0D ARGUS ARGUS
14 0x0E EMCON EMCON
15 0x0F XNET Cross Net Debugger IEN 158
16 0x10 CHAOS Chaos
17 0x11 UDP 用户数据报协议(UDP) RFC 768
18 0x12 MUX Multiplexing IEN 90
19 0x13 DCN-MEAS DCN Measurement Subsystems
20 0x14 HMP Host Monitoring Protocol RFC 869
21 0x15 PRM Packet Radio Measurement
22 0x16 XNS-IDP XEROX NS IDP
23 0x17 TRUNK-1 Trunk-1
24 0x18 TRUNK-2 Trunk-2
25 0x19 LEAF-1 Leaf-1
26 0x1A LEAF-2 Leaf-2
27 0x1B RDP Reliable Datagram Protocol RFC 908
28 0x1C IRTP Internet Reliable Transaction Protocol RFC 938
29 0x1D ISO-TP4 ISO Transport Protocol Class 4 RFC 905
30 0x1E NETBLT Bulk Data Transfer Protocol RFC 998
31 0x1F MFE-NSP MFE Network Services Protocol
32 0x20 MERIT-INP MERIT Internodal Protocol
33 0x21 DCCP Datagram Congestion Control Protocol RFC 4340
34 0x22 3PC Third Party Connect Protocol
35 0x23 IDPR Inter-Domain Policy Routing Protocol RFC 1479
36 0x24 XTP Xpress Transport Protocol
37 0x25 DDP Datagram Delivery Protocol
38 0x26 IDPR-CMTP IDPR Control Message Transport Protocol
39 0x27 TP++ TP++ Transport Protocol
40 0x28 IL IL Transport Protocol
41 0x29 IPv6 IPv6 Encapsulation RFC 2473
42 0x2A SDRP Source Demand Routing Protocol RFC 1940
43 0x2B IPv6-Route Routing Header for IPv6 RFC 2460
44 0x2C IPv6-Frag Fragment Header for IPv6 RFC 2460
45 0x2D IDRP Inter-Domain Routing Protocol
46 0x2E RSVP Resource Reservation Protocol RFC 2205
47 0x2F GRE 通用路由封装(GRE) RFC 2784, RFC 2890
48 0x30 MHRP Mobile Host Routing Protocol
49 0x31 BNA BNA
50 0x32 ESP 封装安全协议(ESP) RFC 4303
51 0x33 AH 认证头协议(AH) RFC 4302
52 0x34 I-NLSP Integrated Net Layer Security Protocol TUBA
53 0x35 SWIPE SwIPe IP with Encryption
54 0x36 NARP NBMA Address Resolution Protocol RFC 1735
55 0x37 MOBILE IP Mobility (Min Encap) RFC 2004
56 0x38 TLSP Transport Layer Security Protocol (using Kryptonet key management)
57 0x39 SKIP Simple Key-Management for Internet Protocol RFC 2356
58 0x3A IPv6-ICMP 互联网控制消息协议第六版(ICMPv6) RFC 4443, RFC 4884
59 0x3B IPv6-NoNxt No Next Header for IPv6 RFC 2460
60 0x3C IPv6-Opts Destination Options for IPv6 RFC 2460
61 0x3D Any host internal protocol
62 0x3E CFTP CFTP
63 0x3F Any local network
64 0x40 SAT-EXPAK SATNET and Backroom EXPAK
65 0x41 KRYPTOLAN Kryptolan
66 0x42 RVD MIT Remote Virtual Disk Protocol
67 0x43 IPPC Internet Pluribus Packet Core
68 0x44 Any distributed file system
69 0x45 SAT-MON SATNET Monitoring
70 0x46 VISA VISA Protocol
71 0x47 IPCV Internet Packet Core Utility
72 0x48 CPNX Computer Protocol Network Executive
73 0x49 CPHB Computer Protocol Heart Beat
74 0x4A WSN Wang Span Network
75 0x4B PVP Packet Video Protocol
76 0x4C BR-SAT-MON Backroom SATNET Monitoring
77 0x4D SUN-ND SUN ND PROTOCOL-Temporary
78 0x4E WB-MON WIDEBAND Monitoring
79 0x4F WB-EXPAK WIDEBAND EXPAK
80 0x50 ISO-IP International Organization for Standardization Internet Protocol
81 0x51 VMTP Versatile Message Transaction Protocol RFC 1045
82 0x52 SECURE-VMTP Secure Versatile Message Transaction Protocol RFC 1045
83 0x53 VINES VINES
84 0x54 TTP TTP
84 0x54 IPTM Internet Protocol Traffic Manager
85 0x55 NSFNET-IGP NSFNET-IGP
86 0x56 DGP Dissimilar Gateway Protocol
87 0x57 TCF TCF
88 0x58 EIGRP 增强型内部网关路由协议(EIGRP)
89 0x59 OSPF 开放式最短路径优先(OSPF) RFC 1583
90 0x5A Sprite-RPC Sprite RPC Protocol
91 0x5B LARP Locus Address Resolution Protocol
92 0x5C MTP Multicast Transport Protocol
93 0x5D AX.25 AX.25
94 0x5E IPIP IP-within-IP Encapsulation Protocol RFC 2003
95 0x5F MICP Mobile Internetworking Control Protocol
96 0x60 SCC-SP Semaphore Communications Sec. Pro
97 0x61 ETHERIP Ethernet-within-IP Encapsulation RFC 3378
98 0x62 ENCAP Encapsulation Header RFC 1241
99 0x63 Any private encryption scheme
100 0x64 GMTP GMTP
101 0x65 IFMP Ipsilon Flow Management Protocol
102 0x66 PNNI PNNI over IP
103 0x67 PIM Protocol Independent Multicast
104 0x68 ARIS IBM’s ARIS (Aggregate Route IP Switching) Protocol
105 0x69 SCPS SCPS (Space Communications Protocol Standards) SCPS-TP[1]
106 0x6A QNX QNX
107 0x6B A/N Active Networks
108 0x6C IPComp IP Payload Compression Protocol RFC 3173
109 0x6D SNP Sitara Networks Protocol
110 0x6E Compaq-Peer Compaq Peer Protocol
111 0x6F IPX-in-IP IPX in IP
112 0x70 VRRP Virtual Router Redundancy Protocol, Common Address Redundancy Protocol (not IANA assigned) VRRP:RFC 3768
113 0x71 PGM PGM Reliable Transport Protocol RFC 3208
114 0x72 Any 0-hop protocol
115 0x73 L2TP Layer Two Tunneling Protocol Version 3 RFC 3931
116 0x74 DDX D-II Data Exchange (DDX)
117 0x75 IATP Interactive Agent Transfer Protocol
118 0x76 STP Schedule Transfer Protocol
119 0x77 SRP SpectraLink Radio Protocol
120 0x78 UTI Universal Transport Interface Protocol
121 0x79 SMP Simple Message Protocol
122 0x7A SM Simple Multicast Protocol draft-perlman-simple-multicast-03
123 0x7B PTP Performance Transparency Protocol
124 0x7C IS-IS over IPv4 Intermediate System to Intermediate System (IS-IS) Protocol over IPv4 RFC 1142 and RFC 1195
125 0x7D FIRE Flexible Intra-AS Routing Environment
126 0x7E CRTP Combat Radio Transport Protocol
127 0x7F CRUDP Combat Radio User Datagram
128 0x80 SSCOPMCE Service-Specific Connection-Oriented Protocol in a Multilink and Connectionless Environment ITU-T Q.2111 (1999)
129 0x81 IPLT
130 0x82 SPS Secure Packet Shield
131 0x83 PIPE Private IP Encapsulation within IP Expired I-D draft-petri-mobileip-pipe-00.txt
132 0x84 SCTP Stream Control Transmission Protocol
133 0x85 FC Fibre Channel
134 0x86 RSVP-E2E-IGNORE Reservation Protocol (RSVP) End-to-End Ignore RFC 3175
135 0x87 Mobility Header Mobility Extension Header for IPv6 RFC 6275
136 0x88 UDPLite Lightweight User Datagram Protocol RFC 3828
137 0x89 MPLS-in-IP Multiprotocol Label Switching Encapsulated in IP RFC 4023
138 0x8A manet MANET Protocols RFC 5498
139 0x8B HIP Host Identity Protocol RFC 5201
140 0x8C Shim6 Site Multihoming by IPv6 Intermediation RFC 5533
141 0x8D WESP Wrapped Encapsulating Security Payload RFC 5840
142 0x8E ROHC Robust Header Compression RFC 5856
143-252 0x8F-0xFC UNASSIGNED
253-254 0xFD-0xFE Use for experimentation and testing RFC 3692
255 0xFF Reserved.

IP选项

Linux内核IP选项如下

常量 类型 含义
IPOPT_END 0 选型表结尾
IPOPT_NOOP 1 无操作
IPOPT_SEC 130 基础安全
IPOPT_LSRR 131 宽松源路径选站
IPOPT_TIMESTAMP 68 时间戳
IPOPT_CIPSO 134
IPOPT_RR 7 路由记录
IPOPT_SID 136 流标识符
IPOPT_SSRR 137 严格源路径选站
IPOPT_RA 148

IP选项内核结构体如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct ip_options {
__be32 faddr;
__be32 nexthop;
unsigned char optlen;
unsigned char srr;
unsigned char rr;
unsigned char ts;
unsigned char is_strictroute:1,
srr_is_hit:1,
is_changed:1,
rr_needaddr:1,
ts_needtime:1,
ts_needaddr:1;
unsigned char router_alert;
unsigned char cipso;
unsigned char __pad2;
unsigned char __data[0];
};

ICMP报文格式

TCP报文格式

TCP报文格式

TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。

参数 含义
源端口 源端口和IP地址的作用是标识报文的返回地址。
目的端口 端口指明接收方计算机上的应用程序接口。
序号 本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
确认号 ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。
数据偏移 4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何可选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
保留 为将来定义新的用途保留,现在一般置0。
控制位 URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
窗口 滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
校验和 奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
紧急指针 只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
选项和填充 最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据部分 TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
struct tcphdr {
__be16 source;
__be16 dest;
__be32 seq;
__be32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:4,
doff:4,
fin:1,
syn:1,
rst:1,
psh:1,
ack:1,
urg:1,
ece:1,
cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:4,
res1:4,
cwr:1,
ece:1,
urg:1,
ack:1,
psh:1,
rst:1,
syn:1,
fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__be16 window;
__sum16 check;
__be16 urg_ptr;
};

UDP报文格式

UDP报文格式

1
2
3
4
5
6
struct udphdr {
__be16 source;
__be16 dest;
__be16 len;
__sum16 check;
};

优秀资料

学习整理——以太帧、ip帧、udp/tcp帧、http报文结构

ARP 协议详解 ARP报文结构

IP数据包格式