一、数据链路层
(1)数据链路层与网络层的关联
数据链路层的主要功能就是负责相邻设备之间的数据传输 。
在网络层是点对点之间的通信。主要通过IP协议描述起点到终点。而链路层则是对网络层的补充,负责在起点到终点的路径中,每一个相邻节点的数据传输。
网络层主要关心的是从起点到终点
链路层则关心的是其中路径上的每一个相邻节点的通信
前面举过唐僧取经的例子
比如我们再举个例子:
比如我们要从河南前往北京,这是我们所描述的起点与终点,而光有起点和终点不行,还需要描述途中的行程,如先从河南坐车到某某机场,然后再从某某机场转机到地点A…来到北京,这边是途中所规划的路径。
这个从起点到终点的整个行程表就相当于我们的网络层。而这一个一个的地点的移动,也就是具体的行程方式与途径,就相当于数据链路层。
如果没有了行程表,即使知道出行方式和途径也不知道具体的路径。而只知道行程表,不通过具体的通行也只能停留在原地,这就是网络层与数据链路层之间的关系。有一点点类似于TCP辅助IP,TCP提供策略,IP提供行动。
(2)局域网通信原理
跨网络传输的本质是由无数个局域网转发的结果,要彻底理解跨网络转发,就要先理解局域网中的报文转发原理
在同一个局域网的主机,是可以直接通信的
如图:
首先m1要想和m6通信,m1发送一个mac帧到与总线相连的各个主机上,然后每个主机去判断是发送给我的,因为每个主机都有一个唯一标识即mac地址,不是则丢弃,是向上交付。
结论:
局域网中所有的主机其实都能收到对应的mac,只不过大部分主机在自己的数据链路层通过对比数据帧中的目标mac地址和自己的mac地址是否相等,来决策是否要后续处理。
抓包工具原理:
在局域网中,网卡是有一种混杂模式,不放弃任务数据帧,直接向上交付。
局域网通信的本质:
在局域网中,任何时候只能有一个主机发消息,如果多个消息被同时发送,会导致局域网中的数据发生碰撞,变为无效数据,所以它也要自己的策略,比如碰撞检测和碰撞避免算法来使主机尽量不发生碰撞。
从系统视角看局域网:
我们可以把它看作是一个临界资源,碰撞检测和碰撞避免来保证任何一个时刻只有一台主机能够向临界资源写入数据。
局域网不能太大,原因:
局域网太大,主机很多,任何时刻的碰撞概率会变大,比如无线WIFI,也是在局域网通信,人很多很卡因为,如果周围搭建的基站如果只有一个,而功率是一定的,所以卡。
缓解:可以用交换机,识别局部性的碰撞,对碰撞装数据不做转发,让碰撞概率变低。
(3)以太网协议
以太网协议:
网络层的ip协议负责的路由选择,说直白一点,网络层的ip协议在进行选路, 而具体如何从A机器到B设备,网络层并没有关心, 而是数据链路层负责相邻设备的转发。
以太网帧格式:
32位源MAC地址/目的MAC地址:表示发送端/接收端的MAC地址,用于描述识别相邻的设备,指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的。
16位上层协议:用于数据分用时选择上层解析的协议,帧协议类型字段有三种值,分别对应IP、ARP、RARP,为了方便接收方通过类型辨别当前以太网协议的有效载荷是提交给哪一个协议的。
32位FCS:帧末尾是CRC校验码,检验数据在传输过程中是否失真。
理解MAC地址和IP地址:
网络层进行选路,数据链路层负责相邻设备的转发。
数据链路层根据网络层选择的路由项, 进行转发。 一定需要直到要转发的这个路由所对应的相邻设备的MAC地址;
要么是子网内机器的MAC地址
要么是连接的路由项WAN对应的MAC地址
(4)ARP协议
上面说到了以太网协议格式,可以看到格式中的目的地址和源地址指的是目的MAC地址和源MAC地址,即数据在数据链路层的时候,需要知道目标主机MAC地址,但是网络层的协议递交给数据链路层的数据仅仅包含目标主机的ip地址,我们无法获知其对应的MAC地址。
如何获取目标主机的MAC地址呢?
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
因此在通讯前必须获得目的主机的硬件地址。
那也就是说在组织以太网协议的时候,就需要先知道相邻设备的MAC地址,这样才能一步步知道目的主机的硬件地址,但是如何当前主机不知道相邻设备的MAC地址,该如何做呢?
使用arp协议,获取相邻设备的MAC地址
- 获取子网内部机器的MAC地址
- 获取相连路由器设备WAN的MAC地址**
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.20的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址FF:FF:FF:FF:FF:FF表示广播)。
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
ARP缓存表
每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间,如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。(一般为20分钟)。
为什么要有ARP缓存表?
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存 一段时间。它指的是指预见到同样的信息可能会再次使用,在内存中开辟一块区域记忆这些信息。
即把第一次通过ARP获取到的MAC地址作为IP对MAC的映射关系记忆到一个ARP缓存表中,下一次再向这个IP地址发送数据报时不需再重新发送ARP请求,而是直接使用这个缓存表当中的MAC地址进行数据报的发送。提高效率。
注意:
每执行一次ARP,其对应的缓存内容都会被清除。不过在清除之前都可以不需要执行ARP就可以获取想要的MAC地址。这样,在一定程度上也防止了ARP包在网络上被大量广播的可能性。
arp协议只能在子网内部使用,只能给子网内部的机器进行广播arp请求。换句话说,只能获取子网内部机器的MAC地址。
问题:
IP地址和MAC地址缺一不可?
数据链路上只要知道接收端的MAC地址不就知道数据是准备发送给主机B的吗,那还需要知道它的IP地址?,只要知道了IP地址,即使不做ARP,只要在数据链路上做一个广播不就能发给主机B了吗为什么既需要IP地址又需要MAC地址?
如下图:
主机A想要发送IP数据报给主机B时必须得经过路由器C。即使知道了主机B的MAC地址,由于路由器C会隔断两个网络,还是无法实现直接从主机A发送数据报给主机B,发送ARP是有条件的。此时,主机A必须得先将数据报发送给路由器C的MAC地址C1。
所以IP地址和MAC地址两者缺一不可。于是就有将这两个地址相关联的ARP协议,为了避免这两个阶段的通信带来过多的网络流量,ARP具有对IP地址和MAC地址的映射进行缓存的功能。有了这个缓存功能,发送IP包时就不必每次都发送ARP请求,从而防止性能下降
二、NAT协议
NAT服务器将网络划分成为公网和私网,针对私网请求数据继续转换源ip地址,针对公网回复的应答数据转换目的ip地址,它针对消息的双方是透明的,无感知。网络请求只能由私网主机发起,NAT转换, 公网主机应答。NAT服务器在转换之后,需要保存映射关系。
前面说到IPv4协议中, IP地址数量不充足的问题,NAT技术当前解决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的首部进行转换。
总结:
- 私网对公网请求的时候:将网络数据当中的私网的源ip地址转化成为公网的ip地址。
- 公网对私网的应答:将网络数据当中的公网的目的ip地址转化成为私网的ip地址。
- 静态NAT:NAT协议,将一个私网和一个公网唯一进行映射管理。
- 动态NAT:NAT管理的不止是一个公网ip,当私网数据到来的时候,选择一个空闲的ip进行映射。
但是不管是静态还是动态都是1对1的关系,都是一个私网IP映射一个公网IP,并没有实质性的的缓解枯竭。
三、NAPT协议
问题:
因为NAT并没有实质性解决问题,如果私网中有多个主机同时访问同一个外网的服务器,并且服务器返回的数据中,目的的IP地址都是相同的,因为都是通过NAT映射的同一个公网IP。那么此时,NAT路由器如何判定要把数据转发给哪一个数据?
这时候又引入了NAPT技术,使用IP地址加端口号来解决这个问题。
从下图看,发送时,通过NAPT技术,将不同主机的发送端口号进行处理,使得发送的时候的时候虽然用的是同一个IP地址,但是端口号不同,并且将这些映射关系存于转换表中,等数据发送回来时,在转发给对应的主机。
例子:
主机163.221.120.9的端口号是80,左面图中有两个客户端10.0.0.10和10.0.0.11同时进行通信,并且这两个客户端的本地端口都是1025。此时,仅仅转换IP地址为某个全局地址202.244.174.37,会让转换后的所有数字完全一致。因此,只要将10.0.0.11的端口号转换为1026就可以解决问题。NAPT路由器生成一个NAPT转换表,就可以正确地转换地址跟端口的组合,让客户端A、B能同时与服务器之间进行通信。
什么时候生成这个表?
这种转换表在NAT路由器上自动生成。在TCP的情况下,建立TCP连接首次握手时的SYN包一经发出,就会生成这个表。而后又随着收到关闭连接时发出FIN包的确认应答从表中被删除,UDP中两端应用进行通信时起止时间不一定保持一致,因此在这种情况下生成转换表相对较难 。
为什么UDP通信两端起止时间不一定保持一致?
这是因为UDP是一种无连接的协议,它不提供可靠的数据传输和流量控制机制。由于UDP没有建立连接的过程,它不会维护任何连接状态或发送确认。发送方将消息封装成数据包并发送给接收方,而接收方会尽可能地接收和处理这些数据包,这意味着无法保证数据包的传递顺序、可靠性或时序性。
在UDP中,发送方和接收方独立工作,互不干扰。这意味着发送方可以以自己的速度发送数据包,而接收方可以以不同的速度接收和处理数据包。这可能导致起止时间不一致,因为发送方可能在短时间内发送大量数据包,而接收方可能需要更长的时间来接收和处理这些数据包。
总结:
在使用TCP或UDP的通信当中,只有目标地址、源地址、目标端口、源端口以及协议类型(TCP还是UDP)五项内容都一致时才被认为是同一个通信连接。此时所使用的正是NAPT。NAPT的场景下,一个公网ip,理论上最大可以转换多65536私网ip。
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地址。
它能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期)。ping命令会先发送一个 ICMP Echo Request给对端。
对端接收到之后, 会返回一个ICMP Echo Reply。
注意:
telnet是23端口, ssh是22端口, 那ping是什么端口?
因为ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息。
五、DNS
现说一下NAT的缺陷:
因为NAT的转换完全依赖这个转换表,所以有着很多限制。
- 无法从NAT外部向内部服务器建立连接;
- 转换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开
所以这时候就有了代理服务
其实代理服务器就是个人网络与互联网服务商之间的中间代理机构。
打个比方,比如我们直接访问服务器,就相当于我们直接去生产厂家买东西,此时可能因为路途遥远,或者手续繁琐导致时间会很长。而通过代理服务器请求服务,就相当于帮我们在代销商这里买东西,他把货从遥远的地方进过来,手续他也处理好了,我们只需要付钱拿货就行。
代理服务器是一种应用比较广的技术.
翻墙: 广域网中的代理.
负载均衡: 局域网中的代理.
例子:
例如我们访问一些国外的网站时,直接访问是不行的,而通过代理服务器请求服务,让他来获取数据,再把数据转发给我们,此时我们就也能获取到了这个网站的数据。
当使用代理服务器访问同一个目标服务器的人多了之后,为了提高效率,不用每次都去转发来获取数据,代理服务器可能会提前将目标服务器的内容缓存下来,有人访问时直接将缓存的数据发送回去,这就是反向代理的技术,而前面所说的转发的那种是正向代理。
正向代理服务器本质上将各种请求收集在一起,方便对请求做管理
反向代理服务器往往作为一个缓存
而通过反向代理服务器把到来的流量或请求较为均衡地分散到各个集群不同的主机上,叫负载均衡。
注意:
需要注意的是,这里的代理服务与NAT服务是完全不同的东西,虽然看上去很像。
代理服务是一个应用层服务,可以部署在任意设备上,工作在应用层,我们个人向代理服务器发起请求,然后他再去访问目标服务器。
而NAT服务是一个网络层服务,部署在网关设备上,工作在网络层,我们请求的是目标服务器。
六、DHCP
DHCP是一种网络协议,用于自动分配IP地址和其他与网络连接相关的配置信息给网络中的设备。
如果每到一个新地方,每连接一台新设备,都需要设置一次IP地址,这无疑是一件非常麻烦的事情。所以为了实现自动设置IP地址,统一管理IP地址分配,就产生了DHCP。
文章来源:https://www.toymoban.com/news/detail-622252.html
当主机连接到网关设备时,就会广播DHCP请求,获取到网关的IP地址,以及DHCP服务自动分配给自己的IP地址,生成自己的路由表。
注意:文章来源地址https://www.toymoban.com/news/detail-622252.html
- 在大型网络环境中,可能会有一个或多个专门的DHCP服务器,用于管理和分配大量设备的IP地址和配置信息。这些 DHCP 服务器可以集中管理整个网络中的 IP 地址池,并为连接到网络的设备动态分配合适的 IP 地址,使每个设备都能够在网络中进行通信。
- DHCP服务器通常支持其他配置参数的分配,例如子网掩码、默认网关、DNS服务器等。通过 DHCP,网络管理员可以更轻松地管理和配置大量设备,而无需手动为每个设备分配和配置网络信息。
- 在小型网络或家庭网络环境,路由器通常集成了DHCP服务器的功能,因此路由器可以充当 DHCP 服务器。但对于大型网络或要求更复杂网络配置的环境,会单独设置专用的 DHCP 服务器
到了这里,关于Linux【网络基础】数据链路层&IP协议技术补充&DNS&DHCP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!