网络编程 ———— 数据链路层(mac地址+ARP+DNS)
Posted 爱敲代码的三毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程 ———— 数据链路层(mac地址+ARP+DNS)相关的知识,希望对你有一定的参考价值。
文章目录
数据链路层概念
数据链路层负责的工作:两个相邻节点之间数据的传输
核心的协议:以太网(涉及到数据链路层+物理层的协议)
网线:以太网线
此处的“目的地址”,"源地址"指的是mac地址,和IP地址还是有很大区别的
一个mac地址占6个字节
mac地址
mac地址占6个字节,当前看来一般情况下mac地址是可以做到每个主机都有唯一的地址。
IP地址是动态分配(连上网络之后,对应的路由器/其它设备会给这个主机自动分配一个IP)
mac地址是写死的(网卡出厂的时候,就被写死了)
当下来看,IP存在的目的,是为了描述一个主机在互联网上的位置,mac地址也能描述一个主机的位置。
- 网络层协议和数据链路层协议,在发明之初,也是各自独立的,因此IP地址和mac地址就被独立发明出来
- 这两个地址,起到的作用还是有区别的
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服务器显然是顶不住全世界的访问请求的。
为了解决这个问题,有一系列方案
-
浏览器/客户端本身会对域名解析结果进行缓存(域名和IP对应关系,是可能会改变,但是并不频繁),这样就避免了大量的不必要的DNS请求
-
DNS服务器也不是只有一台,而是有多台
这些最初的DNS服务器,都是有专门的组织机构来负责维护
根域名服务器,这些服务器就包含了所有的DNS信息
如果你要想申请个域名,就需要人家批准,然后把这个结果放到DNS根域名服务器中
-
为了更进一步的降低压力,各种网络运营商,也会构建自己的域名服务器镜像
就会在国内就近构造一些DNS服务器,定期从根域名服务器这边同步数据过来
国内用户使用DNS服务器,定期从根域名服务器这边同步数据过来
每个地区,甚至是每个城市也有自己的DNS服务器即可
-
针对DNS服务器做镜像的时候还可以按照域名来进一步划分
com搞个专门的服务器
org搞个专门的服务器
vip搞个专门的服务器
就能够保证每个服务器的数据量和请求量都不是太大
以上是关于网络编程 ———— 数据链路层(mac地址+ARP+DNS)的主要内容,如果未能解决你的问题,请参考以下文章