网络基础 — 数据链路层(以太网协议/ARP协议)

  • Post author:
  • Post category:其他



目录


数据链路层


MAC地址


以太网


以太网的帧格式


ARP协议 — 地址解析协议


ARP数据报的格式


RARP协议


相关 :


网络基础 — 应用层HTTP协议


网络基础 — 传输层协议(UDP与TCP/三次握手与四次挥手/可靠传输)


网络基础 — 网络层(IP协议)


数据链路层

数据链路层介乎于

物理层



网络层

之间.  数据链路层在物理层提供的传送服务的基础上, 通过一些列的控制和管理机制, 构成透明的, 相对无差错的数据链路, 向网络层提供可靠有效的数据传送. 其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层.


MAC地址

在网络层IP协议中, 在报头封装了源IIP地址和目的IP地址(目的IP地址在网络传输中, 先发挥作用的是其中网络号部分, 其对网络的标识作用, 在最后到达目标网段时, 主机号才标识其属于哪个主机).  源IP和目的IP让一条在网络中的数据有了起点和终点的标识.  在这条数据网络传输的过程中, 并不是直接从起点到达终点, 其中间可能要经过多个节点(这里指路由器)(每经过一个节点意味着经过一个不同的网络), 数据每到达一个路由器, 这个路由器就会根据这条网路数据的目的IP地址和自己的路由表, 进行路由选择, 判断目的IP是否属于自己的网段, 如不是, 再从路由表中往后判断, 是否是属于与自己相连的网络, 直到路由表遍历结束, 还没有找到目的IP属于哪儿, 路由器就把这条数据交付给自己的上层网关, 让上层网关再进行路由选择.

刚说到, 目的IP地址在数据的网络传输中, 首先发挥作用的是IP的网络号部分, 是对网络的标识作用, 是路由选择的依据, 在最后到达目标网段时, 主机号才标识其属于哪个主机. 那么问题来了, 当进行路由转发时, 如何发送到指定的节点(路由器和主机).  这就要像标识一个网络一样, 用一个数据来唯一标识这个节点的, 这个标识就是MAC地址.


MAC地址 :

MAC地址用于在网络中唯一标示一个

网卡

,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址, 用6字节的无符号整数来表示.


MAC地址相比于IP地址

, 形象的来说, 就像我们坐公交去学校, 公交车需要好多站才能到达学校. 在这个过程中, 源IP就相当于我们的住址(起点), 目的IP相当于学校的地址(终点), 而源MAC地址和目的MAC地址就是两个相邻公交站点的起点和终点.


以太网

以太网是当今最广泛的局域网,

以太网技术

作为数据链路层的一种简单, 高效的技术, 以其为核心, 与其它物理层技术相结合, 形成以太网技术接入体系.

以太网的帧格式

图中数字单位为字节


6字节目的地址 :

目的MAC地址


6字节位源地址 :

源MAC地址


2字节类型 :

需要标识这个数据帧需要哪个协议来解析, 0x0800标识IP协议, 0x0806标识ARP协议, 0x8035标识RARP协议


数据 :

数据也叫有效载荷,除过当前层协议(有三种选择, IP协议, ARP协议, RARP协议) 需要使用的字段外, 即需要交付给上层的数据, 以太网帧数据长度规定最小为46字节, 最大为1500字节, 如果有不到46字节时, 会用填充字节填充到最小长度. 最大值也叫

最大传输单元(MTU)

我们可以再 Linux输入 ifconfig 可以看到有一项MTU:1500.


字节位FCS(帧检验序列) :

使用CRC校验法, 检测该帧是否出现差错.  (CRC :循环冗余算法, 主要用来检测或校验数据传输或者保存后可能出现的错误,  它是利用除法及余数的原理来作错误侦测的.

FCS和CRC, 详解推荐 :

https://blog.csdn.net/loveCC_orange/article/details/79127809

其中值得我们注意的是

MTU :


MTU :

用来通知对方自己所能接受数据服务单元的最大尺寸, 即发送方能够接受的最大数据长度

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


由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包(分片) :

  • 将较大的IP包分成多个小包, 并给每个小包打上标签;
  • 每个小包IP协议头的 16位标识(id) 都是相同的;
  • 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包(分片), 是的话置为1, 不是则置为0);
  • 到达对端时再将这些小包, 会按顺序重组(根据13位片偏移就可知道顺序), 拼装到一起返回给传输层;
  • 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;


MTU对UDP协议的影响

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


MTU对于TCP协议的影响

  • TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(MaxSegment Size);
  • TCP在建立连接的过程中, 通信双方会进行MSS协商.
  • 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
  • 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
  • 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
  • MSS的值就是在TCP首部的40字节

    变长选项

    中(kind=2);

IP协议在网络层已经写过, 链接 :

https://blog.csdn.net/qq_41071068/article/details/105496133

接下来看ARP协议


ARP协议 — 地址解析协议

地址解析协议,即ARP(Address Resolution Protocol), 是根据IP地址获取物理地址(MAC地址)的一个协议. 主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机, 并接收返回消息, 以此确定目标的物理地址(MAC地址). 收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间, 下次请求时直接查询ARP缓存以节约资源. 地址解析协议是建立在网络中各个主机互相信任的基础上的, 局域网络上的主机可以自主发送ARP应答消息, 其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存.

很多教科书和培训教材上, 都把ARP协议划分到网络层. 主要的原因在于ARP协议属于TCP/IP协议簇(栈), 而在TCP/IP模型中, 所有定义的协议至少是在网际层.  但是, 按照OSI的标准, 当数据向下传递时, 每层会加上自己协议的头部信息, 各层互不干扰.这样当网络层的IP包进入链路层时,链路层该如何加这个头部的目标信息呢?它要依靠ARP协议来完成. 显然如何加链路头并不是网络层的功能. 而且, ARP协议工作时, 并不使用IP包的报头. 所以也有很多人说, ARP是链路层的. 那么就可以说, ARP协议并不是一个单纯的的数据链路层协议, 而是一个介于数据链路层和网络层之间的协议. 可以认为在TCP/IP模型中, ARP协议属于IP层. 在OSI模型中, ARP协议属于链路层.

ARP数据报的格式

图中数字单位为字节

  • 硬件类型

    :如果是以太网, 则硬件类型为:0x0001

  • 协议类型

    :这里一般写的是:0800 表示IP类型,ARP是IP协议族中的一个。

  • 硬件地址长度 :

    指的是MAC地址的长度,长度为6单位是字节

  • 协议地址长度 :

    如果是IPv4则这个值为4, 单位是字节。

  • op操作符 :

    如果为1则为请求包;如果为2则为回应包。

简单来说, ARP协议建立了主机IP地址和MAC地址的映射关系

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


ARP协议的工作流程

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

请求包(主要字段) :

  • 以太网首部的目的MAC地址为:FF:FF:FF:FF:FF:FF表示广播包.
  • 以太网首部的源MAC为自己MAC地址.
  • ARP字段中的发送端IP : 自己的IP
  • ARP字段中的目的IP : 要请求的主机的IP
  • ARP字段中的目的MAC地址字段为: 00:00:00:00:00:00(十六进制表示) 起到填充的作用.
  • ARP字段中的源MAC地址: 自己的MAC地址
  • op操作符字段为:0001

应答包(主要字段) :

  • 以太网首部的目的MAC地址为:源主机(发送请求包的主机)的MAC地址.
  • 以太网首部的源MAC地址为 : 自己的MAC地址
  • ARP字段中的发送端IP : 自己的IP
  • ARP字段中的目的IP : 要应答的主机的IP
  • ARP字段中的目的MAC地址字段为: 源主机(发送请求包的主机)的MAC地址.
  • ARP字段中的源MAC地址字段为:自己的MAC地址
  • op操作符字段为:0002

RARP协议


注意 :

RARP协议曾经作为反向地址转换协议和ARP配合使用, 但是现在RARP协议已经被淘汰., 在DHCP (动态主机配置协议) 协议中已经包含了RARP的功能, 所以大家现在主要关注的是ARP. 简单来看一下RARP协议

前面说到, RAP协议是, 知道相邻设备的IP而不知道其MAC地址, 那么要是知道MAC地址, 不知道其IP地址呢 ?

  • 网络上的每台设备都会有一个独一无二的硬件地址,通常是由设备厂商分配的MAC地址. 源主机从网卡上读取MAC地址,然后在网络上发送一个RARP请求的广播数据包,请求RARP服务器回复该目的主机的IP地址.
  • RARP服务器收到了RARP请求数据包,为其分配IP地址,并将RARP回应发送给源主机
  • 源主机收到RARP回应后,就使用得到的IP地址进行通讯。


注 : ARP和RARP请求是广播方式,应答都是单播方式



版权声明:本文为qq_41071068原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。