前言
有一些概念性的词语,我们先不必理解其具体含义,但是有必要把他们之间的逻辑层级关系理顺清楚。。
首先链路是针对两个直接节点之间,他俩是相邻的,不通过任何中间设备的。物理链路本身又分为有线链路,无线链路,局域网等。数据链路层是封装的网络层的数据报,而网络层的数据报现在一般为ip数据报。
数据链路层协议包括以太网,PPP,令牌环,FDDI等,前两种最常见。数据链路层又划分为逻辑链路层LLC子层和介质访问控制MAC层。其中后者是为了解决局域网中公用信道产生竞争时解决如何分配信道使用权的问题,而ppp是点对点,不涉及此路控制。因此可以说是局域网将数据链路层又分为了LLC和MAC。
其中ppp可以包含ip,ipx,novel。其中涉及ppp的概念有LCP,NCP。具体ppp的工作流程先略过。
而以太网算是一组协议规范,主要定义的是局域网内(LAN)的(Medium Access Control访问控制(csma/cd|ca)、物理电器特性,以太帧封装格式,以太网取代的是数据链路层的令牌环和FDDI.以太网早期是总线型拓扑,后来为了减少冲突和提高效率,使用了交换机,构成星型拓扑。
可以简单理解,链路层的ppp和以太网都是对ip层协议的封装。PPPoE另说。。
osi的网络模型和tcp/ip的网络模型都涉及到封装数据的问题,而在数据链路层的传输单位为帧frame。传输层的数据放到ip层,ip层的数据部分就为传输层的数据。网络层的ip数据报传到数据链路层,就为数据链路层的帧的数据部分。见下面两个图
ip数据报
数据链路层ppp帧
数据链路层以太网(mac)帧,没有帧尾
Win查看MTU
如果是wlan的话第一列应该是1492,以太网Ethernet II是1500(Why 1500?)
interface ipv4 show subinterfaces
MTU MediaSenseState 传入字节 传出字节 接口
------ --------------- --------- --------- -------------
4294967295 1 4552252 4865 Loopback Pseudo-Interface 1
1500 1 3022660347 234035687 以太网
1500 1 648 1443666 VirtualBox Host-Only Network
ping 网关
C:\Users\yaxia>ping -f -l 1473 10.70.30.1
正在 Ping 10.70.30.1 具有 1473 字节的数据:
需要拆分数据包但是设置 DF。
需要拆分数据包但是设置 DF。
10.70.30.1 的 Ping 统计信息:
数据包: 已发送 = 2,已接收 = 0,丢失 = 2 (100% 丢失),
Control-C
^C
C:\Users\yaxia>ping -f -l 1472 10.70.30.1
正在 Ping 10.70.30.1 具有 1472 字节的数据:
来自 10.70.30.1 的回复: 字节=1472 时间<1ms TTL=255
来自 10.70.30.1 的回复: 字节=1472 时间<1ms TTL=255
来自 10.70.30.1 的回复: 字节=1472 时间<1ms TTL=255
来自 10.70.30.1 的回复: 字节=1472 时间<1ms TTL=255
10.70.30.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),往返行程的估计时间(以毫秒为单位):最短 = 0ms,最长 = 0ms,平均 = 0ms
MTU一般为68-1500B,一般更改MTU大小指的是三层MTU的修改。1472+包头28字节=MTU(Maximum Transmission Unit),是数据链路层,当第三层(ip)收到打包之后,要将数据包分片之后再往二层传输。而一般说的修改MTU就是说的修改IP层分片的大小,而不是指的(固定)大小的数据链路层的分片。
ipconfig/all
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Intel(R) Ethernet Connection (5) I219-LM
物理地址. . . . . . . . . . . . . : 8C-EC-4B-5F-E9-49
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
本地链接 IPv6 地址. . . . . . . . : fe80::ed9a:ac29:db44:2570%11(首选)
IPv4 地址 . . . . . . . . . . . . : 10.70.30.47(首选)
子网掩码 . . . . . . . . . . . . : 255.255.254.0
获得租约的时间 . . . . . . . . . : 2019年9月18日 15:43:11
租约过期的时间 . . . . . . . . . : 2019年9月23日 15:43:13
默认网关. . . . . . . . . . . . . : 10.70.30.1
DHCP 服务器 . . . . . . . . . . . : 10.70.1.36
DHCPv6 IAID . . . . . . . . . . . : 42789963
DHCPv6 客户端 DUID . . . . . . . : 00-01-00-01-22-50-8C-EE-8C-EC-4B-5F-E9-49
DNS 服务器 . . . . . . . . . . . : 10.70.1.38
10.70.1.39
TCPIP 上的 NetBIOS . . . . . . . : 已启用
以太网数据帧结构
- 前同步码:准确的说是前导码7个Byte +帧开始符1个Byte ,目的是时钟同步,为了支持不同的以太网类型。时钟同步简单的理解为大家拔河的时候喊得1,2,1,2这样式儿的口号。
- 目的mac地址:可以是某个机器物理地址,也可以是广播地址(FF-FF-FF-FF-FF-FF for arp)
- 源mac:略过
- 类型:允许以太网多路复用,常见的为TCP/udp/IP,Novell IPX/SPX,Apple Talk Phase。这样以太网更好的胜任了数据链路层的工作
- 数据:46-1500Kb
- CRC:Cyclic Redundancy Check循环校验。
综上最大应为:7+1+6+6+2+1500+4=1526,但是物理网卡会去掉一头的前同步码8个字节,去掉一尾的crc4个字节,wireshark里展示的为核心需要解析的为6+6+2+(46-1500),最大为1514字节,最小为60。如下图
ipv4
Ethernet II, Src: Dell_5f:e9:49 (8c:ec:4b:5f:e9:49), Dst: Cisco_8f:98:00 (84:b2:61:8f:98:00)
Destination: Cisco_8f:98:00 (84:b2:61:8f:98:00)
Source: Dell_5f:e9:49 (8c:ec:4b:5f:e9:49)
Type: IPv4 (0x0800)
arp
Ethernet II, Src: Cisco_8f:98:00 (84:b2:61:8f:98:00), Dst: Broadcast (ff:ff:ff:ff:ff:ff)
Destination: Broadcast (ff:ff:ff:ff:ff:ff)
Address: Broadcast (ff:ff:ff:ff:ff:ff)
.... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
.... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
Source: Cisco_8f:98:00 (84:b2:61:8f:98:00)
Address: Cisco_8f:98:00 (84:b2:61:8f:98:00)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: ARP (0x0806)
Padding: 000000000000000000000000000000000000
二层为arp广播,基本靠吼,通过arp广播查到网关地址
14 0.826054 Cisco_8f:98:00 Broadcast ARP 60 Who has 10.70.30.1? Tell 10.70.30.1
三层为路由,每一跳的mtu可能都不同,这就涉及到分包(DF),在发现下一跳路由器的MTU大小之后,会有两个选择:如果为1且包大于自己的mtu,那就直接扔掉。如果为0,那就准备ip分片发送。接收方收到后重组(reassemble)后放到自己的接收缓冲区。
Ethernet II和802.3
区别以及如何通过13和14字节区分,参考车总这个回答
参考资料:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。