当前位置: 首页 > news >正文

数据链路层 和 ARP协议

以太网

以太网不是网络,而是技术标准,规定了数据链路层和物理层的内容,比如数据链路层的协议格式,再比如物理层数据信号以双绞线传输

以太网帧格式

以太网数据链路层报文又称为以太网帧,也叫mac帧,mac帧有帧头和帧尾

1、源地址、目的地址:源主机网卡mac地址和目的主机网卡mac地址

2、类型:mac帧类型,有三种,分别是 IP(0x0800)ARP(0x0806)RARP(0x8035);

3、CRC:CRC校验码处于帧末尾

4、mac帧的有效载荷长度限制为46字节~1500字节

mac地址

1、mac地址是网卡的物理地址,在网卡出厂时就确定了

2、mac地址是6个字节,一般用16进制加冒号来表示(例如:08:00:27:03:fb:19)

3、ip地址描述的是通信路途的起点和终点,mac地址描述的是通信路途中一个网段的起点和终点

MTU

mtu是数据链路层对有效载荷的最大长度限制,对于ip类型mac帧,那就是交给数据链路层的ip报文长度不能大于1500

1、以太网帧中的有效载荷长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度是28字节,不 够 46 字节,要在后面补填充18位

2、不同的数据链路层标准的 MTU 是不同的

3、可以通过ifconfig查看网卡接口的mtu值

mtu对ip层的影响

由于数据链路层限制有效载荷长度,所以ip报文最大长度就是1500字节,如果IP报文长度大于该值,那IP层就要对原始ip报文分片,然后将分片ip报文交给数据链路层

分片步骤:

1、将原始IP报文的有效载荷按(mtu-IP报头长度)进行分片,然后每一片有效载荷都封装上ip报头,设置其首部校验和、唯一标识、标志、片偏移等

2、按片偏移顺序交给数据链路层然后封装mac帧发送

一个3000字节的IP报文,IP报头20字节,tcp报头20字节,将2980的ip报文有效载荷按(mtu-IP报头长度)=1480 进行分片,那于是分片大小为1480,1480,20,然后每个有效载荷都加上IP报头,那就是1500,1500,40 长度的分片ip报文,然后按片偏移顺序交给数据链路层封装mac帧报头最后发出就是了

最终正确的分片:

  1. 1500字节:20头 + 1480数据 (MF=1, 偏移=0)

  2. 1500字节:20头 + 1480数据 (MF=1, 偏移=185)

  3. 40字节:20头 + 20数据 (MF=0, 偏移=370)

mtu对传输层协议的影响

对udp协议:

一旦udp报文大小超过(mtu-ip报头长度)=1480,那就在IP层要进行分片,倘若接收端收到的分片不齐,那就要将分片链表丢弃,因为udp没有可靠传输的超时重传和确认应答机制,所以也不会自动重发,必须依靠程序员在应用层做好重传工作

tcp协议:

如果分片的话,一旦一个分片ip报文丢失,那整个分片链表都要丢弃,那其他的报文就白传输了,所以tcp协议采取mss来限制tcp报文的有效载荷长度,这样封装的IP报文就无需分片,即使出现丢包,也只需重传丢的包即可。

MSS是tcp报文的有效载荷最大值,如果超过该值,那ip报文就要分片,其关系是mss = mtu - ip报头长度 - tcp报头长度。tcp进行三次握手建立连接过程中,双方会在SYN包的选项中携带自己的MSS大小了,最后双方会选择较小的一个作为最终的MSS

MTU和MSS的关系

ARP协议

ARP协议是一个介于网络层和数据链路层之间的协议,用于已知下一跳ip的情况下获取其mac地址,RARP是反向ARP,也就是已知mac地址获取ip地址

arp协议的结构

arp协议是基于数据链路层协议工作的,arp报文共28字节,arp类型的mac帧,前有mac头,后有mac尾

1、2字节硬件类型:数据链路层协议类型,如以太网协议,用1表示

2、2字节协议类型:网络层协议类型,如IPV4用0x0800表示

3、1字节硬件地址长度:数据链路层协议地址长度,以太网协议mac地址那就是6字节,直接就是6

4、1字节协议地址长度:网络层协议地址长度,如IPV4地址长度就是4字节,直接就是4

5、2字节op操作类型:1表示arp请求,2表示arp应答

6、剩下的没什么好说,唯一要说的就是利用arp类型mac帧获取下一跳ip的mac地址的过程

数据链路层是先查arp缓存,没有查到下一跳ip的mac地址,那就需要构建arp类型的mac帧,arp报文从头到尾,硬件类型也就是数据链路层协议类型,填个1,协议类型也就是网络层协议类型,填个0x0800,硬件地址长度就是mac地址长度,填个6,协议地址长度就是IPV4地址长度,填个4,op操作类型是arp请求,填个1,源mac地址就是发送端网卡mac地址,目的mac地址是ff:ff:ff:ff:ff:ff广播mac地址,源ip地址就是发送端网卡ip,目的ip就是下一跳ip,然后这是arp报文,然后封装mac帧,源mac地址是发送端网卡mac地址,目的mac地址是ff:ff:ff:ff:ff:ff广播mac地址,帧类型arp类型mac帧,填个0x0806,最后给帧尾加上crc校验码,然后写进网卡发送缓冲区,写网卡TDT寄存器,然后网卡DMA读出,利用HVY转成光电信号发到局域网中,当其他主机接收后,网卡检查mac头的目的mac地址,是广播地址没问题,crc校验码验算过后也没问题,写进网卡接收缓冲区,触发硬件中断,cpu陷入内核,调用网卡驱动,读mac头中帧类型为arp,从而读出完整mac帧,去掉mac头和尾交给arp层,一看目的ip不是自己网卡ip,那就丢包,当目标主机网卡接收后,网卡检查mac头的目的mac地址是广播地址没问题,crc校验码验算过后也没问题,于是将mac帧写进网卡接收缓冲区中,然后触发硬件中断,cpu陷入内核,调用网卡驱动,读mac头中帧类型为arp,从而读出完整mac帧,去掉mac头和尾交给arp层,arp层看目的ip正确,再一看op是1,那就构建arp响应报文,op操作类型就是2表示arp响应,源ip填上,源mac地址也填上,然后根据请求中的字段填写目的ip和目的mac地址,交给数据链路层,填写源和目的mac地址,帧类型还是0x0806 arp帧类型,加上crc校验码,写进网卡发送缓冲区,写TDT寄存器,然后最后发到直连网络中,这次因为有明确目的mac地址,所以是单播,接收到后通过硬件中断将下一跳ip与mac地址映射加进arp缓存中,并唤醒arp缓存等待队列上的进程,然后进程就会得到下一跳ip的mac地址,从而能够封装ip类型mac帧了

查看arp缓存的命令

arp -a

数据链路层的一个概念:单播和广播

如果发送到网卡直连网络中的mac帧,其目的mac地址是广播地址FF:FF:FF:FF:FF:FF,那局域网中的每个主机网卡在收到mac帧后,检查其目的mac地址是广播地址没问题,然后检查crc,之后就写进网卡接收缓冲区,触发硬件中断,然后cpu陷入内核,读出mac帧后去帧头和帧尾,交给上一层,这就是广播,也就是所有的主机不会在数据链路层就丢弃该包(除非crc错了)。

而单播就很好理解了,那就是发送的mac帧其目的mac地址是明确的,那主机网卡接收到mac帧后,看到目的mac地址和自己都不一样,于是直接在数据链路层就丢包

http://www.dtcms.com/a/302327.html

相关文章:

  • 最大连续子数组
  • Makefile if语句用法
  • 【传奇开心果系列】Flet纵向瀑布流本地图片布局排列自定义模板
  • 【硬件】LVGL
  • 15-C语言:第15天笔记
  • keepalived原理及实战部署
  • 【数据库】时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • 张 LLama 多语言语义相似度计算全解析:不同语言 同义词的相似度计算
  • idea启动java应用报错
  • idea编译报错 java: 非法字符: ‘\ufeff‘ 解决方案
  • OSPF笔记
  • 实验-静态路由
  • 解决windows系统下 idea、CLion 控制台中文乱码问题
  • 应急响应处置案例(上)
  • python-并发编程
  • 移动高清盒子6PRO-河南创维E900V22D-晶晨S905L3B-4+16G-安卓9-线刷固件包
  • 提取excel中的年月日
  • uniapp_微信小程序_根据胶囊按钮计算出的导航栏高度为什么不是44px?
  • 多光谱相机助力第四次全国农业普查-农业用地调查
  • Deepseek + browser-use 轻松实现浏览器自动化
  • 关于大视频大文件诸如超过5个G或10个G的视频上传详解原理以及-5种语言实现-优雅草卓伊凡|深蓝
  • 【7.26-7.28胜算云AI日报:首个开源3D世界生成模型腾讯混元、微软预示 8 月 GPT-5 发布、Nemotron推理、商汤悟能、DM夺金】
  • UniappDay04
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • 【uniapp】---- 使用 uniapp 实现视频和图片上传且都可以预览展示
  • NVMe高速传输之摆脱XDMA设计20:PCIe请求模块设计(上)
  • 【mysql慢查询】
  • “太赫兹”
  • Java学习-----如何创建线程
  • 【科普】STM32CubeMX是配置工具,STM32CubeIDE是集成开发环境,二者互补但定位不同,前者负责初始化配置,后者专注代码开发调试。