目录
数据链路层解决的问题
对于TCP/IP四层协议来说,数据链路层才是真正从传送数据进行跑腿办事情的;传输层的TCP协议通过各种策略确保了数据传输的可靠性;网路层IP协议通过路由和转发可以将数据报从一个子网传送到另外一个子网,最后传送到目标主机所在的子网;而数据链路层就要实现TCP协议的能力和IP协议跨网络转发;最重要的是实现网络层的跨网络转发,是如何从源主机一步一步通过mac地址跳转到转发路由器,转发路由器通过下一跳跳转到目标主机的子网,最后到达目标主机。
通俗的来说数据链路层解决的就是局域网内的通信问题:源主机是如何将数据包一步一步交给本地子网网关,由这个网关进行跨网络的路由转发。
源主机在发送消息时,首先会检查目标主机的IP地址是否与自己处于同一子网。如果是,则使用ARP协议获取MAC地址并进行通信;如果不是,则使用ARP协议获得路由器的mac地址将数据包发送到本地子网的默认网关(路由器的LAN口),由路由器根据路由表进行转发。
以太网
数据链路层要解决局域网通信问题,我们就要对局域网有所了解。
认识局域网
以太网(Ethernet)
- 以太网是最常用的局域网技术之一。它基于IEEE 802.3标准,使用双绞线作为传输介质。
Wi-Fi
- Wi-Fi是一种无线局域网技术,通过无线信号进行数据传输和通信。
令牌环网
- 令牌环网是一种采用环形拓扑结构的局域网技术,其中数据沿着一个逻辑上的环形路径进行传输。
以太网帧格式
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 帧末尾是CRC校验码。
两个问题
如何将报头和有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
有效载荷如何向上交付?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
理解MAC地址和IP地址
实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。
- IP地址描述的是路途总体的起点和终点。
- MAC地址描述的是路途上的每一个区间的起点和终点。
就像唐僧西天取经的时候,源IP就是长安城,目的IP就是天竺;而MAC地址就是中间路上的每一个站点向女儿国、火焰山等等。 因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。
认识MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);不同的数据链路层标准的MTU是不同的;
MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
将较大的IP包分成多个小包, 并给每个小包打上标签;
每个小包IP协议头的 16位标识(id) 都是相同的;
每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是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);
MSS和MTU的关系
ARP协议
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议; 地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
ARP协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯前必须获得目的主机的硬件地址;
ARP数据报格式
注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答。
ARP协议的工作流程
源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址
ARP缓存表
为什么要有缓存表?
提高效率:缓存表可以存储最近解析的地址映射关系,当需要再次访问相同的目标时,可以直接从缓存表中获取对应的地址,而无需再次发起网络查询。这样可以大大减少网络查询的次数,提高通信效率。
减少网络负载:如果没有缓存表,每次通信都需要进行地址解析,这将导致大量的网络查询流量,增加网络负载。缓存表可以有效减少这种不必要的网络流量。
快速响应:缓存表使得地址解析变得迅速,从而减少了通信的延迟,提高了网络的响应速度。
为什么表项要有过期时间而不是一直有效?
动态网络环境:在网络环境中,设备的IP地址和MAC地址可能会发生变化。如果缓存表中的表项一直有效,那么当目标设备的地址发生变化时,缓存表中的旧地址信息将导致通信失败。通过设置过期时间,可以确保缓存表中的地址信息保持最新。
防止资源耗尽:如果缓存表无限制地增长且表项永不过期,那么随着时间的推移,缓存表将占用越来越多的内存资源,可能导致系统资源耗尽。过期机制有助于定期清理旧的、不再需要的表项,从而释放内存资源。
安全性考虑:在网络中,可能存在恶意设备试图通过伪造ARP响应来实施ARP欺骗攻击。过期时间可以限制这种伪造响应的影响时间,因为伪造的表项会在一段时间后自动失效。
网络变化适应性:网络环境和配置可能会发生变化,例如设备的添加、移除或IP地址的更改。过期时间确保了缓存表能够适应这些变化,并及时更新以反映最新的网络状态。
今天对Linux数据链路层的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!!