Linux从青铜到王者第二十一篇:Linux网络基础第三篇之数据链路层
Posted 森明帮大于黑虎帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux从青铜到王者第二十一篇:Linux网络基础第三篇之数据链路层相关的知识,希望对你有一定的参考价值。
系列文章目录
文章目录
前言
数据链路层用于两个设备(同一种数据链路节点)之间进行传递!
一、 数据链路层的以太网协议
数据链路层的以太网协议本质上其实就是相邻设备之间的数据转发。
以太网协议格式:
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的。
- 帧协议类型字段有三种值,分别对应IP、ARP、RARP。
- 帧末尾是CRC校验码。
二、认识MAC地址
MAC地址:每一个网卡设备在出厂的时候都会拥有一个全球独一无二的MAC地址,MAC地址也被称为硬件的地址。
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)。
以太网格式中的类型(2位):
表示的是上层使用了什么协议 (ip / ARP协议)。
有效载荷:[46 ~ 1500]字节:
如果网络层递交给数据链路层的数据不够46字节,则会对数据进行相应补0的操作。1500字节刚好是MTU(最大传输单元)的上限。
CRC::
校验帧尾,检验数据在传输过程中是否失真。
三、对比理解MAC地址和IP地址
- IP地址描述的是路途总体的 起点 和 终点。
- MAC地址描述的是路途上的每一个区间的起点和终点。
四、ARP协议的作用
上面其实我们也谈到了以太网协议格式,我们可以看到格式中的目的地址和源地址指的是目的MAC地址和源MAC地址,换句话说,数据在数据链路层进行发生的时候,需要知道目标主机MAC地址,但是网络层的协议递交给数据链路层的数据仅仅包含目标主机的ip地址,我们无法获知其对应的MAC地址,那么,我们该如何获取目标主机的MAC地址呢?
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
- 因此在通讯前必须获得目的主机的硬件地址。
ARP协议就是用来解决此类问题的,他可以通过ip地址获取对应的MAC地址。
注意:这里的ip地址本质上是通过路由项计算出来的接下来该条数据该去往的ip地址,而不是自己本身该去的ip地址。
因此,可以说ARP协议是介于网络层和数据链路层之间的协议,话句话来说就是ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。
五、ARP数据报格式
首先我们来看一下以太网首部的格式:
- 以太网目的地址:在ARP请求中,目的MAC地址填充为:0xFFFFFFFF,表示当前这条数据给子网当中的每一条机器都进行转发。
- 以太网源地址:就是源MAC地址,就是当前主机的MAC地址。
- 帧类型:上级协议(ARP协议)
28字节ARP请求/应答:
- 硬件类型:当前的网络类型:以太网、令牌环网。
- 协议类型:要转换的地址类型,ip转换为MAC。
- 硬件地址长度:表示MAC地址长度。
- 协议地址长度:表示ip地址长度。
- op:标识是请求还是应答
1:请求
2:应答
五、ARP协议工作流程
是一种解决地址问题的协议。以目标IP地址为线索,用来定位下一个应该接收数据分包的网络设备对应的MAC地址,通俗来讲就是获取相邻设备的MAC地址。
如果目标主机不在同一个链路上时,可以通过ARP查找下一跳路由器的MAC地址。不过ARP只适用于IPv4,不能用于IPv6
那么ARP又是如何知道MAC地址的呢?简单地说,ARP是借助ARP请求与ARP响应两种类型的包确定MAC地址的。
假定主机A向同一链路上的主机B发送IP包,主机A的IP地址为172.20.1.1,主机B的IP地址为172.20.1.2,它们互不知道对方的MAC地址。
主机A为了获得主机B的MAC地址,起初要通过广播发送一个ARP请求包。这个包中包含了想要了解其MAC地址的主机IP地址。也就是说,ARP请求包中已经包含了主机B的IP地址172.20.1.2。由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路由器进行解析。如果ARP请求包中的目标IP地址与自己的IP地址一致,那么这个节点就将自己的MAC地址塞入ARP响应包返回给主机A。
总之,从一个IP地址发送ARP请求包以了解其MAC地址(ARP请求包还有一个作用,那就是将自己的MAC地址告诉给对方),目标地址将自己的MAC地址填入其中的ARP响应包返回到IP地址。由此,可以通过ARP从IP地址获得MAC地址,实现链路内的IP通信。
- 源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)。
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
- 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。
使用抓包工具进行分析:
六、ARP缓存表
使用arp -a查看arp缓冲表:
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存(是指预见到同样的信息可能会再次使用,从而在内存中开辟一块区域记忆这些信息) 一段时间。即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆(记录IP地址与MAC地址对应关系的数据库叫做ARP表) 到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。每执行一次ARP,其对应的缓存内容都会被清除。不过在清除之前都可以不需要执行ARP就可以获取想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性。
当然ARP是有老化时间的,老化时间为20min,会进行相应的更新。
arp协议只能在子网内部使用,只能给子网内部的机器进行广播arp请求。换句话说,只能获取子网内部机器的MAC地址。
那么问题来了,IP地址和MAC地址缺一不可吗?
① 数据链路上只要知道接收端的MAC地址不就知道数据是准备发送给主机B的吗,那还需要知道它的IP地址吗?
② 只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗?”那么,为什么既需要IP地址又需要MAC地址呢?
主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B。此时,主机A必须得先将数据报发送给路由器C的MAC地址C1。
如此看来,IP地址和MAC地址两者缺一不可。于是就有将这两个地址相关联的ARP协议(为了避免这两个阶段的通信带来过多的网络流量,ARP具有对IP地址和MAC地址的映射进行缓存的功能。有了这个缓存功能,发送IP包时就不必每次都发送ARP请求,从而防止性能下降)。
七、DNS(Domain Name System)
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系。
cat /etc/hosts 查看hosts文件内容
DNS是一整套从域名映射到IP的系统。DNS协议本身是应用层的协议,并且在传输层使用的UDP协议。也叫域名解析协议,他的作用就是将域名解析为ip地址。
- 域名:
- 一级域名:.com、.cn、.gov、.us。
- 二级域名:baidu.com、jd.com、taobao.com。
- 三级域名:baike.baidu.com。
- 域名服务器:
- 根域名服务器:给其他域名服务器做授权使用。
- 一级域名服务器:管理一级域名。
- 二级域名服务器:管理二级域名。
- 三级域名服务器:管理三级域名。
至今, 我们的计算机上仍然保留了hosts文件,在域名解析的过程中仍然会优先查找hosts文件的内容。
域名解析的流程:
递归域名解析:
迭代法域名解析:
八、NAT协议
之前我们讨论了,IPv4协议中, IP地址数量不充足的问题,NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能,NAT也叫地址转换协议。
- 作用:
- 私网对公网请求的时候:将网络数据当中的私网的源ip地址转化成为公网的ip地址。
- 公网对私网的应答:将网络数据当中的公网的目的ip地址转化成为私网的ip地址。
- 静态NAT:NAT协议,将一个私网和一个公网唯一进行映射管理。
- 动态NAT:NAT管理的不止是一个公网ip,当私网数据到来的时候,选择一个空闲的ip进行映射。
NAT的工作机制:
如上图,以10.0.0.10的源主机与163.221.120.9的目的主机进行通信为例。利用NAT,途中的NAT路由器将发送源地址从10.0.0.10转换为全局的IP地址(202.244.174.37)再发送数据。反之,当包从地址163.221.120.9发过来时,目标地址(202.244.174.37)先被转换成私有IP地址10.0.0.10以后再被转发(在TCP或UDP中,由于IP首部中的IP地址还要用于校验和的计算,因此当IP地址发生变化时,也需要相应地将TCP、UDP的首部进行转换)
总结一下就是:不管是静态NAT还是动态NAT,都没有缓解ipv4枯竭的问题,本质上还是一个私网IP一定要对应一个公网ip,才能访问互联网。
九、NAPT协议(动态NAT重载)
在进行私网ip转化为公网ip的时候,不仅仅将ip地址转换掉了,并且还将传输层的端口也转换掉了。
主机163.221.120.9的端口号是80,LAN中有两个客户端10.0.0.10和10.0.0.11同时进行通信,并且这两个客户端的本地端口都是1025。此时,仅仅转换IP地址为某个全局地址202.244.174.37,会令转换后的所有数字完全一致。为此,只要将10.0.0.11的端口号转换为1026就可以解决问题。如图所示,生成一个NAPT路由器的转换表,就可以正确地转换地址跟端口的组合,令客户端A、B能同时与服务器之间进行通信。这种转换表在NAT路由器上自动生成。例如,在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除(UDP中两端应用进行通信时起止时间不一定保持一致,因此在这种情况下生成转换表相对较难) 。
注:在使用TCP或UDP的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP还是UDP)五项内容都一致时才被认为是同一个通信连接。此时所使用的正是NAPT。
NAPT的场景下,一个公网ip,理论上最大可以转换多少个私网ip?
216 = 65536个,即 0 ~ 65535。
对NAT协议的总结:
- NAT网关对于私网主机和公网主机而言,是透明的,双方在通信过程中是无感知的。
- NAT网关会保存转换之后的映射关系,防止应答回来之后再次进行转换。
- 私网 =》公网:是将网络数据当中的源ip地址修改为公网ip地址。
- 公网 =》私网:是将网络数据当中的目的ip地址修改成为私网ip地址。
- NAPT增加了端口的转换,就可以让一个公网ip服务多个私网主机。缓解了ip地址枯竭的问题数据只能先从私网到公网,不能从公网到私网。
十、ICMP协议
ICMP协议是一个 网络层协议一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因。
- ICMP功能:
- 确认IP包是否成功到达目标IP地址。
- 通知在发送过程中IP包被丢弃的原因。
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议。
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6。
十一、ping命令
- 注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址。
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)。
- ping命令会先发送一个 ICMP Echo Request给对端。
- 对端接收到之后, 会返回一个ICMP Echo Reply。
一个值得注意的坑:
- 有些面试官可能会问: telnet是23端口, ssh是22端口, 那么ping是什么端口?千万注意!!! 这是面试官的圈套!
ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息。
总结
以上就是今天要讲的内容,本文详细介绍了数据链路层以太网协议等协议,网络提供了大量的方法供我们使用,非常的便捷,我们务必掌握!到这里网络这部分就结束了哦,后面还会有新的只是更新,希望大家多多支持!另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。加油啊!
以上是关于Linux从青铜到王者第二十一篇:Linux网络基础第三篇之数据链路层的主要内容,如果未能解决你的问题,请参考以下文章
Linux从青铜到王者第二十四篇:Linux网络基础第四篇之WebSocket协议
Linux从青铜到王者第二十篇:Linux网络基础第三篇之IP协议