1.链路层所解决的问题
在上面一篇讲解ip的文章当中我们提过,ip搞定了寻找路线的机制,提供了一条"最短路径"。而我们的链路层协议的则为各个节点之间提供一个可靠的通信通道来帮助数据在各个节点中跳转。
tips:在数据链路层中 一般习惯性把数据叫做数据帧或mac帧
实质上我们的数据每一次交付都是在局域网站完成的,也就是说这每一跳的本质就是子网转发。
从宏观上来看,我们的网络本质实际上就是由这一个个子网构成的。
2.以太网协议
2.1认识以太网
不同局域网所采用的通信技术可能是不同的,常见的局域网技术有以下三种:
- 以太网:以太网是一种计算机局域网技术,一种应用最普遍的局域网技术
- 令牌环网:令牌环网常用于IBM系统中,在这种网络中有一种专门的帧称为“令牌”,在环路上持续地传输来确定一个节点何时可以发送包
- 无线LAN/WAN:无线局域网是有线网络的补充和扩展,现在已经是计算机网络的一个重要组织部分
2.2以太网帧格式
-
数据 : 实际上就是IP报文 大小为46~1500字节
-
目的地址和源地址: 网卡的硬件地址(mac地址),是由网卡出场时固化的
-
类型: 协议类型 ,决定了要交付给上层的什么协议
-
CRC: 校验码
以太网帧格式的报文中 :目的地址 ,源地址, 类型 ,CRC都是定长字段。 所以说我们直接按照设定的长度切分 ,就能轻易的得到报头和有效载荷。
2.3认识mac地址(也叫以太网地址)
- MAC地址用来识别数据链路层中相连的节点
- 长度为48位, 及6个字节。 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改。 mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
- ifconfig 命令可以用于显示或设置网络设备的状态
2.4ip与mac地址的对比
从根源角度来看:
ip描述的是整个路程的起点和终点
mac描述的是路途中每一次区间的起点和终点
从涉及者的角度来看:
ip地址是软件层面定义的概念,而我们的mac地址是硬件层面决定的概念如果我们的软件层面或者硬件层面一些机制改变了,在相互把这两概念的区分下,即使将来某些规则改变了也不会对双方造成巨大影响,用我们的专业术语讲就是降低了耦合度。
3.ARP协议
3.1ARP协议的作用
首先强调ARP协议并不是一个单纯的链路层的协议,而是介于数据链路层和网络层之间的协议
- 在网络通讯时,源主机的应用程序之知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址(mac)。
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。
- 因此在通讯前必须获得目的主机的硬件地址。
ARP协议就是来处理这个问题的------通过ip地址获取相对应的mac地址
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。
3.2ARP数据报格式
- 以太网首部和上面相同。但是ARP协议,类型设为0806
- 硬件类型:指链路层网络类型,1为以太网
- 协议类型:指要转换的地址类型,0800为IP地址,意思是通过IP地址找MAC地址
- 硬件地址长度:对于以太网地址为6字节
- 协议地址长度:对于IP地址为4字节
- op字段:为1表示ARP请求,为2表示ARP应答
3.3ARP协议工作流程
- ARP协议先广播数据到局域网中,目的MAC地址为全1
- 每台主机收到数据后,解开以太网报头和IP报头,拿到目的IP地址
- 拿目的IP地址和字节主机的IP地址向比较,匹配就返回ARP响应
- 发送端收到响应就获得了对方的MAC地址
如果局域网中的主机没有目标主机,怎么知道对方的IP地址呢?
首先我们知道接收方主机的ip地址,我们会先在ip层中查寻路由表,如果发现该ip不在当前局域网中,会发送给路由器中默认的网段(也就是路由器),让这个路由器向其上一级发送信息,来帮助我们寻找对应的mac地址。
(实际上在我们上篇文章当中,我们提到ip会提供一些算法(ip被进行划分了)来帮我们确定在哪片局域网当中)
3.4ARP缓存表
使用arp -a 查看arp缓存表:
如果每发送一个IP数据报都要进行一次ARP请求以此确定MAC地址,那将会造成不必要的网络流量,因此,通常的做法是把获取到的MAC地址缓存(是指预见到同样的信息可能会再次使用,从而在内存中开辟一块区域记忆这些信息) 一段时间与相对于的ip地址形成匹配机制。当然其存储的数据也是有老化时间的,一般为20分钟就会换一批数据。
4.MTU(最大传输单元)
4.1基本概念回顾
- MTU(Maximum Transmission Unit):中文意思是最大传输单位
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据报小于46字节时,要在后面补充位数
- 最大值1500字节称为以太网的最大传输单元(MTU),不同网络类型有不同的MTU
- 如果一个数据包的长度超过了MTU,则需要对数据进行分片,分片是网络层IP做的
- 不同的数据链路层标准的MTU是不同的,在数据传输过程中,数据可能会被路由器继续分片
4.2MTU对udp的影响
UDP协议的特点是:无连接,不可靠和面向数据报的
- 当一个UDP携带的数据超过1472(1500 - 8(UDP报头) - 20(IP报头))时,在IP层就一定会进行分片
- 分片之后,一个数据被分成了多份,说明,数据丢包的概率增加了
- 并且,UDP没有可靠性保证,数据不会重传
4.3MTU对tcp的影响
-
TCP协议的一个数据报也不能是无限大的,不仅受之于流量控制,拥塞控制的影响,还受MTU的影响。TCP的有效载荷的最大消息长度,称为MSS
-
TCP在建立连接,三次握手时,通信双方会进行MSS协商
-
双方SYN时会在TCP报头写入自己能支持的MSS值
-
双方知道知道对方的MSS后,选择最小值作为最终MSS
-
MSS值在TCP报头填入位置在选项
虽然TCP会协商MSS,但是,仍然可能会被分片。接收端就收在组装时,如果发现一个分片丢失,接收端TCP 收不到数据,就认为整个数据丢失,会让发送方,重发整个数据。
5.DNS协议
5.1基本介绍
DNS(Domain Name System,域名系统)协议,是一个用来将域名转化为IP地址的应用层协议
ip地址不方便人们的记忆,于是人们发明了一种叫做主机名的东西,并用hosts文件夹来描述主机名和IP地址之间的对应关系。
最初,这个hosts文件是由互联网信息中心(SRI-NIC)来管理的,但这样太麻烦了,于是产生了DNS系统:
-
由一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系
-
如果新计算机要接入网络,或者某个计算机IP变更,就需要将对应信息注册到数据库中
-
当用户通过域名访问互联网服务时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容。
通过cat /etc/hosts
可以查看hosts文件当中的内容
本质上DNS域名解析技术属于应用层技术,底层用的是UDP协议
域名(级别倒着数):
一级域名:.com、.cn、.gov、.us
二级域名:baidu.com、jd.com、taobao.com
三级域名:baike.baidu.com
域名服务器:
根域名服务器:给其他域名服务器做授权使用
一级域名服务器:管理一级域名
二级域名服务器:管理二级域名
三级域名服务器:管理三级域名
5.2域名解析过程
递归域名解析过程:
或者:
5.3dig工具分析DNS过程
例子:
-
开头位置是dig工具的版本号
-
第二部分是服务器返回的详情,其中status参数为NOERROR表示查询成功
-
QUESTION SECTION表示待查询的域名
-
ANSWER SECTION表示查询的结果,首先www.baidu.com被查询成了www.a.shifen.com,而最终www.a.shifen.com被查询成了两个具体的IP地址
-
最下面是一些结果统计,包含查询时间和DNS服务器的地址等
6.NAT协议
6.1基本介绍
在IPv4协议中,IP地址数量不足是一个大问题,而NAT技术就是当前解决IP地址不够用的主要手段,是路由器的一个重要功能,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- 在进行对外通信时,NAT能够将私有IP经过一系列替换操作最终转为全局IP,也就是说,NAT是一种将私有IP和全局IP相互转化的技术方法
- 装有NAT软件的路由器叫做NAT路由器,所有使用私有IP的主机在和外界通信时,都要在NAT路由器上将其私有IP转换成全局IP
- 很多学校、家庭、公司内部每个终端设置的IP都是私有IP,而只在路由器或必要的服务器上设置全局IP
- 全局IP要求唯一,但是私有IP不需要,在不同的局域网中出现相同的私有IP是完全不影响的
6.2具体转化过程
主机A向服务器发起数据请求的过程中,数据包中IP地址的转换过程如下:
- 刚开始,该数据包当中的源IP地址就是主机A的私有IP地址,目的IP地址就是服务器的公网IP地址
- 当数据包经过NAT路由器时,路由器会将该数据包的源IP地址替换成自己的WAN口IP地址,此时该数据包的源和目的IP地址就都是公网IP了
- 该数据包在互联网中经过各种路由转发,最终到达服务器主机
数据包从公网到局域网的过程:
-
刚开始,该数据包当中的源IP地址就是服务器的公网IP地址,目的IP地址就是路由器的WAN口IP地址
-
数据包在互联网中经过各种路由转发,到达主机A所在局域网的NAT路由器,此时路由器会将该数据包的目的IP地址替换成主机A的私有IP地址
-
最终路由器就会将该数据包转发给局域网中的主机A
当主机A向服务器发起数据请求时,该数据包当中的源IP地址被替换成了NAT路由器的WAN口IP地址,相当于是该路由器代替主机A向服务器发起了数据请求,因此服务器发出的响应数据包的目的IP地址应该是NAT路由器的WAN口IP地址
6.3小总结
-
静态NAT:NAT协议,将一个私网和一个公网唯一进行映射管理
-
动态NAT:NAT管理的不止是一个公网ip,当私网数据到来的时候,选择一个空闲的ip进行映射
不管是静态NAT还是动态NAT,都没有缓解ipv4枯竭的问题,本质上还是一个私网IP一定要对应一个公网ip,才能访问互联网,这也是后面出现ipv6的原因之一。
6.4NAPT协议(动态NAT重载)
在不同局域网中实际上可能存在相同的端口号,而我们的NAPT利用可以转换端口号这一机制,可以使一个公网ip映射多个不同的私网ip。
6.5NAT技术的缺陷
由于NAT依赖这个转换表, 所以有诸多限制:
无法从NAT外部向内部服务器建立连接;
装换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开;
6.6代理服务器
代理服务器(Proxy Server)的功能就是代理网络用户去取得网络信息,代理服务器又分为正向代理和反向代理
正向代理:
一个位于客户端和目标服务器之间的服务器,客户端并不直接访问目标服务器,而是先访问代理服务器,由代理服务器代替客户端去访问对应的目标服务器,并将目标服务器的响应结果返回给客户端
正向代理的好处:
- 正向代理最大的一个好处就是可以加速资源访问
- 比如公司中大量员工都要访问外网的同一个资源,那么正向代理服务器就可以将对应的资源缓存到本地,此时当其他人要访问该资源时,直接在正向代理服务器就可以获取,而不需要再次进行外网访问
反向代理:
一个位于客户端和目标服务器之间的服务器,对于客户端而言,反向代理服务器就相当于目标服务器,用户不需要知道目标服务器的地址,用户只需要访问反向代理服务器就可以获得目标服务器提供的服务。
反向代理的好处:
- 反向代理可以起到负载均衡的作用。比如不设置反向代理服务器,那么用户在访问百度时,就会随机访问到百度内部的某台服务器,此时就可能导致某些服务器压力太大,而某些服务器却处于闲置状态。而设置了反向代理服务器后,我们就能够通过某些方法让用户的数据请求较为平均的落到每台服务器上
- 反向代理还能起到安全防护的作用。有了方向代理服务器后,我们不需要直接将提供服务的服务器对应的信息暴露出去,此外,当由非法请求发送到反向代理服务器时,反向代理服务器就相当于一层软件屏障,可以在反向代理服务器当中部署一些防护措施,让这些非法请求在反向代理服务器这里就被过滤掉,而不会影响内部实际提供服务的服务器
这些概念很抽象,我们举个举例可以让大家理解的例子:
花王尿不湿是一个很经典的尿不湿品牌, 产自日本.
我自己去日本买尿不湿比较不方便, 但是可以让我在日本工作的表姐去超市买了快递给我. 此时超市看到的买家是我表姐, 我的表姐就是 “正向代理”;
后来找我表姐买尿不湿的人太多了, 我表姐觉得天天去超市太麻烦, 干脆去超市买了一大批尿不湿屯在家里, 如果有人来找她代购, 就直接把屯在家里的货发出去, 而不必再去超市. 此时我表姐就是 "反向代理’'。
7.ICMP协议
7.1具体功能
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包丢弃的原因
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6
当发送的数据包到达主机B所在局域网的入口路由器时,入口路由器为了获得主机B的MAC地址,于是会向主机B发送ARP请求包,但由于主机B已经离线了,因此路由器在多次发送ARP请求包而得不到响应后,就会返回一个ICMP Destination Unreachable的包给主机A,此时主机A就知道自己发送的数据无法到达主机B
7.2ICMP协议格式
ICMP大概分为两类报文:
-
一类是通知出错原因的
-
一类是用于诊断查询的
常见类型:
7.3ping命令与ICMP
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常
使用例子:
- 注意,此处ping的是百度的域名,该域名会由DNS解析成IP地址
- ping命令不仅能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存时间)
- ping命令会先发送一个ICMP Echo Request给对端
- 对端接收到之后,会返回一个ICMP Echo Reply
7.4traceroute命令与ICMP
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器
例子:
-
traceroute命令底层实际是通过增加存活时间(TTL)值来实现的
-
因为每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个ICMP TTL数据包给发送主机
-
因此traceroute命令底层可以发出多个数据包,并给这些数据包设置不同的TTL值,最后该主机就能够得到一连串的数据包路径
cho Reply
7.4traceroute命令与ICMP
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器
例子:
[外链图片转存中…(img-Bn07XyDz-1699191530026)]
-
traceroute命令底层实际是通过增加存活时间(TTL)值来实现的
-
因为每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个ICMP TTL数据包给发送主机
-
因此traceroute命令底层可以发出多个数据包,并给这些数据包设置不同的TTL值,最后该主机就能够得到一连串的数据包路径