Linux【网络】数据链路层
- 数据链路层
- 以太网帧格式
- 对比理解MAC地址和IP地址
- ARP协议--地址解析协议
- ARP工作流程
- ARP请求
- ARP应答
- 其他协议
- DNS-域名解析协议
- ICMP--网络层协议
- NAT技术
- NAPT
- 正向代理与反向代理
数据链路层
数据链路层用于两个设备,同一数据链路节点之间的信息传输
链路:一个节点到另一个相邻节点的一段物理线路,中间没有任何其他节点。链路由传输介质和物理设备组成,传输介质主要有双绞线、光纤、微波。在两个计算机进行通信的时候,链路只是一条完整通信路径的一部分
数据链路(Data Link):把实现控制数据传输协议的硬件和软件加到链路上就构成了数据链路。
帧(frame):数据链路层把网络层交付的数据构成帧发送到链路上,把接收到的帧取出来,交给上层的网络层
IP的核心作用是提供一种跨网络传输数据的能力。数据在使用IP进行转发时,一定先要把数据交给直接相连的下一跳主机,下一次跳到哪里,由IP层决定,而怎么跳,就是数据链路层决定了。
数据链路层:解决如何从主机到路由器这个局域网中的通信问题
以太网帧格式
解包:MAC帧采用的分离报头的方案是定长报头,报头一共14字节,
最后两个字节包含了一个类型字段,
如果是0800,表明报文是IP数据报,
如果是0806,表明是ARP请求/应答,
如果是8035,表明是RARP请求/应答。
MAC帧对传输的数据有要求,不能太长,同时也要求数据不能太短,如果太短后面就会有PAD填充。
前面两个字段分别是目的MAC地址和源MAC地址,长度是48位,6字节,用来让主机区分报文是否是传给自己的,一般用冒号16进制的形式来表示(例如:08:00:27:03:fb:19),MAC地址出厂就确定了,不能更改。后面还会有一个CRC校验。
交付:根据2字节的帧类型
对比理解MAC地址和IP地址
实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。
IP地址描述的是路途总体的起点和终点。
MAC地址描述的是路途上的每一个区间的起点和终点。
数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。
ARP协议–地址解析协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址
协议格式如下
- 硬件类型指链路层的网络类型,1为以太网。
- 协议类型指要转换的地址类型,0x0800为IP地址。
- 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
- 协议地址长度对于IP地址为4字节,因为IP地址是32位的。
- op字段为1表示ARP请求,op字段为2表示ARP应答。
从ARP的数据格式可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段对应的就是以太网首部,由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段
ARP工作流程
路由器A要将数据转发给同一局域网当中的主机F,前提是路由器A必须知道主机F的MAC地址,而现在路由器A只知道主机F的IP地址,因此路由器A现在需要向主机F发起ARP请求,然后等待主机F发送ARP应答得知主机F的MAC地址
ARP请求
第一步:构建ARP请求
第二步:封装成MAC帧
第三步:广播到局域网中
第四步:所有主机解包,往ARP层交付
MAC帧封装完毕后,路由器A就可以将封装好的MAC帧以广播的方式发送到局域网当中了
- 这个MAC帧是以广播的方式发出的,局域网当中的每台主机收到这个MAC帧后,都会对该MAC帧进行解包。当这些主机识别到MAC帧当中的帧类型字段为0806后,便知道这是一个ARP的请求或应答的数据包,于是会将MAC帧的有效载荷向上交付给ARP层。
- 当ARP层收到这个数据包后,先判断ARP数据包当中的op字段,判定这是一个ARP请求,然后再提取出ARP数据包当中的目的IP地址字段。
- 局域网当中的所有主机都会将该数据包交给自己的ARP层,但最终只有主机F发现ARP数据包当中的目的IP地址与自己相同,因此只有主机F会对该ARP请求进行应答,而局域网当中的其他主机在识别到ARP数据包当中的目的IP地址与自己不匹配后,就会直接将这个ARP请求报文丢弃。
注意:其他主机收到MAC帧后,先判断op类型为请求,交付给ARP层之后再去判断IP是否符合,不符合的报文是在ARP层丢弃的
ARP应答
1.构建ARP应答包
2.发送到局域网中
3.所有主机解包判断
4.不符合的在MAC层丢弃
- 局域网当中的所有主机都能收到这个MAC帧,但局域网当中的不相干的主机解包后,发现该MAC帧对应的以太网目的地址与自己不同后,就会将该MAC帧丢弃,而不会交付给上层ARP层,最终只有路由器A会将解包后MAC帧的有效载荷向上交付给自己的ARP层
- 当路由器A的ARP层收到这个数据包后,先看ARP的op字段,发现是一个ARP应答,然后就会提取出ARP数据包当中的发送端以太网的地址和发送端IP地址,此时路由器A就拿到了主机F的MAC地址。
注意:局域网当中其他不相干的主机在收到这个ARP应答报文后,直接在MAC帧层就丢弃了,并没有将其交付给自己的ARP层
任何主机,无论收到ARP请求还是应答,都是先判断op字段
其他协议
DNS-域名解析协议
DNS是一整套从域名映射到IP的系统,网络真实的通信过程其实和域名是没有关系的,能够用域名上网,一定是把域名转换成了IP
DNS底层使用的是UDP协议,DNS是通过向域名解析服务器发起UDP请求,解析自己DNS,也就是说浏览器不考虑缓存时,要做的第一件事就是域名解析
DNS系统是一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系。如果新计算机接入网络,将这个信息注册到数据库中。当用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库,得到对应的IP地址。
以www.baidu.com为例:
com:一级域名,一般以.com结尾的表示是一个企业域名,表示该公司是一家盈利性的商业公司。同级的还有.net网提供商。.org表示开源组织或非营利性组织,比如boost.org
baidu:二级域名,一般代表公司相关名称 www是一种习惯性写法,写不写都可以访问
总结:当我们使用浏览器输入域名的时候,先把域名转化为ip地址,然后再使用ip+端口号使用特定协议向服务器发起请求
ICMP–网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因
ICMP功能
ICMP正是提供这种功能的协议;
ICMP主要功能包括:
- 确认IP包是否成功到达目标地址.
- 通知在发送过程中IP包被丢弃的原因.
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6
ping命令的底层就是通过ICMP来实现的:
-
此处 ping 的是域名, 而不是url!,一个域名可以通过DNS解析成IP地址;
-
ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期);
-
ping命令会先发送一个 ICMP Echo Request给对端;
-
对端接收到之后, 会返回一个ICMP Echo Reply;
-
ping命令是不关注端口的,因为ping命令是基于ICMP, 是在网络层,跳过了传输层;而端口号, 是传输层的内容。在ICMP中根本就不关注端口号这样的信息。
NAT技术
NAT技术背景
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题
NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能;
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法
NAT IP转换过程
NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37
NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表
当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系
NAPT
如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系<k,v>
把每一台主机看成一个客户端进程,目标主机看成服务器进程
客户端主机进程的ip不同,端口号相同,在经过NAT路由器的时候,NAT路由器会将端口号替换为未被使用的端口号
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制
无法从NAT外部向内部服务器建立连接
装换表的生成和销毁都需要额外开销
通信过程中一旦NAT设备异常, 所有的TCP连接也都会断开
正向代理与反向代理
正向代理:正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端
- 正向代理需要主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去访问内容并返回
- 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见
反向代理:
反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。
-
正向代理需要配置代理服务器,而反向代理不需要做任何设置。
-
反向代理是代理服务器,为服务器收发请求,使真实服务器对客户端不可见
-
负载均衡策略:客户端可能会发送大量的数据,反向代理服务器需要合理的将数据分配给服务器集群。
-
作为反向代理的服务器,需要配置较高,充当软件服务的可以是Nginx,当反向代理服务器中的服务器集群将请求处理完,可以通过代理服务器将结果发回给客户端,也可以直接发回给客户端。
NAT和代理服务器的区别:
-
从应用层面上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题。代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器;
-
从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换,代理服务器往往工作在应用层;
-
从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网。
-
从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上