首页 > 其他分享 >数据链路层的七七八八

数据链路层的七七八八

时间:2023-10-22 21:14:15浏览次数:33  
标签:ARP MAC 七七八八 地址 交换机 IP地址 数据 以太网 链路层

数据链路层的七七八八

 

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

以太网

封装好的以太网帧由网卡添加前导码和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地址

RARP

RARP(Reverse Address Resolution Protocol)是从MAC地址定位IP地址的一种协议,使用小型嵌入式设备,无法从DHCP获取IP地址,可以向RARP Server注册设备的MAC地址和IP地址,在设备启动后会发送RARP请求,RARP Server收到请求后会发出RARP应答,告诉该设备的IP地址。

环路问题

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

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

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

转载至:https://www.cnblogs.com/tongh/p/17778369.html

标签:ARP,MAC,七七八八,地址,交换机,IP地址,数据,以太网,链路层
From: https://www.cnblogs.com/dalaoban/p/17781117.html

相关文章

  • 使用 Data Assistant 快速创建测试数据集
    DataAssistant提供超过100种数据类型,为任何开发、测试或演示目的生成大量、异构、真实的数据。官网地址:http://www.redisant.cn/da主要功能Windows原生DataAssistant使用WindowsNative技术,这保证软件具有很小的安装体积和较高的响应速度。快速生成创建小型或大型数据集,......
  • 数据库——基本概念
    1、什么是数据库?数据库,DataBase,简称db,存储数据的仓库。按照一定格式存储数据的一些文件的组合。2、什么是数据库管理系统?数据库管理系统,DataBaseManagementSystem,简称DBMS,管理数据库的系统,可以对数据库中的数据进行增删改查。常用的数据库管理系统有:Mysql、Oracle、SqlServer......
  • 1.参考例5.2.1,设计一个序列检测器。功能是检测出串行输入数据Sin中的4位二进制序列010
    设计块:moduleDetector2(inputCP,Sin,nCR,outputregOut);reg[1:0]Current_state,Next_state;parameterS0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;always@(posedgeCP,negedgenCR)begin if(~nCR)   begin    Current_state......
  • 求各种数据类型的字节数
    #define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){ printf("%d\n",sizeof(char)); printf("%d\n",sizeof(short)); printf("%d\n",sizeof(int)); printf("%d\n",sizeof(long)); printf("%d......
  • qemu和vscode调试uboot及设备模型数据流分析
    一,前言对于通用的流程,我需要形成闭环的代码理解,验证我理解的准确性。于是我选择用调试的方法来看数据流,用qemu来仿真,vsocde来调试,但是不能仿真am335。所以用了qemu支持仿真的v9。二,过程记录1,编译ubootmakeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-distcleanrm-rf./v9make......
  • Java基础 字节输出流 写出数据的三种方式
    void write(int b)  →  一次写一个字节数据 void write(byte[] b)  →  一次写一个字节数组数据 void write(byte[] b, int off, int len)  →  一次写一个字节数组的部分数据参数一:装着所有数据的数组。参数二:起始索引。参数......
  • django从配置文件中读取数据库信息
    创建配置文件my.cnf[client]database=django_dbuser=rootpassword=123456host=127.0.0.1port=3306settings.pyDATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','OPTIONS':{'read_default_fi......
  • 数据库基础之有损连接、无损连接
    判断有损连接还是无损连接跳转到这个网址</ahref>(这个网址里面讲的特别清楚~~~)......
  • Java基础 字节输出流写出数据的细节
    1.创建字节输出流对象:FileOutputStreamfos=newFileOutputStream("E:\\Java基础资料\\a.txt");细节①:参数可以是字符串表示的路径,也可以是File对象细节②:如果文件不存在,会创建一个新的空文件,但是要保证父级路径是存在的细节③:如果文件已经存在,则会清空文件 2.写数据:f......
  • 机器学习——数据操作(读这一篇就够了!)
    为了能够完成各种数据操作,我们需要某种方法来存储和操作数据。 首先,我们介绍维数组,也称为&amp;lt;strong&amp;gt;&amp;lt;em&amp;gt;张量&amp;lt;/em&amp;gt;&amp;lt;/strong&amp;gt;(tensor)。使用过Python中NumPy计算包的读者会对本部分很熟悉。无论使用哪个深度学习框架,它的&......