协议报文格式

以太网帧格式

以太网帧因为历史原因存在多个版本,这里最常用的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协议号

十进制十六进制关键字协议引用
00x00HOPOPTIPv6逐跳选项RFC 2460
10x01ICMP互联网控制消息协议(ICMP)RFC 792
20x02IGMP因特网组管理协议(IGMP)RFC 1112
30x03GGP网关对网关协议RFC 823
40x04IPv4IPv4 (封装)RFC 791
50x05ST因特网流协议RFC 1190, RFC 1819
60x06TCP传输控制协议(TCP)RFC 793
70x07CBT有核树组播路由协议RFC 2189
80x08EGP外部网关协议RFC 888
90x09IGP内部网关协议(任意私有内部网关(用于思科的IGRP))
100x0ABBN-RCC-MONBBN RCC 监视
110x0BNVP-II网络语音协议RFC 741
120x0CPUPXerox PUP
130x0DARGUSARGUS
140x0EEMCONEMCON
150x0FXNETCross Net DebuggerIEN 158
160x10CHAOSChaos
170x11UDP用户数据报协议(UDP)RFC 768
180x12MUXMultiplexingIEN 90
190x13DCN-MEASDCN Measurement Subsystems
200x14HMPHost Monitoring ProtocolRFC 869
210x15PRMPacket Radio Measurement
220x16XNS-IDPXEROX NS IDP
230x17TRUNK-1Trunk-1
240x18TRUNK-2Trunk-2
250x19LEAF-1Leaf-1
260x1ALEAF-2Leaf-2
270x1BRDPReliable Datagram ProtocolRFC 908
280x1CIRTPInternet Reliable Transaction ProtocolRFC 938
290x1DISO-TP4ISO Transport Protocol Class 4RFC 905
300x1ENETBLTBulk Data Transfer ProtocolRFC 998
310x1FMFE-NSPMFE Network Services Protocol
320x20MERIT-INPMERIT Internodal Protocol
330x21DCCPDatagram Congestion Control ProtocolRFC 4340
340x223PCThird Party Connect Protocol
350x23IDPRInter-Domain Policy Routing ProtocolRFC 1479
360x24XTPXpress Transport Protocol
370x25DDPDatagram Delivery Protocol
380x26IDPR-CMTPIDPR Control Message Transport Protocol
390x27TP++TP++ Transport Protocol
400x28ILIL Transport Protocol
410x29IPv6IPv6 EncapsulationRFC 2473
420x2ASDRPSource Demand Routing ProtocolRFC 1940
430x2BIPv6-RouteRouting Header for IPv6RFC 2460
440x2CIPv6-FragFragment Header for IPv6RFC 2460
450x2DIDRPInter-Domain Routing Protocol
460x2ERSVPResource Reservation ProtocolRFC 2205
470x2FGRE通用路由封装(GRE)RFC 2784, RFC 2890
480x30MHRPMobile Host Routing Protocol
490x31BNABNA
500x32ESP封装安全协议(ESP)RFC 4303
510x33AH认证头协议(AH)RFC 4302
520x34I-NLSPIntegrated Net Layer Security ProtocolTUBA
530x35SWIPESwIPeIP with Encryption
540x36NARPNBMA Address Resolution ProtocolRFC 1735
550x37MOBILEIP Mobility (Min Encap)RFC 2004
560x38TLSPTransport Layer Security Protocol (using Kryptonet key management)
570x39SKIPSimple Key-Management for Internet ProtocolRFC 2356
580x3AIPv6-ICMP互联网控制消息协议第六版(ICMPv6)RFC 4443, RFC 4884
590x3BIPv6-NoNxtNo Next Header for IPv6RFC 2460
600x3CIPv6-OptsDestination Options for IPv6RFC 2460
610x3DAny host internal protocol
620x3ECFTPCFTP
630x3FAny local network
640x40SAT-EXPAKSATNET and Backroom EXPAK
650x41KRYPTOLANKryptolan
660x42RVDMIT Remote Virtual Disk Protocol
670x43IPPCInternet Pluribus Packet Core
680x44Any distributed file system
690x45SAT-MONSATNET Monitoring
700x46VISAVISA Protocol
710x47IPCVInternet Packet Core Utility
720x48CPNXComputer Protocol Network Executive
730x49CPHBComputer Protocol Heart Beat
740x4AWSNWang Span Network
750x4BPVPPacket Video Protocol
760x4CBR-SAT-MONBackroom SATNET Monitoring
770x4DSUN-NDSUN ND PROTOCOL-Temporary
780x4EWB-MONWIDEBAND Monitoring
790x4FWB-EXPAKWIDEBAND EXPAK
800x50ISO-IPInternational Organization for Standardization Internet Protocol
810x51VMTPVersatile Message Transaction ProtocolRFC 1045
820x52SECURE-VMTPSecure Versatile Message Transaction ProtocolRFC 1045
830x53VINESVINES
840x54TTPTTP
840x54IPTMInternet Protocol Traffic Manager
850x55NSFNET-IGPNSFNET-IGP
860x56DGPDissimilar Gateway Protocol
870x57TCFTCF
880x58EIGRP增强型内部网关路由协议(EIGRP)
890x59OSPF开放式最短路径优先(OSPF)RFC 1583
900x5ASprite-RPCSprite RPC Protocol
910x5BLARPLocus Address Resolution Protocol
920x5CMTPMulticast Transport Protocol
930x5DAX.25AX.25
940x5EIPIPIP-within-IP Encapsulation ProtocolRFC 2003
950x5FMICPMobile Internetworking Control Protocol
960x60SCC-SPSemaphore Communications Sec. Pro
970x61ETHERIPEthernet-within-IP EncapsulationRFC 3378
980x62ENCAPEncapsulation HeaderRFC 1241
990x63Any private encryption scheme
1000x64GMTPGMTP
1010x65IFMPIpsilon Flow Management Protocol
1020x66PNNIPNNI over IP
1030x67PIMProtocol Independent Multicast
1040x68ARISIBM’s ARIS (Aggregate Route IP Switching) Protocol
1050x69SCPSSCPS (Space Communications Protocol Standards)SCPS-TP[1]
1060x6AQNXQNX
1070x6BA/NActive Networks
1080x6CIPCompIP Payload Compression ProtocolRFC 3173
1090x6DSNPSitara Networks Protocol
1100x6ECompaq-PeerCompaq Peer Protocol
1110x6FIPX-in-IPIPX in IP
1120x70VRRPVirtual Router Redundancy Protocol, Common Address Redundancy Protocol (not IANA assigned)VRRP:RFC 3768
1130x71PGMPGM Reliable Transport ProtocolRFC 3208
1140x72Any 0-hop protocol
1150x73L2TPLayer Two Tunneling Protocol Version 3RFC 3931
1160x74DDXD-II Data Exchange (DDX)
1170x75IATPInteractive Agent Transfer Protocol
1180x76STPSchedule Transfer Protocol
1190x77SRPSpectraLink Radio Protocol
1200x78UTIUniversal Transport Interface Protocol
1210x79SMPSimple Message Protocol
1220x7ASMSimple Multicast Protocoldraft-perlman-simple-multicast-03
1230x7BPTPPerformance Transparency Protocol
1240x7CIS-IS over IPv4Intermediate System to Intermediate System (IS-IS) Protocol over IPv4RFC 1142 and RFC 1195
1250x7DFIREFlexible Intra-AS Routing Environment
1260x7ECRTPCombat Radio Transport Protocol
1270x7FCRUDPCombat Radio User Datagram
1280x80SSCOPMCEService-Specific Connection-Oriented Protocol in a Multilink and Connectionless EnvironmentITU-T Q.2111 (1999)
1290x81IPLT
1300x82SPSSecure Packet Shield
1310x83PIPEPrivate IP Encapsulation within IPExpired I-D draft-petri-mobileip-pipe-00.txt
1320x84SCTPStream Control Transmission Protocol
1330x85FCFibre Channel
1340x86RSVP-E2E-IGNOREReservation Protocol (RSVP) End-to-End IgnoreRFC 3175
1350x87Mobility HeaderMobility Extension Header for IPv6RFC 6275
1360x88UDPLiteLightweight User Datagram ProtocolRFC 3828
1370x89MPLS-in-IPMultiprotocol Label Switching Encapsulated in IPRFC 4023
1380x8AmanetMANET ProtocolsRFC 5498
1390x8BHIPHost Identity ProtocolRFC 5201
1400x8CShim6Site Multihoming by IPv6 IntermediationRFC 5533
1410x8DWESPWrapped Encapsulating Security PayloadRFC 5840
1420x8EROHCRobust Header CompressionRFC 5856
143-2520x8F-0xFCUNASSIGNED
253-2540xFD-0xFEUse for experimentation and testingRFC 3692
2550xFFReserved.

IP选项

Linux内核IP选项如下

常量类型含义
IPOPT_END0选型表结尾
IPOPT_NOOP1无操作
IPOPT_SEC130基础安全
IPOPT_LSRR131宽松源路径选站
IPOPT_TIMESTAMP68时间戳
IPOPT_CIPSO134
IPOPT_RR7路由记录
IPOPT_SID136流标识符
IPOPT_SSRR137严格源路径选站
IPOPT_RA148

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数据包格式