[Linux][网络][数据链路层][二][MTU][ARP协议]详细讲解


1.MTU

1.认识MTU

  • 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
  • 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
  • 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)
  • 不同的数据链路层标准的MTU是不同的

2.MTU对IP协议的影响

  • 由于数据链路层MTU的限制,对于较大的IP数据包要进行分包
    • 将较大的IP包分成多个小包,并给每个小包打上标签
    • 每个小包IP协议头的16位标识(ID)都是相同的
    • 每个小包的IP协议头的3位标志字段中
      • 第2位置0,表示允许分片
      • 第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0)
    • 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层
    • 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据
      请添加图片描述

3.MTU对UDP协议的影响

  • 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报
  • 这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败
    • 那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了

4.MTU对TCP协议的影响

  • 对TCP的影响和UDP是一样的,只不过TCP会重传,但是毕竟也是会消耗资源的,所以尽量还是不要分片

    • 因为MAC帧的规定而导致的网路层发生分片,就会增加丢包概率
    • 而为了减少这样的情况,那么此时就应该让IP报文将自身交付给MAC帧时(充当MAC帧的有效载荷的时候)长度不要超过1500,也就是IP报文整体大小不要超过1500
  • IP协议要发多大的数据,不由IP协议决定,IP协议就是一个跑腿的,真正的决策(一次发送多大的数据、发多少、丢包了怎么办)是由传输层决定的,所以IP协议也没有办法

  • 所以此时因该能够让TCP单次发送报文的时候,报文的大小不要超过某一个数字:MSS(Maximum segment size,最大段尺寸)

    • MTU = 1500 = IP
    • IP有效载荷 = 1500 - IP报头长度(20) = TCP + 数据 = 1480
    • 数据 = 1480 - TCP报头长度(20) = 1460
    • MSS不能大于1460
      请添加图片描述
  • TCP在建立连接的过程中,通信双方会进行MSS协商

    • 在最开始的时候,一个数据都没有发,因为这个MTU有可能会变化,其次发送方也想让接收方知道,其单次发送一个报文的大小 – MSS的大小(为了更顺畅的进行通讯)
    • 所以在进行建立链接的时候,双方就会进行MSS的协商,也就是三次握手的时候,除了会协商双方的接收能力,也会进行协商双方单个报文的大小,尽量减少数据发送体积的问题
    • 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)
    • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
      • MSS的值就是在TCP首部的40字节变长选项中(kind = 2)
    • 然后双方得知对方的MSS值之后,选择较小的作为最终MSS
  • 总结:

    • 以上也说明了**分片不是主流,**因为当它们在建立握手的过程中的时候,交换了双方的MSS,而做了这个工作,双方在进行后续的通讯的时候,其中的数据报文的大小也就不会再出现分片问题了

2.ARP协议

  • 虽然在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议

0.情景铺垫

  • 对于入口路由器只有F的目标IP地址:
    • IP = 目标网路 + 目标主机 --> 必须知道F的MAC地址 --> 如果没有MAC地址,入口路由器就没有办法在数据连路层封装MAC帧
    • 如果只知道目标主机的IP地址,而不知道对方的MAC地址,也是没办法的
    • 也就是说,需要在同一个网段中通过目标IP,得知对方的MAC地址 --> ARP协议(地址解析协议)
      • 而因为其是在同一个网段中,所以其是一个局域网协议

1.ARP协议的作用

  • ARP协议建立了主机IP地址MAC地址的映射关系
    • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
    • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
    • 因此在通讯前必须获得目的主机的硬件地址

2.能不能根据路由器 + 该报文的目标IP,确认清楚这个IP一定在它的子网当中?

  • 100%能做到,因为当一个报文送来的时候,它的目的IP是知道的,然后可以根据查路由表获取到目标网络,然后再和当前网络所对应的路由表目的网络做比较,来确定报文是否已经到达目标网络
  • 最终确定到达目标网络,再根据整体的IP地址,再根据ARP协议获取目标主机F所对应的MAC地址因为(前面已经确定该目标IP一定属于当前网段中),获取到之后再封装MAC帧,于是便可以将数据转给主机F了

3.以太网协议(MAC帧)与ARP协议之间有什么关系?

  • 二者属于在同一个大层(数据链路层),但是在同一个大层里面分为了不同的层次

    • **上层:**属于局域网协议,ARP协议
    • **最底层:**以太网协议,(最典型)MAC帧
      请添加图片描述
  • 这就是为什么以太网帧当中有一个帧类型,它用来表述的要么是ARP、要么是网络层中的协议
    请添加图片描述

4.ARP协议的工作流程

  • 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段
    • 以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中
  • 每台主机都维护一个ARP缓存表,可以用arp -a命令查看
    • 缓存表中的表项有过期时间(一般为20分钟)
    • 如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
  • 总结:
    • 先广播
    • 再一对一进行发送
    • 所有逻辑都是封装成MAC帧,在局域网当中完成

5.ARP协议的格式

请添加图片描述

  • **硬件类型:**这次要进行ARP时,对应的局域网的网络种类/网络的标准/网络的类型
    • 一般固定1:以太网
  • **协议类型:**要转换的地址类型
    • 如:想将IP转换为MAC地址…….
    • 一般固定0x0800:为IP地址(未来想将IP转换为MAC地址)
  • **硬件地址长度:**对于以太网地址固定为6字节
  • **协议地址长度:**对于IP地址固定为4
  • 前四个为固定写法,重点是后面的字段
  • op字段:
    • 为1表示ARP请求
    • 为2表示ARP应答
  • **发送端以太网地址:**发送主机的MAC地址
  • **发送端IP地址:**发送主机的IP地址
  • 目的以太网地址:
    • ARP请求时:因为目的就是获得目的以太网地址,所以不知道为全F(二进制全1)
    • ARP应答时:为当初发送请求的MAC地址
  • **目的IP地址:**目标主机的IP地址
  • 为什么需要OP字段?
    • 任何一个主机可能之前向目标主机发送过ARP请求,也就注定了未来会收到对应的ARP应答
    • 任何一台主机,也可能被别人发起ARP请求
    • 所以对于一台主机来讲,其在正常工作的时候即可能对外发送ARP,也可能收到ARP
    • 局域网中:
      • 任何一台主机收到ARP的时候,可能是一个应答,也可能是一个请求
      • 所以需要op进行区分

6.ARP看起来至少进行一次请求和一次应答,是不是每一次发送数据都要这么干?

  • 并不需要,因为一般ARP请求成功之后,请求方会暂时将IP和MAC的映射关系暂时保存下来,往后请求时会直接使用缓存当中的IP和MAC的映射关系,拿着MAC地址封装MAC帧,然后进行转发
  • 其中这个保存是有时间的
    • 比如说:15分钟。如果超时了,操作系统内核自动将该缓存对应的条目去掉
    • 设置时间原因:当前的目标主机,可能会重启/关机,然后又来一台主机,导致局域网分配的时候重新分配IP地址,如果此时的MAC地址不更新的话,就无法发送数据**(此IP对应了上一台主机的MAC地址)**

7.是不是只在目标主机最终的子网中进行ARP,其他地方会不会发生ARP呢?

  • ,ARP的过程随时可能在网络路径中发生,一个子网中发送主机的缓存中就有可能没有目标主机的MAC地址,这个时候需要使用ARP是再正常不过的,不过正是有缓存的存在,ARP在使用中并不是大量的
  • 其实不光是ARP随时可能在路径中发生,IP分片也是
    • 因为数据包在进行路由的时候,整个一条的链路上,每一台主机规定的MTU有可能并不是一样大的
    • 假设发送主机发送的数据大小是1500,而路径上的路由器,有可能对应的MTU比较小,最终也可能在路上进行分片(一般特别少)
    • 因为一般中间路由器都是运营商设置的,所以他们的设置也是精良减少分片,但是并不能说是被彻底的排除了
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值