网络编程 ———— 数据链路层(mac地址+ARP+DNS)

Posted 爱敲代码的三毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程 ———— 数据链路层(mac地址+ARP+DNS)相关的知识,希望对你有一定的参考价值。

文章目录


数据链路层概念

数据链路层负责的工作:两个相邻节点之间数据的传输

核心的协议:以太网(涉及到数据链路层+物理层的协议)

网线:以太网线

此处的“目的地址”,"源地址"指的是mac地址,和IP地址还是有很大区别的

一个mac地址占6个字节

mac地址

mac地址占6个字节,当前看来一般情况下mac地址是可以做到每个主机都有唯一的地址。

IP地址是动态分配(连上网络之后,对应的路由器/其它设备会给这个主机自动分配一个IP)

mac地址是写死的(网卡出厂的时候,就被写死了)

当下来看,IP存在的目的,是为了描述一个主机在互联网上的位置,mac地址也能描述一个主机的位置。

  1. 网络层协议和数据链路层协议,在发明之初,也是各自独立的,因此IP地址和mac地址就被独立发明出来
  2. 这两个地址,起到的作用还是有区别的

MTU

物理层其实是存在这样的硬件限制的,对应的数据链路层的数据帧,也是有一定的大小范围,这个范围指标就称为MTU

IP数据包分包,往往不是死因为触达了IP的长度上限才分的包,而是因为触达了MTU产生的分包

ARP

ARP协议,是一个"辅助性"的协议,这个协议严格的说不仅仅是属于数据链路层的,而是跨越数据链路层和网络层

这个协议的功能就是根据IP协议的功能就是根据IP查询对应的mac地址


在网络传输的具体过程中,A 要把数据传给主机B

就需要先查A自身的路由表,路由表查到的是一个 网络接口,进一步对应着主机B的IP

光知道主机B的IP还不够,是要知道主机B的 mac 地址,把这个mac地址放到数据链路层的报头中,才能完成封装过程

主机A在最初的联网阶段,就会进行一个操作"mac"学习,就会把和它相邻的设备的IP和mac的对应关系给维护起来

内部建立一个类似于哈希表这样的结构(key:ip;value: mac),如果构建出这张表,其实就是通过ARP协议来进行的

这个表不一定是在内存中,也不一定是hash 表,可能是个硬表

路由器/交换机,有一个关键性的硬件设备,转发芯片(LSW)

转发芯片和CPU,内存…是并列关系

在转发芯片上也包含了一些寄存器,访问寄存器的速度,要比访问内存还要快很多

因此这个表可能就直接在寄存器只中存储?

ARP协议的工作过程

简单来说,设备接入网络的时候,先广播一个ARP请求(当前局域网中广播),收到这个请求的设备放回ARP响应(包含了每个设备的ip和mac)

新接入网络的设备,就把这样的关系给保存起来就可以了

这样的过程可能会周期性的进行,主要因为网络的环境可能会动态变化

DNS

最初的DNS其实就是一个文本文件,叫做hosts文件,文件里面保存的就是键值对,IP和域名对应关系.

hosts文件是保存在每个主机上的,一旦域名和ip的映射关系发生改变了 ,此时就麻烦了

因此,hosts文件这个机制已经被淘汰了,现在已经不使用hosts来进行域名解析了,但是这个文件仍然存在

现在使用hosts的场景,一般是进行测试程序的时候,某个程序里面依赖另外一个服务器(通过域名来访问这个服务器),测试该程序的时候就可以修改hosts,把这个域名映射到测试的服务器ip上

现在的DNS是一组专门的服务器,通过这个服务器就可以完成域名解析

全世界那么多电脑,都需要访问DNS服务器,怎么办?

这一个DNS服务器显然是顶不住全世界的访问请求的。

为了解决这个问题,有一系列方案

  1. 浏览器/客户端本身会对域名解析结果进行缓存(域名和IP对应关系,是可能会改变,但是并不频繁),这样就避免了大量的不必要的DNS请求

  2. DNS服务器也不是只有一台,而是有多台

    这些最初的DNS服务器,都是有专门的组织机构来负责维护

    根域名服务器,这些服务器就包含了所有的DNS信息

    如果你要想申请个域名,就需要人家批准,然后把这个结果放到DNS根域名服务器中

  3. 为了更进一步的降低压力,各种网络运营商,也会构建自己的域名服务器镜像

    就会在国内就近构造一些DNS服务器,定期从根域名服务器这边同步数据过来

    国内用户使用DNS服务器,定期从根域名服务器这边同步数据过来

    每个地区,甚至是每个城市也有自己的DNS服务器即可

  4. 针对DNS服务器做镜像的时候还可以按照域名来进一步划分

    com搞个专门的服务器

    org搞个专门的服务器

    vip搞个专门的服务器

    就能够保证每个服务器的数据量和请求量都不是太大


以上是关于网络编程 ———— 数据链路层(mac地址+ARP+DNS)的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络编程(数据链路层)

TCP/IP学习20180709-数据链路层-arp协议

Linux网络编程----网络接口层(数据链路层+物理层)

Linux网络编程----网络接口层(数据链路层+物理层)

arp协议的作用是由ip地址求mac地址

ARP 协议