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

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

IPV4报文格式
IP数据包由首部和数据两部分组成。首部的前一部分是固定长度,共 20 字节,是所有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 | //ip 头部结构体 |
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 | struct ip_options { |
ICMP报文格式
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 | struct tcphdr { |
UDP报文格式

1 | struct udphdr { |