网络 :数据链路层
一、MAC地址
MAC地址(Media Access Control Address)也称为硬件地址或物理地址(Physical Address)
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).
大多数接入internet的方式是把主机通过局域网连接在一起,然后再通过交换机或者路由器等设备和internet相连接,由于IP地址是基于逻辑上的标识,是任意人都可以修改的,所以可信度并不是很高,因此不能用来标识用户,但Mac地址对于一台设备来说是出厂设置好的,固定的,理论上来说,除非把硬件设施(网卡)盗过来,否则是无法冒名顶替Mac地址标识的设备。
1.1 对比理解MAC地址和IP地址
IP地址通常工作于广域网,路由器处理的就是IP地址。 MAC地址工作于局域网,局域网之间的互连一般通过现有的公用网或专用线路,需要进行网间协议转换。
协同关系:数据包传输时,IP地址决定目标网络位置,MAC地址确保数据在物理链路中正确传递。
举个例子:
IP地址的作用
- 当你在浏览器输入 www.google.com,你的电脑(IP:192.168.1.10)需要通过目标服务器的IP地址(如 142.250.189.206)找到谷歌的服务器。
- IP地址负责跨网络的逻辑寻址,告诉数据包如何从你的家庭网络(局域网)穿过运营商网络(广域网)最终到达谷歌的服务器。
MAC地址的作用
- 在家庭局域网内,你的电脑(MAC:00:1A:2B:3C:4D:5E)需要将数据包发送给路由器(MAC:AA:BB:CC:DD:EE:FF)。
- MAC地址确保数据在同一网络(如Wi-Fi)中直接传输,路由器收到后才会通过IP地址将数据转发到外网。
可以理解为 IP 实现 主机A到主机B之间 的通信过程 ,但是在这个过程中需要实现很多的局部通信(例如路由器和路由器之间以及路由和主机之间的通信),而这个过程则需要MAC地址。
二、以太网帧格式
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
- 帧协议类型字段有三种值,分别对应IP报文、ARP、RARP;
- 帧末尾是CRC校验码。
MAC帧主要有两类:
- 一类是有效载荷为正常的从上层传输下来的IP报文
- 另一类是数据链路层自己的有效载荷,包含ARP请求/应答 或 RARP请求/应答,这类报文在讲ARP协议时会重点谈论,ARP协议和以太网技术是当前有线局域网通信中最重要的两个部分。
报文末尾有PAD字段,该字段为填充字段,用于填充报文长度,因为MAC帧层规定有效载荷最小下限不能低于46字节,所以需要填充18字节的长度,但在接收方填充字段会被直接忽略掉,PAD并不会对通信产生实际影响,我们可以直接忽略掉他。
MAC帧包括6字节的目的MAC地址和源MAC地址,以及两个字节的类型字段,0800是普通MAC帧,0806和8035分别代表封装ARP和RARP请求应答的MAC帧。
三、MTU
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议在某一层上面所能通过的最大数据报大小(以字节为单位),它通常与链路层协议有密切的关系。
MTU相当于发快递时对包裹尺寸的限制. 这个限制是 不同的数据链路对应的物理层, 产生的限制.
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的MTU是不同的;
3.1 MTU对IP协议的影响
由于数据链路层MTU的限制, 对于较大的IP数据包要进行分包.
- 将较大的IP包分成多个小包, 并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据;
具体的IP分片与组装可以看看这里
3.2 MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
3.3 MTU对于TCP协议的影响
- TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
使用ifconfig
命令, 即可查看ip地址, mac地址, 和MTU
四、ARP协议
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。
4.1 ARP协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址;
在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。
在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。
所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
4.2 ARP数据报的格式
ARP是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为下图所示。
- 硬件类型:占两字节,表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
- 上层协议类型:占两字节,表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800。
- MAC地址长度:占一字节,标识MAC地址长度,以字节为单位,此处为6。
- IP协议地址长度:占一字节,标识IP得知长度,以字节为单位,此处为4。
- op操作类型:占2字节,指定本次ARP报文类型。1标识ARP请求报文,2标识ARP应答报文。
- 源MAC地址:占6字节,标识发送设备的硬件地址。
- 源IP地址:占4字节,标识发送方设备的IP地址。
- 目的MAC地址:占6字节,表示接收方设备的硬件地址,在请求报文中该字段值全为1,表示任意地址,因为现在不知道这个MAC地址。
- 目的IP地址:占4字节,表示接受方的IP地址。
4.3 ARP的工作过程
在同一网段下的主机通信
假设主机A和B在同一个网段,主机A要向主机B发送信息,具体的地址解析过程如下:
- 主机A首先查看自己的ARP表,确定其中是否包含有主机B对应的ARP表项。
- 如果找到了对应的MAC地址,则主机A直接利用ARP表中的MAC地址,对IP数据包进行帧封装,并将数据包发送给主机B。
- 如果主机A在ARP表中找不到对应的MAC地址,则将缓存该数据报文,然后以广播方式发送一个ARP请求报文。
- ARP请求报文中的发送端IP地址和发送端MAC地址为主机A的IP地址和MAC地址,目标IP地址和目标MAC地址为主机B的IP地址和全1的MAC地址(广播地址)。
- 由于ARP请求报文以广播方式发送,该网段上的所有主机都可以接收到该请求,但只有被请求的主机(即主机B)会对该请求进行处理。
- 主机B比较自己IP地址和ARP请求报文中的 目标IP 地址,当两者相同时进行如下处理:将ARP请求报文中的发送端(即主机A)的IP地址和MAC地址存入自己的ARP表中。
- 之后以单播方式发送ARP响应报文给主机A,其中包含了自己的MAC地址。
- 主机A收到ARP响应报文后,将主机B的MAC地址加入到自己的ARP表中以用于后续报文的转发,同时将IP数据包进行封装后发送出去。
不同子网下的主机通信
当主机A和主机B不在同一个网段时,它们之间的通信需要通过一个或多个路由器进行转发。以下是这种情况下的地址解析和通信过程的详细步骤:
主机A检查ARP表:
主机A首先检查自己的ARP表,看是否含有直接到达主机B的MAC地址(主机B是不是在当前子网里面)。由于它们不在同一网段,主机A的ARP表中很可能不包含主机B的MAC地址。查找默认网关:
如果ARP表中没有主机B的MAC地址,主机A会查找其路由表以找到通往主机B所在网段的默认网关(通常是路由器)。主机A知道与默认网关(路由器)在同一网段,因此它接下来会尝试解析网关的MAC地址。ARP请求网关MAC地址:
如果主机A的ARP表中没有网关的MAC地址,它会发送一个ARP请求给本网段内的所有设备(通过广播),请求网关的MAC地址。这个ARP请求包含主机A的源IP地址和MAC地址,以及网关的IP地址(目标IP)和一个全1的MAC地址(目标MAC)。网关响应ARP请求:
网关(路由器)收到ARP请求后,比较自己的IP地址与ARP请求中的目标IP地址。如果匹配,网关将用自己的MAC地址作为响应发送给主机A。主机A封装数据包:
主机A收到网关的MAC地址后,将其加入到ARP表中,并将原始IP数据包(目标IP为主机B的IP)封装在以太网帧中,使用网关的MAC地址作为目的MAC地址。然后,主机A将封装好的帧发送给网关。网关转发数据包:
网关(路由器)收到数据包后,根据数据包中的目标IP地址(主机B的IP)查找其路由表,以确定如何转发该数据包。路由器将数据包转发到下一个网络段,该网络段更接近目标主机B。(同样的路由器可能也不知道别的路由器的mac地址,而路由器之间可以用类似的方式得到mac地址)跨多个网络段的转发:
如果主机A和主机B之间相隔多个网络段,数据包将在多个路由器之间被转发,直到它到达与主机B同一网段的路由器。目标网络段内的ARP请求:
当数据包到达与主机B同一网段的路由器时,该路由器会将数据包发送到网络上,并且如果它自己的ARP表中没有主机B的MAC地址,它可能还需要发送一个ARP请求来解析主机B的MAC地址。但通常情况下,如果这是路由器直接连接的网络段,它可能已经知道主机B的MAC地址。数据包最终到达主机B:
一旦数据包到达主机B所在的网络段,并且路由器或主机B的ARP表中有主机B的MAC地址,数据包就会被封装成带有主机B MAC地址的以太网帧,并发送给主机B。主机B接收数据包:
主机B接收到数据包后,会检查IP头部中的目标IP地址,确认是自己后,解封装数据包,并将数据传递给上层应用程序。
4.4 ARP缓存
每一次通信都需要mac地址,那么mac地址的获取是消耗资源的,所以我们需要将这些IP地址与MAC地址映射缓存起来。
无论是主机,还是交换机都会有一个用来缓存同一网段设备IP地址和MAC地址的ARP映射表,用于数据帧的转发。设备通过ARP解析到目的MAC之后,将会在自己的ARP映射表中增加IP地址到MAC地址的映射表,以用于后续到同一目的地数据帧的转发。
这个缓存维护着每个 IP 到 MAC 地址的映射关系。通过把第一次 ARP 获取到的 MAC 地址作为 IP 对 MAC 的映射关系到一个 ARP 缓存表中,下一次再向这个地址发送数据报时就不再需要重新发送 ARP 请求了,而是直接使用这个缓存表中的 MAC 地址进行数据报的发送。每发送一次 ARP 请求,缓存表中对应的映射关系都会被清除(因为IP地址是可变的)。
ARP的缓存一旦失效,就要重新设备就需要再次进行ARP请求以获取最新的MAC地址。
我们可以使用arp
命令查看arp缓存表。
由于ARP的机制存在,是存在ARP欺骗的。
ARP 欺骗(ARP spoofing)是一种网络攻击技术,通过发送伪造的 ARP 数据包,让目标设备误以为攻击者是其网关或其它设备,从而达到欺骗目标设备的目的。这样,攻击者就可以截获目标设备发出的数据包,甚至可以修改、篡改数据包中的内容。 ARP欺骗攻击能导致网络连通性问题,网络隐私泄露,中间人攻击,欺骗目标设备的目的。而且很难发现,所以网络安全问题需要时刻保持高度警惕。
类似如下图:
4.5 模拟ARP过程
同一个局域网内,主机A与主机B实现arp过程。
主机A不知道主机B的MAC地址,所以使用广播,广播的ARP请求,目的MAC地址为全F(FF:FF:FF:FF:FF:FF)
局域网内的所有主机都会收到这个ARP请求,网卡识别目的MAC地址为全F,广播数据,需要向上交付,再根据帧类型识别是ARP请求/响应。所以向上交付给ARP协议。
ARP协议先看op字段,为ARP请求,再看目的IP地址,除主机B外,其他主机发现不是给自己的,就在ARP层丢弃报文,只有主机B会返回ARP响应。
主机A收到ARP响应后,还会将主机B的IP地址和MAC地址的映射关系缓存在ARP缓存表中,下次访问主机B时会根据IP地址查表,有则使用,没有则先发送ARP请求获取MAC地址。
五、其他重要协议或技术
5.1 DNS
DNS(Domain Name System)是一整套从域名映射到IP的系统。
TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系. 如www.xxxx.com
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的.
- 如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统.
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系. 如果新计算机接入网络, 将这个信息注册到数据库中;
- 用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
至今, 我们的计算机上仍然保留了hosts文件. 在域名解析的过程中仍然会优先查找hosts文件的内容.
cat /etc/hosts
域名简介
主域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称。域名使用.
连接
如www.baidu.com
- com: 一级域名. 表示这是一个企业域名. 同级的还有 “net”(网络提供商), “org”(非盈利组织) 等.
- baidu: 二级域名, 公司名.
- www: 只是一种习惯用法. 之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式, 来表示主机支持的协议.
dig 工具分析 DNS 过程
安装 dig 工具
yum install bind-utils
之后就可以使用 dig 指令查看域名解析过程了.
dig www.baidu.com
5.2 ICMP协议
ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.
ICMP正是提供这种功能的协议; ICMP主要功能包括:
- 确认IP包是否成功到达目标地址.
- 通知在发送过程中IP包被丢弃的原因.
- ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
ICMP的报文格式
ICMP大概分为两类报文:
- 一类是通知出错原因
- 一类是用于诊断查询
5.2.1 ping命令
ping命令基于ICMP, 是在网络层.
- 注意, 此处 ping 的是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
- ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
- ping命令会先发送一个 ICMP Echo Request给对端;
- 对端接收到之后, 会返回一个ICMP Echo Reply;
ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息.
traceroute命令
也是基于ICMP协议实现, 能够打印出可执行程序主机, 一直到目标主机之前经历多少路由器.
5.3 NAT技术
之前我们讨论了, IPv4协议中, IP地址数量不充足的问题, NAT技术当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。
- NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法:
- 很多学校, 家庭, 公司内部采用每个终端设置私有IP, 而在路由器或必要的服务器上设置全局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 发送数据时就会生成表中的映射关系;
5.3.1 NAPT
那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项
NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
- 无法从NAT外部向内部服务器建立连接;
- 装换表的生成和销毁都需要额外开销;
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
5.4 NAT和代理服务器
关于代理服务器可以看看这里
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程.
代理服务器看起来和NAT设备有一点像. 客户端像代理服务器发送请求, 代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后, 代理服务器又把结果回传给客户端.
那么NAT和代理服务器的区别有哪些呢?
- 从应用上讲, NAT设备是网络基础设备之一, 解决的是IP不足的问题. 代理服务器则是更贴近具体应用, 比如通过代理服务器进行翻墙, 另外像迅游这样的加速器, 也是使用代理服务器.
- 从底层实现上讲, NAT是工作在网络层, 直接对IP地址进行替换. 代理服务器往往工作在应用层.
- 从使用范围上讲, NAT一般在局域网的出口部署, 代理服务器可以在局域网做, 也可以在广域网做, 也可以跨网.
- 从部署位置上看, NAT一般集成在防火墙, 路由器等硬件设备上, 代理服务器则是一个软件程序, 需要部署在服务器上.
代理服务器是一种应用比较广的技术.
- 翻墙: 广域网中的代理.
- 负载均衡: 局域网中的代理.