以太网帧格式
- 以太网帧格式
- 前导码(Preamble)
- 帧起始界定符(SFD,Start Frame Delimiter)
- 以太网帧头
- 目的MAC地址
- 源MAC地址
- 长度/类型
- 数据段
- 帧检验序列(FCS,Frame Check Sequence)
- 帧间隙(IFG,Interpacket Gap)
- ARP 数据报
- IP 数据报
- IP 首部
- UDP 数据报格式
- ICMP 报文
- 报文格式
- ping 命令诊断网络故障
- pathping命令跟踪数据包路径
- IGMP 报文
以太网帧格式
前导码(Preamble)
为了实现底层数据的正确阐述,物理层使用7个字节同步码(7 个 0x55),二进制表现为 0 和 1 交替,其作用是使发送方和接收方的时钟同步。
帧起始界定符(SFD,Start Frame Delimiter)
使用 1 个字节的SFD(0xd5),二进制表现为“10101011”,用来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。
以太网帧头
目的MAC地址
即接收端物理MAC地址,占用 6 个字节。MAC地址从应用上可分为单播地址、组播地址和广播地址。
- 单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;
- 组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;
- 广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。
源MAC地址
即发送端物理MAC地址,占用6个字节。
长度/类型
长度/类型具有两个意义
- 当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;
- 如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等。
数据段
长度最小46个字节,最大1500个字节。
长度最小46个字节,总的以太网帧长度最小为 64 个字节,其原因是因为以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,需要进行重传。以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据就会发生碰撞,碰撞对于以太网来说是正常的。要保证以太网的重传,必须保证收到碰撞信号的时候数据包没有传完,要实现这一要求,发送方和接收方之间的距离很关键,也就是说信号在发送方和接收方之间传输的来回时间必须控制在一定范围之内。IEEE 定义了这个标准,一个碰撞域内最 远的两台机器之间的 round-trip time 要小于 512 bit time(传输一个比特需要的时间),这也是我们常说的一个碰撞域的直径。512 个 bit time 也就是 64 字节的传输时间,如果以太网数据包 ≥ 64 个字节就能保证碰撞信号到达发送方的时候,数据包还没有传完。最小数据帧的设计和以太网电缆长度有关,为的是让两个相距最远的站点能够感知到双方的数据发生了碰撞,最远两端数据的往返时间就是争用期,以太网的争用期是 51.2 us,正好发送 64byte 数据。
最大值 1500 称为以太网的最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有效数据字段小于1500个字节,现在电脑的配置都很高了,很多都支持巨型帧,巨型帧可以超过 1500 个字节。
不同的协议,数据段的组成结构不同,后面再详细说明。
帧检验序列(FCS,Frame Check Sequence)
为了确保数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。
帧间隙(IFG,Interpacket Gap)
帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下:
- 10Mbit/s最小时间为:96*100ns = 9600ns;
- 100Mbit/s最小时间为:96*10ns = 960ns;
- 1000Mbit/s最小时间为:96*1ns = 96ns;
ARP 数据报
ARP 地址解析协议,即 ARP(Address Resolution Protocol),根据 IP 地址获取物理地址。主机发送包含目的 IP 地址的 ARP 请求广播(MAC 地址为 48’hff_ff_ff_ff_ff_ff)到网络上的主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后将 IP 地址和物理地址保存到缓存中,
并保留一段时间,下次请求时直接查询 ARP 缓存以节约资源。下图为 ARP 数据报格式 。
字段 | 长度 (Byte) | 默认值 | 备注 | |
---|---|---|---|---|
前导码+SFD | 8 | 0x5555…D5 | ||
以太网首部 | 目的 MAC 地址 | 6 | ||
源 MAC 地址 | 6 | |||
长度/类型 | 2 | 0x0806 | ARP帧类型值 | |
ARP 字段 | 硬件类型 | 2 | 0x0001 | 指链路层网络类型,1 为以太网 |
上层协议类型 | 2 | 0x0800 | 上层协议为 IP 协议 | |
MAC地址长度 | 1 | 0x6 | 以太网 MAC 地址长度为 6 | |
IP地址长度 | 1 | 0x4 | IP 地址长度为 4 | |
操作码 | 2 | 0x1 / 0x2 | 1 表示 ARP 请求包 2 表示 ARP 应答包 | |
源 MAC 地址 | 6 | |||
源 IP 地址 | 4 | |||
目的 MAC 地址 | 6 | |||
目的 IP 地址 | 4 | |||
填充数据 | 18 | 数据段最小长度为46 | ||
以太网校验 | 校验字 | 4 | 除前导码+SFD 外均计算 |
IP 数据报
IP 首部
- 版本 :4位IP版本号(Version),这个值设置为二进制的 “0100” 时表示 IPv4,设置为 “0110” 时表示 IPv6,目前使用比较多的IP协议版本号是 4
- 首部长度 : 4位首部长度(IHL,Internet Header Length),表示IP首部一共有多少个 32bits(4个字节)。最大可表示15个 32 bits,因此 IP 的首部长度最大值为 60 字节
- 服务类型 :8位服务类型(TOS,Type of service),该字段被划分成两个子字段:3位优先级字段(现在已经基本忽略掉了)和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务
- 总长度 :16位IP数据报总长度(Total Length),包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管理论上可以传输长达65535字节的IP数据报,但实际上还要考虑网络的最大承载能力等因素
- 标识 :16位标识(Identification)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1
- 标志 :3位标志(Flags)字段
- 最高位为保留位
- 中间位是 DF (Don’t Fragment),表示禁止分片,只有 DF = 0 时才允许分片
- 最低位是 MF (More Fragment),MF = 1 表示后面还有分片,MF = 0 表示最后一个分片
- 片偏移 :13位片偏移字段,指较长的分组在分片后某片在原分组中的相对位置,以 8 字节为偏移单位,也就是说每个分片的长度一定是 8 字节的整数倍
- 生存时间 :8位生存时间字段TTL(Time To Live),设置了数据报可以经过的最多路由器数,表示数据报在网络上生存多久,防止丢失的数据包在无休止的传播TTL的初始值由源主机设置,一般为32、64或者128,一旦经过一个路由器,它的值就减 1,减到 0 时,数据报就丢弃,并发送 ICMP 消息通知源主机
- 协议 :8位协议(Protocol)类型,指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程。 0x01 表示为 ICMP 协议, 0x02 表示为 IGMP 协议, 0x06 表示为 TCP 协议, 0x11 表示为 UDP 协议
- 首部校验和 :16位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验IP数据报头部是否被破坏、篡改和丢失等。
- 源 IP 地址 :32位源IP地址(Source Address),即发送端的IP地址,如192.168.1.123
- 目的 IP 地址 :32位目的IP地址(Destination Address),即接收端的IP地址,如192.168.1.102
- 可选字段 :是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍,没有的话长度可以为 0 。
IP首部校验和的计算方法:
1、将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;
2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);
3、此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
4、最后将得到的和的反码填入校验和字段。
UDP 数据报格式
- 源端口号 :16位发送端端口号,用于区分不同服务的端口,端口号的范围从0到65535
- 目的端口号 :16位接收端端口号
- UDP 长度 :16位UDP长度,包含UDP首部长度 + 数据长度,单位是字节
- UDP 校验和 ** :16位UDP校验和。UDP计算校验和的方法和计算IP数据报首部校验和的方法相似,但不同的是IP数据报的校验和只检验IP数据报的首部,而UDP校验和包含三个部分:UDP 伪首部,UDP 首部和 UDP 的数据部分。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度**
数据是可以直接封装在IP协议里而不使用TCP、UDP或者其它上层协议的。然而在网络传输中同一IP服务器需要提供各种不同的服务,各种不同的服务类型是使用端口号来区分的,例如用于浏览网页服务的80端口,用于FTP(文件传输协议)服务的21端口等。TCP和UDP都使用两个字节的端口号,理论上可以表示的范围为0~65535,足够满足各种不同的服务类型。
TCP协议与UDP协议作为传输层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输。下面是TCP协议与UDP协议的区别:
①TCP协议面向连接,是流传输协议,通过连接发送数据,而UDP协议传输不需要连接,是数据报协议;
②TCP为可靠传输协议,而UDP为不可靠传输协议。即TCP协议可以保证数据的完整和有序,而UDP不能保证;
③UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;
④TCP协议常用在对数据文件完整性较高的一些场景中,如文件传输等。
UDP协议常用于对通讯速度有较高要求或者传输数据较少时,如视频直播和QQ等。
UDP 协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法 计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡 改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此 UDP 协议可以检测是否出错。虽然 UDP 提供有错误检测,但检测到错误时,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。
ICMP 报文
报文格式
-
ICMP 是 TCP/IP 协议族的一个 IP 层子协议,包含在 IP 数据报里,用于 IP 主机、路由器之间传递控制消息。控制消息是指网络是否连通,主机是否可达等功能。其中 ping 功能采用回送请求和回答报文,回送请求报文类型为 0x08,回答报文类型为 0x00
-
ICMP报文可分为两大类
- 有关信息采集和配置的 ICMP 报文,称为查询报文(query)或者信息类报文(information message)
- 有关 IP 数据报传递的ICMP报,称为差错报文(error message)
-
校验和计算(校验 ICMP 首部和数据部分) :
- 将校验和字段设置为0
- 每16个bit(即2个字节)组成一个数,相加,如果超过16个bit,把超过的高位值加到这16个bit值上,得到的新值再和下一个值相加
- 如果最后还剩8个bit值,不能简单的加到低位,要把这8个bit当成高位值,再用0填充一个16个bit值,相加
- 最后取反,填充到校验和字段
-
报文类型字段(Type)及代码字段(Code)含义
类型TYPE | 代码CODE | 描述 Description |
---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) |
3 | 0 | Network Unreachable——网络不可达 |
3 | 1 | Host Unreachable——主机不可达 |
3 | 2 | Protocol Unreachable——协议不可达 |
3 | 3 | Port Unreachable——端口不可达 |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 |
3 | 5 | Source routing failed——源站选路失败 |
3 | 6 | Destination network unknown——目的网络未知 |
3 | 7 | Destination host unknown——目的主机未知 |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 |
3 | 14 | Host precedence violation——主机越权 |
3 | 15 | Precedence cutoff in effect——优先中止生效 |
4 | 0 | Source quench——源端被关闭(基本流控制) |
5 | 0 | Redirect for network——对网络重定向 |
5 | 1 | Redirect for host——对主机重定向 |
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 |
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 |
8 | 0 | Echo request——回显请求(Ping请求) |
9 | 0 | Router advertisement——路由器通告 |
10 | 0 | Route solicitation——路由器请求 |
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) |
12 | 1 | Required options missing——缺少必需的选项 |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) |
14 | Timestamp reply (obsolete)——时间戳应答(作废不用) | |
15 | 0 | Information request (obsolete)——信息请求(作废不用) |
16 | 0 | Information reply (obsolete)——信息应答(作废不用) |
17 | 0 | Address mask request——地址掩码请求 |
18 | 0 | Address mask reply——地址掩码应答 |
ping 命令诊断网络故障
-
ping 命令只能检测两端口通或不通
-
PING(Packet Internet Grope),因特网包探索器,用于测试网络连接量的程序。Ping 发送一个 ICMP 回声请求消息给目的地并报告是否收到所希望的 ICMP 回声应答。
-
ping指的是端对端连通,通常用来作为可用性的检查,但是某些病毒木马会强行大量远程执行ping命令抢占你的网络资源,导致系统变慢,网速变慢。严禁ping入侵作为大多数防火墙的一个基本功能提供给用户进行选择。
-
如果你打开IE浏览器访问网站失败,你可以通过ping命令测试到Internet的网络连通,可以为你排除网络故障提供线索,下面展示ping命令返回的信息以及分析其原因。
-
目标主机不可到达
-
目标网络不可到达
-
请求超时
说明丢包了
-
通过延迟评估网络带宽
可以看到最小延迟为54ms,最大延迟57ms,平均延迟55ms
当 ping 本计算机网关的时候延迟小,速度快
-
pathping命令跟踪数据包路径
-
当PC0 ping PC1时不通,可能是1~4处某一处或多处断了,也可能是PC1没有开机。而使用PC0 pathping PC1时,从PC0到PC1,每经过一个路由器都会通过该路由器给PC0发回一个数据包说明PC0到该路由器的路径是通的。即Router1给PC0发回一个数据包则表示1、 2通;Router2给PC0发回一个数据包表示1、 2、 3通。在网络排错中具有很强的实用意义。
-
若 Router0 设置了进入的数据包无法追踪该路由器,PC0 pathping PC1时,数据包可以通过Router0,但是Router0不会给PC0返回一个数据包
输入命令
pathping www.bilibili.com
表示从本计算机访问 “www.bilibili.com” 该网站的服务器,并追踪途经的各个中转路由器
同时pathping命令还会统计通信方到每个中转路由器的丢包率,由此可以看出从哪到哪丢包严重,网络延迟大,据此可以优化网络。
相同类型的有trace route命令,该命令较为简略不会统计丢包率