【网络编程】从数据链路层帧头到代理服务器:解析路由表、MTU/MSS、ARP、NAT 等网络核心技术

文章目录
- 前言
- 一. 数据链路层的报头(帧头)
- 二. 路由表
- 三. MTU与MSS
- 四. ARP协议
- 五. NAT技术
- 六. 代理服务器
- 6.1 正向代理
- 6.2 反向代理
- 6.3 代理服务器与NAT的对比
- 七. 补充
- 7.1 DNS
- 7.2 ICMP
前言
在数字化时代,计算机网络是信息交互的核心载体,小到个人设备通信,大到全球范围数据传输,都依赖各类网络技术的协同支撑。
本文围绕计算机网络核心技术展开:
- 解析数据链路层帧头的底层支撑;
- 路由表的选路指引;
- MTU与MSS对传输效率的控制;
- ARP协议的地址解析机制;
- 阐释NAT技术突破IPv4地址瓶颈的逻辑;
- 代理服务器(正向与反向代理)在访问优化和服务架构中的作用;
- 还会补充DNS的域名解析、ICMP的网络控制与故障诊断价值。
期望通过对这些技术的梳理,助力读者理解网络通信原理,以及各技术如何协同构建稳定高效的网络环境。
一. 数据链路层的报头(帧头)
数据链路层是用来解决:让直接相连的主机之间,进行数据交互。
如下是数据链路层的报文:
关于数据链路层的报头结构比较简单:
- 在报头中有两个地址:源地址表示发送主机的Mac地址,目的地址表示目标主机的Mac地址;
- 通过顶层报头,可以直接将报文与报头进行分离。
- 4位类型,告诉接收方将报文的有效载荷交付给上层网络层的哪一个协议;
在数据进行跨网段传输的过程中,不能直接将数据交给对方,而需要先将数据交给路由器,有路由器向外进行交付,因此跨网段传输报文肯定需要多次跳转。
那么在跨网段传输中,如何知道将当前报文交付给局域网中的那一台主机,即如何知道下一跳的IP地址???
此时就需要使用路由表。
二. 路由表
在每一台主机中都有一个自己的路由表,路由表是用来指引报文下一跳的位置的。
在Linux中可以通过route
来查看路由表的信息:
- Distination:表示网络路由的目标地址,可以是网络地址(如
10.1.24.0
)、单主机地址(如183.60.82.98
),或默认路由(default
,匹配所有未明确指定的流量); - Gatway:路由的下一跳网关的IP 地址。若为
0.0.0.0
,表示目标是本地直连网络(无需网关,直接通过网卡可达);若为_gateway
,是系统的默认网关; - Genmask:路由的子网掩码(网络掩码)。用于区分
Destination
是 “网络” 还是 “单主机”: 。
主机获取下一跳的IP地址思路:
- 拿着目标IP与路由表中每一行的Genmask进行按位与,看与Destinatoin是否一样;
- 如果一样下一跳的IP地址就是该行上的Gateway;
- 如果目标地址与路由表中其他行都不匹配是,就走上面的第一行的default对应的默认路由。
根据上面的路由表,我们可以大致总结出,主机A将数据跨网段传输给主机B要经历的主要步骤:
- 主机A将要发送的数据进行封装;
- 到网络层时,根据目标地址查路由表,找到下一跳的主机IP地址;
- 在数据链路层,根据下一跳的IP地址,封装Mac地址;
- 将封装好的报文发送给局域网中的所有主机;
- 接收到报文的主机,将报文与自己的Mac地址进行对比,不一样直接丢弃;
- 如果一样,就将报文解包,向上交付;如果时路由器拿到了报文,就向上进行交互,再根据IP地址封装出新的Mac地址,发送到下一个局域网中。
根据上面的6个步骤,我们可以看出:Mac地址只在局域网中有效,经过路由器会将报文的Mac地址进行重新封装。
三. MTU与MSS
- 局域网中,主机越多,向网络中的发送的数据可能就越多,因此发生数据碰撞的概率就越大;
- 同样,如果向网路中发送的数据越大,发送数据碰撞的概率也就越大。
为了减少数据碰撞的概率,数据链路层规定上层不能依次让我发送过大的数据。
MTU:数据链路层,一次能传输的最大数据帧中有效载荷的大小,即IP数据包的大小;
因此就要求上层要对发送的数据进行处理,如果数据少,可以直接交给数据链路层进行发送;如果数据过大,就需要进行切片再发送给下层。
此时再根据IP网络层我们也就能理解,为什么TCP在发送数据的时候要进行分段发送:
- 数据链路层要求:为了减少局域网中数据碰撞,不能不能一次性给我太大的报文;
- IP网络层:我可以对上层给我的数据进行分片交给数据链路层,来保证满足数据链路层的要求,但是对IP报文进行分片发送,如果一个分片丢失了,整个报文的所有分片都要重新发送;
- 传输层:数据链路层有要求,IP网络层数据丢失后代价要全部进行补发,代价大。那就由我传输层来满足数据链路层的要求,我将要发送的数据进行分段交给网络层,保证网络层交给数据链路层的报文不需要进行分片。
MSS:TCP协议层,一次能传输的最大有效载荷的大小。
在TCP的三次握手中,双方就会协商MSS的大小。
所谓的数据发送到网络中实际上就是:让数据在无数个局域网中进行传输。
在上面我们已经介绍了:如何获得下一跳的IP地址,以及跨网段传输的相关流程。但是还有一个问题没有说:局域网中进行传输用的是Mac地址,如何将下一跳的IP地址转化为Mac地址???
此时就需要ARP协议来完成。
四. ARP协议
ARP协议属于数据链路层协议,用于在局域网中,将目标主句的IP地址,转化为Mac地址。
ARP协议原理:
- 主机A数据的下一跳是主机B,现在主机A知道主机B的IP地址,但是不知道其Mac地址;
- 主机A通过广播,向局域网中所有的主机发送一个请求,其中就包含其下一跳的主机IP;
- 所有接收到请求的主机,将下一跳IP地址与自己的进行对比,不一样就直接丢弃;
- 如果一样,就根据请求中的源IP,源Mac地址,发送一个应答,告诉对方自己的Mac地址。
以上的请求就是arp请求,对应的应答就是arp应答。
下面介绍以下arp请求/应答的报文结构:
- 硬件类型:数据链路层网络类型,像以太网,令牌环网等;
- 协议类型:要进行转换的地址类型,可以将IP转Mac,也可以将Mac转IP;
- 硬件地址长度:硬件地址的长度,如果是以太网,就填写以太网的地址长度即可;
- 协议地址长度:上层协议的长度,如果是IP协议,就是4字节;
- OP:表示请求还是应答,1表ARP请求,2表示ARP应答;
- 后面的地址就不用说了,其中对于发送方的以太网地址是不知道的,一般直接填写全F。
- 在数据链路层的报头中也不知道以太网目的地址,也填写全F,表示该报文是广播,所有主机都接收。
- 帧类型,填写0806表示该报文是一个ARP请求或ARP应答。
根据上面的介绍,我们也可以总结以下主机如何根据IP地址获取Mac地址:
- 主机构建出ARP请求,将请求发送到局域网中;
- 局域网中所有主句收到请求,将报头与有效载荷进行分离,查看报头中以太网目的地址,发现是全F,并且帧类型是0806,将有效载荷向上受理,交给ARP软件层;
- 接收主机查看OP字段,看是ARP请求还是ARP应答;
- 如果是请求就将接收方IP与自己进行对比,不一样字节丢弃,一样就返回一个ARP响应;
- 如果是ARP响应,就将接收方IP地址和Mac地址与自己进行对比,不是自己就丢弃。
在ARP过程中,收到的任何ARP报文都需要先查看OP,来看是ARP请求还是应答。
如果每次在进行数据传输时,都进行ARP请求就会导致耗时耗力,因此一般主机内会将其他主机的IP地址与对应的Mac地址存储起来,属于临时存储,可能会过期;
通过arp -a
可以查看当前主机从缓存的其他主机的IP和Mac地址:
对原来步骤的补充:
- arp只有在缓存失效的情况下,才会进行;
- 如果我们主机收到了多个ARP应答,会以最新的为准。
根据第二条性质,这就可能会导致ARP中间人攻击,以及ARP欺骗:
ARP欺骗:
- PC1中已经缓存着网关的IP与Mac地址(没缓存也行)后,欺骗者向PC1发送一个ARP应答,内部填写填写网关IP:欺骗者主机的Mac地址;
- 此时PC1会修改缓存中的映射关系,将网关的IP对应的Mac地址修改为欺骗者主机的Mac地址;
- 此时PC1原来要发送给网关的数据,全部发送给了欺骗者(数据一般加密了,欺骗者看不到)。
- 此时欺骗者拿到PC1的数据之后,可以直接将其丢弃,此时PC1就断网了,不能再将数据发送到外网中了;
- 欺骗者也可以修改网关中PC1的IP与Mac地址的映射,此时PC1发送给网关的数据发送到了欺骗者这里,同样网关给PC1的数据也到欺骗者这里了;此时欺骗者可以将数据发送给双方,但是双方并不知道用改中间人的存在。
五. NAT技术
在前一篇博客中,我们聊到当今IPv4的地址已经不够用了,所以退出了种种方案来解决,其中NAT技术就是其中之一,此处将会详细解释NAT技术的原理和实现。
- 首先我们要知道IP地址根据类型可以分为两种:共有IP和私有IP;
- 家用路由器可以进行子网的构建,那么全国中一定有多个家用路由器,这些路由器也要构建一个子网才能进行通信,由运营商的路由器进行构建,也就是说家用路由器的另一侧也并不是广域网,而是运营商路由器构建的子网;
- 路由器有两个IP地址,一个是LAN口IP是在路由器所构建的子网中进行使用的,另一个就是WAN口IP,是在运营商所构建的路由器的子网中进行使用的。
我们在进行IP地址查看的时候,看到的都是私有IP,可以通过ifconfig
进行查看。
下面举个例子NAT技术是如何解决IP地址不足的问题的:
如上图所示,现在我们是主机192.168.201/24
,现在要访问服务器资源,要进行跨网段传输,因此要经过路由器,在经过路由器的时候,路由器会将源IP进行替换,替换成路由器的WAN口IP。
具体步骤如下:
- 主机A的IP是
192.168.1.201
,现在要进行跨网段通信,访问服务器;将数据向下进行封装,形成报文,发送出去; - 此时路由器接收到报文,对报文向上交互,发现报文要访问的目标IP地址并不在当前子网,要进行跨网段传输,此时路由器将报文中源IP地址进行更改,更改为路由器的WAN口IP。
- 路由器将报文发送出去,此时运营商的路由器接收到报文后,进行同样的操作,将源IP替换成路由器的WAN口IP。
通过上述对源IP进行替换的操作,使得我们的私有IP只会在家用路由器所构建的子网中进行使用,这就允许了不同的子网中主机可以使用相同的IP地址进行标识,使得IP地址可以重复使用,进而减缓了IP地址不足的问题。
以上这种将私有IP不断进行替换的技术,被称为NAT技术。
根据上面的描述,又出现了另一个问题,就是路由器将源IP进行替换了,那如果服务器要发送应答的时候,它只能找到最外侧的路由器,那这个路由器又是如何定位我的位置的呢???
在NAT路由器内部有一张转发表,记录了子网发送数据的源IP,源端口号,以及更改后的IP,端口号的映射关系,这张表被称为NAPT。
通过这张表,当服务器发送回响应的时候,路由器进行查表来看发送到子网中的哪一个IP地址,以及端口号。
我们能否直接区访问另一个子网中的其他主机???
- 不能,我们两台主机都在子网中,两台路由器的子网IP是没有意义的;
- 并且因为我们的目标主机在子网中,是接收方,路由器并没有在NAT转发表中记录IP地址以及端口号的映射关系,因此路由器在不到目标地址。
像我们在微信,QQ上进行聊天的时候,数据要先发送给腾讯的服务器,再由服务器发送给接收方。
如果我们像然内网中的两台主机进行通信,理论上也可以采用这种方式,通过一台具有公网IP的“中间服务器”,在两个设备之间建立一条通信的通道,这种方式被称为内网穿透。
六. 代理服务器
“代理” 的本质是 “中间人” —— “代理服务器” ,介于 “发起请求的客户端” 和 “提供服务的目标服务器” 之间,负责转发两者的请求与响应,所有数据都必须经过代理服务器中转。
6.1 正向代理
正向代理的核心是 “代理客户端” —— 它为客户端服务,帮助客户端访问 “客户端自己无法直接访问的目标服务器”,且只有客户端知道代理的存在,目标服务器不知道真实客户端是谁。
正向代理的典型流程:
- 客户端(知道代理) → 正向代理服务器 → 目标服务器(只知道代理,不知道客户端)。
最常见的就是
- VPN:突破网络限制,访问境外网站,客户端通过正向代理绕过地域封锁;
- 校园内网:要求所有请求先经过正向代理(便于过滤不良网站、记录访问日志);
6.2 反向代理
反向代理的核心是 “代理目标服务器” —— 它为后端的目标服务器服务,客户端不知道代理的存在,以为自己直接访问的是 “目标服务器”,但实际上所有请求都先到反向代理,再由代理转发给后端真实服务器。
反向代理的典型流程:
- 客户端(不知道代理,以为访问的是目标服务器) → 反向代理服务器 → 后端真实服务器(隐藏在代理后)。
常见应用场景
- 负载均衡:比如大型网站(如淘宝、京东)背后有几百台后端服务器,反向代理将客户端请求均匀分配到不同服务器,避免单台服务器过载(比如 1000 个请求分给 10 台服务器,每台处理 100 个);
6.3 代理服务器与NAT的对比
代理服务器在行为上好像和NAT是一样的,都是将报文进行转发,往外进行发送。
- 目的不一样,NAT技术是网络构建中的基础设备之一,是为了解决IP地址不足;而代理服务器是一种更贴近需求的应用;
- 工作的位置不一样,NAT技术工作在网络层,而代理服务器工作在应用层;
- 部署的位置不一样,NAT技术是在子网的入口/出口出进行部署的,而代理服务器就没有这一限制;
- NAT一般直接集成在路由器硬件上的,而代理服务器是软件,部署在服务器上面。
七. 补充
7.1 DNS
我们所使用的IP地址都是4字节的整数,不好进行记忆,一次引入了域名来替代IP地址。
当我们适用于域名来进行网站的访问的死活,要先将域名转化为IP地址以及端口号才行。
在浏览器中都内置了DNS服务区的ip地址,因此要进行url地址访问之前,要向访问DNS服务器将域名转化为IP地址和端口号才行。
7.2 ICMP
ICMP是工作在网络层上的一种协议:它并不是用于 “传输用户数据” 的协议,而是 TCP/IP 协议族中负责网络控制、错误报告、故障诊断的 “辅助协议”,是用来验证网络的连通性的。
ICMP协议向对方主机发送一个报文,如果出现问题,也会进行应答,会返回一个报文告诉源主机传输错误的原因。
我们常用的ping
命令就是基于ICMP实现的,用来检测主机连通性。
在进行面试的时候,经常会有这样的一道题:telnet用23端口,ssh用22端口,那么ping用几号端口???
ping
是基于ICMP协议的,属于网络层,而端口号是传输层的概念,因此ping
根本就不关心端口号这样的信息。
traceroute
命令,也是基于ICMP实现的,是一款核心的网络诊断工具,主要用于追踪数据包从本地设备到目标主机(如某个网站、服务器)的完整传输路径,并记录路径中每一个 “中间节点”(通常是路由器)的信息:!