注:本文为 “以太网帧、IP数据报”图解相关文章合辑。
未整理去重。
以太网帧、IP 数据报的图解格式(包含相关例题讲解)
jueyuanfengsheng2023-08-07 11:49
一、基础知识
UDP 段、IP 数据包,以太网帧图示
通信过程中,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示。
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。
第三行是以太网帧数据包的基本格式。
测试环境
机器名 | mac | ip | port |
---|---|---|---|
tcp_server | 00:0c:29:8b:37:da | 10.1.2.7 | 9502 |
tcp_client | 00:50:56:c0:00:08 | 10.1.2.1 | 12345 |
抓包 客户端向服务端发送 'hello world’
原始数据帧
00 0c 29 8b 37 da 00 50 56 c0 00 08 08 00 # Ethernet_II 格式数据帧首部
45 00 00 33 28 5b 40 00 80 06 ba 80 0a 01 02 01 0a 01 02 07 # ip 协议头
30 39 25 1e 84 a4 e6 82 cf f2 ea 28 50 18 10 0a 7b 45 00 00 # tcp 协议头
68 65 6c 6c 6f 20 77 6f 72 6c 64 # data
以太网数据帧构成
Ethernet_II 格式、数据帧首部 链路层
总长度 14B
以太网帧图示
其中,以太网首部占用 14 字节、FCS(Frame Check Sequece)(帧校验码) 长 4 个字节,用于检验数据在传输过程中数据是否出现了错误,为 CRC32 校验码。
以太网首部占用 14 字节,首位开始是目的地址占用六个字节,其次是源地址,占用 6 个字节,然后是类型占用两个字节。以太网帧除去首部 14 字节和尾部 FCS,4 字节,(共 18 字节)剩下的中间的部分就是 IP 数据报
字段名称 | 长度(byte) | 含义 |
---|---|---|
D.MAC | 6 | 接收方 MAC 地址,网络包接收方的 MAC 地址,在局域网中使用这一地址来传输网络包 |
S.MAC | 6 | 网络包发送方 MAC 地址,接收方通过它来判断是谁发送了这个包 |
Type | 2 | 使用的协议类型 TCP 通信中 IP 协议与 ARP 协议较常见 0000-05DC:IEEE802.3 0800:IP 协议 0806:ARP 协议 86DD:IPv6 |
以太网帧格式
目的 MAC 地址(6 字节) | 源 MAC 地址(6 字节) | 类型(2 字节) | 数据(45–1500 字节) | CRC |
---|
- IP 数据报
目的 MAC 地址(6B) | 源 MAC 地址(6B) | 类型 0x0800 | IP 数据包 | CRC |
---|
- ARP 请求应答
目的 MAC 地址(6B) | 源 MAC 地址(6B) | 类型 0x0806 | ARP 请求应答(28B) | CRC |
---|
- RARP 请求应答
目的 MAC 地址(6B) | 源 MAC 地址(6B) | 类型 0x0835 | RARP 请求应答 | CRC |
---|
ICMP 协议:差错控制协议
ARP 协议:地址解析协议
实例
Ethernet_II 格式数据帧首部 14 bytes
00 0c 29 8b 37 da # 目标 MAC 地址 00:0c:29:8b:37:da
00 50 56 c0 00 08 # 源 MAC 地址 00:50:56:c0:00:08
08 00 # IP 协议
IP 协议数据包首部 网络层
总长度 20B+
IP 数据报格式如下图所示,IP 数据报文由首部(称为报头)和数据两部分组成。首部的前一部分是固定长度,共 20 字节(如图所示前五行为 IP 首部),是所有 IP 数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
实例
ip 协议头 20 字节
4 # 协议版本 ipv4
5 # ip 协议头长度 5 * 4 = 20 字节
00 # 服务类型 000-0-0-0-0-0
00 33 # ip 包总长度 hex => dec 51 字节
28 5b # ID 号
40 00 # 标志与分片偏移量 0100 0000 0000 0000 DF 位为 1 不允许分包 偏移量为 0
80 # 生存时间 dec 128
06 # 协议号 TCP 协议
ba 80 # 头部校验和
0a 01 02 01 # 发送方 ip 10.1.2.1
0a 01 02 07 # 接收方 ip 10.1.2.7
ip 协议头 头部校验和计算方法
- 头部校验和置 0;
- 对 IP 头部中的每 16bit 进行二进制求和;
- 如果和的高 16bit 不为 0,则将和的高 16bit 和低 16bit 反复相加,直到和的高 16bit 为 0,从而获得一个 16bit 的 值;
- 将该 16bit 的值取反,存入校验和字段。
TCP 协议头 传输层
图示
总长度 20B+
实例
tcp 协议头 20 字节
30 39 # 源端口 12345
25 1e # 目的端口 9502
84 a4 e6 82 # 序列号
cf f2 ea 28 # 确认序列号
5 # 首部长度 5 * 32 / 8 = 20 bytes
0 1 8 # 000000 保留 011000 ACK=1 PSH=1
10 0a # 窗口大小 4106
7b 45 # 校验和
00 00 # URG=0 无效
传输的数据
68 65 6c 6c 6f 20 77 6f 72 6c 64 # ascii 码
hello world
附录
每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。举例来说,现在收到了 4 号包,但是没有收到 5 号包。ACK 就会记录,期待收到 5 号包。过了一段时间,5 号包收到了,那么下一轮 ACK 会更新编号。如果 5 号包还是没收到,但是收到了 6 号包或 7 号包,那么 ACK 里面的编号不会变化,总是显示 5 号包。这会导致大量重复内容的 ACK。如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即 5 号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。
UDP 协议
例题讲解
填空题 20 分
现获取了 3 个以太网帧 Frame₁、Frame₂、Frame₃,假设这些以太网帧通过了错误检测,用十六进制表示的帧内容如下:
Frame#1 Server → Client
00 80 c8 5a e3 88 00 60 2f 87 01 03 08 00 45 08
00 2c d1 22 40 00 3f 06 8a 27 8c 80 63 05 8c 80
64 74 00 14 02 66 aa a1 20 8d 00 00 00 00 60 02
40 00 5e 3c 00 00 02 04 05 b4
Frame#2 Client → Server
00 60 2f 87 01 03 00 80 c8 5a e3 88 08 00 45 00
00 2c 81 0e 40 00 80 06 99 43 8c 80 64 74 8c 80
63 05 02 66 00 14 12 38 bb 3e aa a1 20 8e 60 12
22 38 c0 7c 00 00 02 04 05 b4
Frame#3 Server → Client
00 80 c8 5a e3 88 00 60 2f 87 01 03 08 00 45 08
00 28 d1 23 40 00 3f 06 8a 2a 8c 80 63 05 8c 80
64 74 00 14 02 66 aa a1 19 8e 12 38 bb 3f 50 10
44 70 b6 01 00 00
这 3 个数据包主要用于建立一个 TCP 连接,根据协议的封装关系,以及各层数据包格式的结构,对这些数据包进行分析,回答如下问题:
(1) Client 端和 Server 端的以太网网卡 48 位地址是〔填空 1〕和〔填空 2〕
(2) Frame#1 帧中封装的 IP 分组的总长度〔填空 3〕 首部长度〔填空 4〕 IP 数据长度〔填空 5〕
(3) Client 端和 Server 端的 32 位 IP 地址(用点分十进制格式表示)〔填空 6〕和〔填空 7〕
(4) Frame#1 帧中封装的 IP 分组的生存时间值是〔填空 8〕 协议字段值是〔填空 9〕
(5) IP 分组中封装的是〔填空 10〕的数据
答案
填空 1:00-80-c8-5a-e3-88
填空 2:00-60-2f-87-01-03
填空 3:44
填空 4:20
填空 5:24
填空 6:140.128.100.116
填空 7:140.128.99.5
填空 8:63
填空 9:6
填空 10:tcp
解析(本文文字版解析)
(1) Client 段和 Server 段的以太网网卡 48 位地址是 [填空 1] 和 [填空 2]
根据以太网数据帧(OSI 二层)的数据包头部,分别是目的 MAC 地址(6 字节)、源 MAC 地址(6 字节)、类型(2 字节),所以根据上图 Frame#1 帧中的前 6 个字节是 Client MAC 地址,紧接着 6 个字节是 Server 端地址。
分别是:
填空 1:00-80-c8-5a-e3-88
填空 2:00-60-2f-87-01-03
(2) Frame#1 帧中封装的 IP 分组的总长度 [填空 3] 44 B
首部长度 [填空 4] 20 B
IP 数据长度 [填空 5] 24 B
Frame1 帧总长度 58 字节,由于题干说,已通过侦差错校验,所以这个以太网帧不包含 FCS 帧(4 字节) ,所以 IP 数据报的长度应该是 Frame1 帧总长度 58 字节减去以太网帧首部 14 字节,IP 分组的长度应该是 44 字节,IP 首部长度是固定不变的 20B(记下来就行),IP 数据部分长度是 44B-20B=24B
(3) Client 段和 Server 段的 32 位 IP 地址(用点分十进制格式表示)[填空 6] 和 [填空 7]。
根据 Ip 数据包的 20 字节长度中 IP 地址的排列位置,可知源 Ip 地址(4 字节)和目的 IP 地址(4 字节)分别在 20 字节的后八个字节中。58-14-20+8=32,从 Frame#1 帧中的倒数第 32 个字节(两个 16 进制数是 1 个字节)往后数 8 个字节。
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 a b c d e f
IP 首部 20 个字节
58 - 14B(帧首部)= 44 字节(IP 数据包)= 20 字节(IP 首部)+ 24(上层数据 udp/tcp)
8c 80 63 05 # client Ip 地址 140.128.99.5
10001100 10000000 01100011 00000101
140 128 99 5
8c 80 64 74 # server IP 地址 140.128.100.116
10001100 10000000 01100100 01110100
140 128 100 116
(4) Frame#1 帧中封装的 IP 分组和生存时间值是 [填空 8] 协议字段值是 [填空 9]。# 63 6
先从 Frame#1 帧中找到生存时间值(1 个字节)对应的十六进制数,14 + 4 + 4 = 22,Frame#1 帧中的第 23 个字节就是 TTL 了。TTL 的十六进制数为 3f (0011 1111), 转换成十进制为 (2^6 - 1=63)
协议字段(1 字节)值的十六进制数为 06,就是十进制的 6 了。
(5) IP 分组中封装的是 [填空 10] 的数据 # tcp
由于本题建立的是 TCP 链接,所以以太网帧封装的是 TCP 段。
58 - 14(Frame 帧头) - 20(IP 包头) = 24 字节
24 字节 - 20 字节(TCP 头部长度) = 4 (应用层数据),也即是 seq(4 字节),就是 TCP 三次握手中的第一次(请求建立连接的一方)
解析(另一篇文章同一题目的图文版解析)
首先要知道,一个十六进制数字代表 4 位,如图所示前三坨数字,00 80 c8,就是三个字节。
(1)注意图中红色部分以太网帧首部,最前六个字节是目的地址:00 - 80 - c8 - 5a - e3 - 88,注意到 Frame1 的右侧,Sever -> Client, 所以 Client 是目的地址,以太网 48 位网卡地址是:00 - 80 - c8 - 5a - e3 - 88。
中间的六个字节是源地址:00 - 60 - 2f - 87 - 01 - 03,注意到 Frame1 的右侧,Sever -> Client, 所以 Sever 是源地址,以太网 48 位网卡地址是:00 - 60 - 2f - 87 - 01 - 03。
(2)Frame1 帧总长度 58 字节,由于题干说,已通过侦差错校验,所以这个以太网帧不包含 FCS 帧(4 字节),所以 IP 数据报的长度应该是 Frame1 帧总长度 58 字节减去以太网帧首部 14 字节,IP 分组的长度应该是 44 字节,IP 首部长度是固定不变的 20B(记下来就行),IP 数据部分长度是 44B - 20B = 24B
(3)Sever 和 Client
如图所示的蓝色部分是 IP 首部,对应下面的 IP 首部示意图,可以看到从最后一条蓝色实线往前数 4 个字节是目的 IP 地址 8c.80.64.74,再往前数四个字节是源 IP 地址 8c.80.63.05,注意到 Frame1 的右侧,Sever (源:8c.80.63.05) -> Client(目的:8c.80.64.74), 再将 16 进制转为 10 进制,举例讲解一个:8c.80.63.05 -> 140.128.99.5,8c = 8×16 + 12×1,80 = 8×15 + 0×1 ,63 = 6×16 + 3×1,05 = 0×16 + 5×1。
(4)对应上面的 IP 首部示意图,可以查出来绿色 3f 是生存时间,黄色 06 是协议,再转为 10 进制,就是结果了。
(5)由于本题建立的是 TCP 链接,所以以太网帧封装的是 TCP 段。
以太网数据帧详细解析 逐字节分析
Qazink 于 2020 - 08 - 25 21:18:49 发布
详细解析以太网通信数据帧
测试环境
机器名 | mac | ip | port |
---|---|---|---|
tcp_server | 00:0c:29:8b:37:da | 10.1.2.7 | 9502 |
tcp_client | 00:50:56:c0:00:08 | 10.1.2.1 | 12345 |
抓包 客户端向服务端发送 'hello world’
原始数据帧
00 0c 29 8b 37 da 00 50 56 c0 00 08 08 00 # Ethernet_II 格式数据帧首部
45 00 00 33 28 5b 40 00 80 06 ba 80 0a 01 02 01 0a 01 02 07 # ip 协议头
30 39 25 1e 84 a4 e6 82 cf f2 ea 28 50 18 10 0a 7b 45 00 00 # tcp 协议头
68 65 6c 6c 6f 20 77 6f 72 6c 64 # data
以太网数据帧构成
Ethernet_II 格式数据帧首部 链路层
总长度 14B
字段名称 | 长度 (byte) | 含义 |
---|---|---|
D.MAC | 6 | 接收方 MAC 地址,网络包接收方的 MAC 地址,在局域网中使用这一地址来传输网络包 |
S.MAC | 6 | 网络包发送方 MAC 地址,接收方通过它来判断是谁发送了这个包 |
Type | 2 | 使用的协议类型。 TCP 通信中 IP 协议与 ARP 协议较常见 0000 - 05DC:IEEE 802.3 0800 :IP 协议 0806 :ARP 协议 86DD :IPv6 |
实例
Ethernet_II 格式数据帧首部 14 bytes
00 0c 29 8b 37 da # 目标 MAC 地址 00:0c:29:8b:37:da
00 50 56 c0 00 08 # 源 MAC 地址 00:50:56:c0:00:08
08 00 # IP 协议
IP 协议数据包首部 网络层
总长度 20B+
字段名称 | 长度 (bit) | 含义 |
---|---|---|
版本号 (Version) | 4 | 协议的版本一般的值为 0100(IPv4), 0110(IPv6) |
头部长度(IHL) | 4 | Header Length, 描述 IP 包头的长度, 因为在 IP 包头中有变长的可选部分。 长度 = 值 × 4, 4bit 最大 ‘1111’ = 15, IP 头长度为 20 - 60 (15 × 4) 字节 |
服务类型(ToS) | 8 | 服务类型(Type of Service,TOS)字段共 8 位,其位定义如下:PPP DTRC0 - PPP(优先级,Precedence): 定义数据包的优先级,数值越大,优先级越高。 - 000:常规(Routine) - 001:优先(Priority) - 010:立即(Immediate) - 011:紧急(Flash) - 100:特急(Flash Override) - 101:关键/紧急/加密(CRI/TIC/ECP) - 110:网间互联控制(Internetwork Control) - 111:网络控制(Network Control) - D(延迟,Delay): - 0:常规延迟 - 1:低延迟(Minimize Delay) - T(吞吐量,Throughput): - 0:常规吞吐量 - 1:高吞吐量(Maximize Throughput) - R(可靠性,Reliability): - 0:常规可靠性 - 1:高可靠性(Maximize Reliability) - C(成本,Cost): - 0:常规成本 - 1:低成本(Minimize Monetary Cost) - 0(保留位,Reserved): 始终为 0。 |
总长度 | 16 | Total Length IP 包总长度 以字节为单位计算的 IP 包的长度 (包括头部和数据),所以 IP 包最大长度 65535 字节 |
ID 号 | 16 | 该字段和 Flag 和 Fragment Offest 字段联合使用,对较大的上层数据包进行分段(fragment)操作。 路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。 |
标志(Flags) | 3 | 长度 3 比特。 该字段第一位不使用。 第二位是 DF (Don’t Fragment)位,DF 位设为 1 时表明路由器不能对该 上层数据包分段。如果一个上层数据包无法在不分段的情况 下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。 第三位是 MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的 IP 包 的包头中将 MF 位设为 1。 |
分片偏移量 | 13 | Fragment Offest 表示该 IP 包在该组分片包中位置,接收端 靠此来组装还原 IP 包。 |
生存时间(TTL) | 8 | 当 IP 包进行传送时,先会对该字段赋予某个特定的值。 当 IP 包经过每一个沿途的路由器的时候,每个沿途的路由器会将 IP 包的 TTL 值减少 1。 如果 TTL 减少为 0,则该 IP 包会被丢弃。 这个字段可以防止由于路由环路而导致 IP 包在网络中不停被转发。 |
协议号 | 8 | 标识了上层所使用的协议。以下是比较常用的协议号: 1 ICMP 2 IGMP 6 TCP 17 UDP 88 IGRP 89 OSPF |
头部校验和 | 16 | Header Checksum 用来做 IP 头部的正确性检测,但不包含数据部分。 因为每个 路由器要改变 TTL 的值,所以路由器会为每个通过的数据包重 新计算这个值。 |
发送方 IP 地址 | 32 | Source Addresses 发送方 IP 地址。除非使用 NAT,否则 整个传输的过程中,这两个地址不会改变 |
接收方 IP 地址 | 32 | Destination Addresses 接收方 IP 地址。除非使用 NAT,否则 整个传输的过程中,这两个地址不会改变 |
可选字段 | 一般测试使用 |
实例
ip 协议头 20 字节
4 # 协议版本 ipv4
5 # ip 协议头长度 5 × 4 = 20 字节
00 # 服务类型 000 - 0 - 0 - 0 - 0 - 0
00 33 # ip 包总长度 hex => dec 51 字节
28 5b # ID 号
40 00 # 标志与分片偏移量 0100 0000 0000 0000 DF 位为 1 不允许分包 偏移量为 0
80 # 生存时间 dec 128
06 # 协议号 TCP 协议
ba 80 # 头部校验和
0a 01 02 01 # 发送方 ip 10.1.2.1
0a 01 02 07 # 接收方 ip 10.1.2.7
ip 协议头 头部校验和计算方法
- 头部校验和置 0;
- 对 IP 头部中的每 16bit 进行二进制求和;
- 如果和的高 16bit 不为 0,则将和的高 16bit 和低 16bit 反复相加,直到和的高 16bit 为 0,从而获得一个 16bit 的 值;
- 将该 16bit 的值取反,存入校验和字段。
TCP 协议头 传输层
图示
总长度 20B+
字段名 | 长度 (bit) | 含义 |
---|---|---|
源端口号 | 16 | 发送网络包的程序的端口号 |
目的端口号 | 16 | 网络包的接收方程序的端口号 |
序列号 seq | 32 | 发送的时候,TCP 协议为每个包编号(sequence number, 简称 SEQ),以便接收的一方按照顺序还原。万一发生丢包 ,也可以知道丢失的是哪一个包。 当前序列号 + 数据长度 = 下一个包的序列号 |
确认序列号 ack | 32 | 期待要收到下一个数据包的编号,ack 与 seq 搭配确保数据的 完整性,确认号只有 ACK 位为 1 时才有效。 |
首部长度 (数据偏移量) | 4 | 表示数据部分的起始位置,也可以认为表示头部的长度 |
保留 | 6 | 保留,未使用 |
控制位 | 6 | 该字段中的每个比特分别表示以下通信控制含义。 URG:表示紧急指针字段有效 ACK:接收数据序号字段有效,一般表示数据已被接收方接收 该位只有在连接未建立时为 0,连接建立后始终为 1 PSH:表示通过 flush 操作发送的数据,指示接收方在接收到 该报文段以后,应尽快将这个报文段交给应用程序,而不是 在缓冲区排队。 RST:强制断开连接,用于异常中断的情况 SYN:同步序号,用于建立连接过程,在连接请求中发送 SYN = 1 和 ACK = 0, 应答 SYN = 1 和 ACK = 1 FIN:用于释放连接,为 1 时表示发送方已经没有数据发送了,即关闭本方数据流。 |
窗口 | 16 | 接收方告知发送方窗口大小(即无需等待确认可一起发送的数据量) |
校验和 | 16 | 用来检查是否出现错误 |
紧急指针 | 16 | 只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。 |
选项和填充 | 不定 | 最常见的可选字段是最长报文大小,又称为 MSS (Maximum Segment Size),每个连接方通常都在通 信的第一个报文段(为建立连接而设置 SYN 标志为 1 的那 个段)中指明这个选项,它表示本端所能接受的最大报 文段的长度。 选项长度不一定是 32 位的整数倍,所以要 加填充位,即在这个字段中加入额外的零,以保证 TCP 头是 32 的整数倍。 |
数据 | 可选 |
实例
tcp 协议头 20 字节
30 39 # 源端口 12345
25 1e # 目的端口 9502
84 a4 e6 82 # 序列号
cf f2 ea 28 # 确认序列号
5 # 首部长度 5 × 32 / 8 = 20 bytes
0 1 8 # 000000 保留 011000 ACK = 1 PSH = 1
10 0a # 窗口大小 4106
7b 45 # 校验和
00 00 # URG = 0 无效
传输的数据
68 65 6c 6c 6f 20 77 6f 72 6c 64 # ascii 码
hello world
附录
每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。举例来说,现在收到了 4 号包,但是没有收到 5 号包。ACK 就会记录,期待收到 5 号包。过了一段时间,5 号包收到了,那么下一轮 ACK 会更新编号。如果 5 号包还是没收到,但是收到了 6 号包或 7 号包,那么 ACK 里面的编号不会变化,总是显示 5 号包。这会导致大量重复内容的 ACK。如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即 5 号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。
UDP 协议
IPv4 数据报中的 DS、ECN 字段
原创 菜籽爱编程 2022-11-25 11:30:33
在讲 DS 字段和 ECN 字段之前,我们先来看一下原始的 服务类型 字段 [RFC0791]。
服务类型字段提供了所需服务质量的抽象参数的显示。当通过特定网络传输数据报时,这些参数将用于指示实际服务参数的选择。一些网络提供服务优先级,这在某种程度上将高优先级流量视为比其他流量更重要的流量。主要是在低延迟、高可靠性和高吞吐量之间进行三方权衡。
优先级 (Precedence) 子字段占 3
位,用于表示哪些分组具有更高优先级(较大的值意味着更高的优先级)。优先级取值范围为 000
到 111
,表示优先级从低到高。
下表为原始的 IPv4 服务类型优先级子字段值及对应的名称。
优先级子字段值 | 优先级名称 |
---|---|
000 | 常规 (Routine) |
001 | 优先 (Priority) |
010 | 立即 (Immediate) |
011 | 瞬间 (Flash) |
100 | 瞬间覆盖 (Flash Override) |
101 | 严重 (CRITIC/ECP) |
110 | 网间控制 (Internetwork Control) |
111 | 网络控制 (Network Control) |
D、T 和 R 子字段各占 1
位,分别用于表示 延时、吞吐量 和 可靠性。如果这些字段值为 1
,分别对应于低延时、高吞吐量和高可靠性。
子字段 | 值为 0 时 | 值为 1 时 |
---|---|---|
D | 正常延迟 | 低延迟 |
T | 正常吞吐量 | 高吞吐量 |
R | 正常可靠性 | 高可靠性 |
最后 2
位 保留 使用,默认值为 00
。
后来,在 IPv4 首部的第三字段,由原来的 8
位的服务类型字段划分为 6
位的 区分服务 (Differentiated Services, DS) 字段,和 2
位的 显式拥塞通知 (ECN) 字段 [RFC2474, RFC3168, RFC3260]。
区分服务是一个框架和一组标准,用于支持 Internet 上不同类型的服务。IP 数据报以某种方式(通过预定义模式设置某些位)被标记,使它们的转发不同于其他数据报。这样做可能导致网络中排队延时的增加或减少,以及出现其他特殊效果。DS 字段中的数字称为 区分服务代码点 (DSCP)。Codepoint(“代码点”)指的是预定义的具有特定含义的位。在通常情况下,如果数据报拥有一个分配的 DSCP,它在通过网络基础设施交付过程中会保持不变。但是,某些策略可能导致一个数据报中的 DSCP 在交付过程中改变。
当通过一台具有内部排队流量的路由器时,首部中的 2
位 ECN
位用于为数据报标记拥塞标识符。一台持续拥塞的具有 ECN 感知能力的路由器在转发分组时会设置这两位。这种功能的设计思路是,当一个被标记的分组被目的节点接收时,有些协议会发现分组被标记并将这种情况通知发送方,发送方随后会降低发送速度,这样可在路由器因过载而被迫丢弃流量之前缓解拥塞。这种机制是避免或处理网络拥塞的方法之一。
DS 字段的优先级定义在 [RFC2474] 中。6
位的 DS
字段用于保存 DSCP
,特定的 DSCP 值通知路由器对接收的数据报进行转发或特殊处理。不同类型的转发处理表示为 每跳行为 (PHB),因此 DSCP 值可有效通知路由器哪种 PHB 被应用于数据报。DSCP
的默认值通常为 0
。
DSCP 值被分成 3
个池:标准的、实验/本地用途的 (EXP/LU) 和最终打算标准化的 实验/本地用途的 (*)。
池 (Pool) | 代码点前缀 (Codepoint space) | 策略 (Assignment Policy) |
---|---|---|
1 | xxxxx0 | 标准的 (Standards Action) |
2 | xxxx11 | EXP/LU |
3 | xxxx01 | EXP/LU (*) |
以 0
作为结尾的 DSCP 用于 标准用途,以 1
作为结尾的 DSCP 用于 实验 或 本地用途。以 01
作为结尾的 DSCP 最初打算用于实验或本地用途,但最终会走向 标准化。
DS 字段的前 3
位为 类型 部分,此部分基于原始的服务类型的优先级子字段。
之后的 2
位为 丢弃概率,如果路由器被迫丢弃流量,允许路由器确定首先丢弃哪些流量。3
位的类别选择器提供了 8
个定义的代码点(称为类别选择代码点),它们对应于一个指定最小功能集的 PHB,提供与早期的 IP 优先级相似的功能。它们称为类别选择兼容的 PHB,目的是支持部分兼容的最初定义的 IP 优先级子字段 [RFC0791]。xxx000
形式的代码点总被映射为这种 PHB,但是其他值也可映射到相同 PHB。
类别选择器的 DSCP 值,以及 [RFC0791] 定义的 IP 优先级字段的相应术语。保证转发 (AF) 组对固定数量的独立 AF 类别的 IP 分组提供转发,它有效地概括了优先级的概念。某个类别的流量与其他类别的流量分别转发。在一个流量类别中,数据报被分配一个丢弃优先级。在一个类别中,较高丢弃优先级的数据报优先于那些较低丢弃优先级的数据报处理(即以较高优先级转发)。结合流量类别和丢弃优先级,名称 AFij 对应于保证转发类别 i 的丢弃优先级 j。例如,一个标记为 AF32 的数据报的流量类别为 3,丢弃优先级为 2。
DS 字段值设计为兼容服务类型和 IPv6 流量类别字段中指定的旧优先级子字段。AF 和 EF 提供比简单的“尽力而为”更好的服务。其中,(i,j) 表示中,i、j 分别表示流量类别和丢弃优先级。
名称 | 值 | 参考文献 | 描述 |
---|---|---|---|
CS0 | 000000 | [RFC2474] | 类别选择 (尽力而为/常规) |
CS1 | 001000 | [RFC2474] | 类别选择 (优先) |
CS2 | 010000 | [RFC2474] | 类别选择 (立即) |
CS3 | 011000 | [RFC2474] | 类别选择 (瞬间) |
CS4 | 100000 | [RFC2474] | 类别选择 (瞬间覆盖) |
CS5 | 101000 | [RFC2474] | 类别选择 (CRITIC/ECP) |
CS6 | 110000 | [RFC2474] | 类别选择 (网间控制) |
CS7 | 111000 | [RFC2474] | 类别选择 (控制) |
AF11 | 001010 | [RFC2597] | 保证转发 (1,1) |
AF12 | 001100 | [RFC2597] | 保证转发 (1,2) |
AF13 | 001110 | [RFC2597] | 保证转发 (1,3) |
AF21 | 010010 | [RFC2597] | 保证转发 (2,1) |
AF22 | 010100 | [RFC2597] | 保证转发 (2,2) |
AF23 | 010110 | [RFC2597] | 保证转发 (2,3) |
AF31 | 011010 | [RFC2597] | 保证转发 (3,1) |
AF32 | 011100 | [RFC2597] | 保证转发 (3,2) |
AF33 | 011110 | [RFC2597] | 保证转发 (3,3) |
AF41 | 100010 | [RFC2597] | 保证转发 (4,1) |
AF42 | 100100 | [RFC2597] | 保证转发 (4,2) |
AF43 | 100110 | [RFC2597] | 保证转发 (4,3) |
EF PHB | 101110 | [RFC3246] | 加速转发 |
VOICE-ADMIT | 101100 | [RFC5865] | 容量许可的流量 |
加速转发 (EF) 提供了非拥塞的网络服务,也就是说,EF 流量应享受较低的延时、抖动和丢包率。直观地说,EF 流量要求路由器的输出速率至少比输入速率大。因此,在一台路由器的队列中,EF 流量仅排在其他 EF 流量之后。
参考文献:
[1] Fall, K. R., and Stevens, W. R. TCP/IP详解 卷1:协议. Translated by 吴英, 张玉 and 许昱玮, 2nd ed., 机械工业出版社, 2016.
[2] J. Postel, “Internet Protocol” RFC 0791, September 1981.
[3] K. Nichols, S. Blake, F. Baker, D. Black, “Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers” RFC 2474, December 1998.
[4] K. Ramakrishnan, S. Floyd, D. Black, “The Addition of Explicit Congestion Notification (ECN) to IP” RFC 3168, September 2001.
[5] D. Grossman, “New Terminology and Clarifications for Diffserv” RFC 3260, April 2002.
via:
-
以太网数据帧详细解析 逐字节分析 - jueyuanfengsheng - 博客园 posted on 2023-08-07 11:49 jueyuanfengsheng
https://www.cnblogs.com/zccoming/p/17611080.html -
以太网帧、IP数据报的图解格式(包含相关例题讲解)_以太网帧格式-CSDN博客 Rebecca.Yan 已于 2023-05-27 14:13:19 修改
https://blog.csdn.net/weixin_45440484/article/details/129667838 -
以太网数据帧详细解析 逐字节分析_以太网帧包括哪些字段?-CSDN博客 Qazink 于 2020-08-25 21:18:49 发布
https://blog.csdn.net/weixin_43197795/article/details/108229234 -
IPv4 数据报中的 DS、ECN 字段_菜籽爱编程的技术博客_51CTO博客
https://blog.51cto.com/u_15891283/5886110