数据链路层的七七八八

主要物理传输介质:线路/网卡/二层交换机(网桥)

以太网

封装好的以太网帧由网卡添加前导码和FCS ->

由对端网卡接收后去掉前导码并使用CRC校验,如果帧损坏则丢弃,如果没有损坏则交给软件驱动处理 ->

以太网驱动接收物理层传输过来的包读入内存 ->

查看源mac和目的mac,如果是发给自己的则根据type字段的值交给传输层继续处理,如果不是则根据不同的拓扑设计会选择丢掉或转发。

MAC地址

在同一数据链路的MAC地址必须唯一,相当于身份证号,对于物理网卡MAC地址会被厂商烧到ROM中。

帧格式

以太网帧格式不同标准之间略有差距,例如使用较多的Ethernet II、IEEE802.3、VLAN帧体。

  • Ethernet II 应用最广,从个人电脑上抓包看到的基本都是这类帧体
  • IEEE802.3 可以做到对数据链路层更细节的控制
  • VLAN 可以在逻辑上划分不同的网段

Preamble :在以太网帧前端有大小8 bytes的前导码,能够确保发送端与接收端时钟同步,兼容不同速率的NIC。前导码最后一个byte末尾为11,称为SFD(Start Frame Delimiter),表示后面发送的是以太网帧。
MTU:以太网帧的最大传输单元(MTU)默认为1500,即承载的最大IP数据报文的最大长度为1500 bytes,超过了就要分片传输。1500 + 6(dst mac addr)+ 6(src mac addr)+ 2(type)+4(FCS)= 1518 bytes,所以以太网传输的最大的数据帧为1518 bytes。(MTU可以在系统做设置,在做mellanox适配时,ROCE模式可以通过调大MTU来提升性能)

Ethernet II

抓包软件看不到前导码和FCS,因为是从硬件会去掉前导码和FCS,将以太网帧交给驱动才是我们抓包到的内容

以电脑到路由器的一个包为例,可以看到目的端是华为路由器,源端是我的macbook pro M2 MAX顶配版(狗头),类型表明以太网上一层的协议类型,wireshark已经给出了解析,type:0x0800为IPv4,接下来的事情就交给处理IP的程序去做了。

IEEE802.3

Ethernet II的type字段在此表示以太网帧的长度,此外多了LLC和SNAP字段,上层协议type包含在SNAP字段中

IEEE802.3多了逻辑链路控制层(LLC)和SNAP,LLC部分各字段作用:

  • DSAP(Destination Service Access Point): 使用多协议栈时,告诉接收端在哪个协议栈缓冲区放置该信息
  • SSAP(Source Service Access Point ):发送源,如果设置为AA则表明是SNAP帧
  • CTRL(Control Byte):表明是LLC

SNAP各字段作用:

  • 厂商(Vendor Code):厂家信息,通常设置为全0
  • 类型(Local Code):包含标识上层协议类型的code,该字段保证了对Ethernet II的兼容

VLAN

VLAN在企业中经常用到,用于在不改变物理线路的情况下逻辑上划分网段,虽然如此,但是VLAN逻辑层面控制和物理布线最好有明确整齐的规划,否则会一团糟。

土黄色部分为VLAN帧相对于Ethernet II多出的部分,各字段作用如下:

  • TPID(Tag Protocol IDentifier):0x8100标识是否为VLAN帧(IEEE 802.1q tagged frame)
  • Priority:帧的优先级,3bit分为0~7个等级,值越大优先级越高
  • CFI(Canonical Format Indicator):主要用于令牌环网络和以太网之间的兼容,以太网交换机该字段设置为0

交换机自学

交换机通过查找转发表和数据链路层每个帧的目标MAC地址决定从哪个网口将数据帧发送出去,如果转发表上没有目标MAC地址,则除了接收该帧的端口,其他端口全部转发该帧,主机收到帧后会判断是否发给自己,如果不是则丢弃。

构造转发表实际上是接收到帧时,将交换机端口和该帧的源MAC地址关联。后续的帧如果目标MAC地址存在于表上,则直接从关联的这个端口将包发送出去。

ARP(Address Resolution Protocol)

ARP是根据IP地址找MAC地址的协议,如果数据包中含有源MAC地址和目的MAC地址,则交换机通过查转发表将包从关联端口发送出去,如果此数据包中只有目标IP地址而没有目标MAC地址,就需要广播发送ARP请求,同网段收到包的主机如果不是发给自己丢弃,如果是发给自己则需要进行单播发送ARP应答,告诉请求者我的IP地址和我的MAC地址。

抓包看看ARP的请求包,通过广播发送出去,上层协议使用0x0806(ARP)。ARP的target MAC address全0,还可以看到硬件类型为1(以太网),协议类型为0x800(IPv4),操作为1(请求)

再看看ARP的应答包,单播的方式进行应答,附加了MAC地址

环路问题

当两个交换机将两个局域网连起来的时候就很容易出现环路,因为ARP请求通过广播的形式发出,这样两个局域网都可以收到广播消息,两台交换机都能从两个局域网收到包,也都能向两个局域网发送包,当同一个包从局域网一和局域网二同时发送到交换机时,就破坏了交换机的自学机制,根本无法判断主机到底在哪里,于是就开始了无限的广播,这种现象就是环路问题。

解决环路问题的方法主流的有

  1. 生成树协议:通过优先级向量将各交换机节点组成生成树(Spanning Tree Protocol),网络包根据树的路径传输,避免环路。
  2. 源路由法:记录发出数据的源地址是通过哪个交换机传输的,如果出现了环路,不会重复转发。

学习自:
《趣谈网络协议》刘超
《图解TCP/IP》
《图解HTTP》
《网络是怎样连接的》
https://www.firewall.cx/networking/ethernet/ieee-8023-snap-frame.html

相关推荐
明月看潮生9 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
wowocpp19 分钟前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
山河君32 分钟前
ubuntu使用DeepSpeech进行语音识别(包含交叉编译)
linux·ubuntu·语音识别
鹏大师运维36 分钟前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
筱源源38 分钟前
Elasticsearch-linux环境部署
linux·elasticsearch
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
懒大王就是我1 小时前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
Elaine2023911 小时前
06 网络编程基础
java·网络
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强3 小时前
Linux之sed命令详解
linux·运维·服务器