当前位置: 首页 > news >正文

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


请添加图片描述


半桔:个人主页

 🔥 个人专栏: 《网络编程》《手撕面试算法》《C++从入门到入土》

🔖生活就像一盒巧克力,你永远不知道下一颗是什么味道 《阿甘正传》

文章目录

  • 前言
  • 一. 数据链路层的报头(帧头)
  • 二. 路由表
  • 三. MTU与MSS
  • 四. ARP协议
  • 五. NAT技术
  • 六. 代理服务器
    • 6.1 正向代理
    • 6.2 反向代理
    • 6.3 代理服务器与NAT的对比
  • 七. 补充
    • 7.1 DNS
    • 7.2 ICMP

前言

在数字化时代,计算机网络是信息交互的核心载体,小到个人设备通信,大到全球范围数据传输,都依赖各类网络技术的协同支撑。
本文围绕计算机网络核心技术展开:

  1. 解析数据链路层帧头的底层支撑;
  2. 路由表的选路指引;
  3. MTU与MSS对传输效率的控制;
  4. ARP协议的地址解析机制;
  5. 阐释NAT技术突破IPv4地址瓶颈的逻辑;
  6. 代理服务器(正向与反向代理)在访问优化和服务架构中的作用;
  7. 还会补充DNS的域名解析、ICMP的网络控制与故障诊断价值。

期望通过对这些技术的梳理,助力读者理解网络通信原理,以及各技术如何协同构建稳定高效的网络环境。

一. 数据链路层的报头(帧头)

数据链路层是用来解决:让直接相连的主机之间,进行数据交互。

如下是数据链路层的报文:请添加图片描述

关于数据链路层的报头结构比较简单:

  1. 在报头中有两个地址:源地址表示发送主机的Mac地址,目的地址表示目标主机的Mac地址;
  2. 通过顶层报头,可以直接将报文与报头进行分离。
  3. 4位类型,告诉接收方将报文的有效载荷交付给上层网络层的哪一个协议;

在数据进行跨网段传输的过程中,不能直接将数据交给对方,而需要先将数据交给路由器,有路由器向外进行交付,因此跨网段传输报文肯定需要多次跳转。

那么在跨网段传输中,如何知道将当前报文交付给局域网中的那一台主机,即如何知道下一跳的IP地址???

此时就需要使用路由表。

二. 路由表

在每一台主机中都有一个自己的路由表,路由表是用来指引报文下一跳的位置的。

在Linux中可以通过route来查看路由表的信息:
请添加图片描述

  1. Distination:表示网络路由的目标地址,可以是网络地址(如 10.1.24.0)、单主机地址(如 183.60.82.98),或默认路由default,匹配所有未明确指定的流量);
  2. Gatway:路由的下一跳网关的IP 地址。若为 0.0.0.0,表示目标是本地直连网络(无需网关,直接通过网卡可达);若为 _gateway,是系统的默认网关
  3. Genmask:路由的子网掩码(网络掩码)。用于区分 Destination 是 “网络” 还是 “单主机”: 。

主机获取下一跳的IP地址思路

  1. 拿着目标IP与路由表中每一行的Genmask进行按位与,看与Destinatoin是否一样;
  2. 如果一样下一跳的IP地址就是该行上的Gateway;
  3. 如果目标地址与路由表中其他行都不匹配是,就走上面的第一行的default对应的默认路由。

根据上面的路由表,我们可以大致总结出,主机A将数据跨网段传输给主机B要经历的主要步骤:

  1. 主机A将要发送的数据进行封装;
  2. 到网络层时,根据目标地址查路由表,找到下一跳的主机IP地址;
  3. 在数据链路层,根据下一跳的IP地址,封装Mac地址;
  4. 将封装好的报文发送给局域网中的所有主机;
  5. 接收到报文的主机,将报文与自己的Mac地址进行对比,不一样直接丢弃;
  6. 如果一样,就将报文解包,向上交付;如果时路由器拿到了报文,就向上进行交互,再根据IP地址封装出新的Mac地址,发送到下一个局域网中。

根据上面的6个步骤,我们可以看出:Mac地址只在局域网中有效,经过路由器会将报文的Mac地址进行重新封装。

三. MTU与MSS

  • 局域网中,主机越多,向网络中的发送的数据可能就越多,因此发生数据碰撞的概率就越大;
  • 同样,如果向网路中发送的数据越大,发送数据碰撞的概率也就越大。

为了减少数据碰撞的概率,数据链路层规定上层不能依次让我发送过大的数据。

MTU:数据链路层,一次能传输的最大数据帧中有效载荷的大小,即IP数据包的大小;

因此就要求上层要对发送的数据进行处理,如果数据少,可以直接交给数据链路层进行发送;如果数据过大,就需要进行切片再发送给下层。

此时再根据IP网络层我们也就能理解,为什么TCP在发送数据的时候要进行分段发送:

  1. 数据链路层要求:为了减少局域网中数据碰撞,不能不能一次性给我太大的报文;
  2. IP网络层:我可以对上层给我的数据进行分片交给数据链路层,来保证满足数据链路层的要求,但是对IP报文进行分片发送,如果一个分片丢失了,整个报文的所有分片都要重新发送
  3. 传输层:数据链路层有要求,IP网络层数据丢失后代价要全部进行补发,代价大。那就由我传输层来满足数据链路层的要求,我将要发送的数据进行分段交给网络层,保证网络层交给数据链路层的报文不需要进行分片

MSS:TCP协议层,一次能传输的最大有效载荷的大小。
在TCP的三次握手中,双方就会协商MSS的大小。

所谓的数据发送到网络中实际上就是:让数据在无数个局域网中进行传输。

在上面我们已经介绍了:如何获得下一跳的IP地址,以及跨网段传输的相关流程。但是还有一个问题没有说:局域网中进行传输用的是Mac地址,如何将下一跳的IP地址转化为Mac地址???

此时就需要ARP协议来完成。

四. ARP协议

ARP协议属于数据链路层协议,用于在局域网中,将目标主句的IP地址,转化为Mac地址。

ARP协议原理

  1. 主机A数据的下一跳是主机B,现在主机A知道主机B的IP地址,但是不知道其Mac地址;
  2. 主机A通过广播,向局域网中所有的主机发送一个请求,其中就包含其下一跳的主机IP;
  3. 所有接收到请求的主机,将下一跳IP地址与自己的进行对比,不一样就直接丢弃;
  4. 如果一样,就根据请求中的源IP,源Mac地址,发送一个应答,告诉对方自己的Mac地址。

以上的请求就是arp请求,对应的应答就是arp应答
下面介绍以下arp请求/应答的报文结构:

请添加图片描述

  1. 硬件类型:数据链路层网络类型,像以太网,令牌环网等;
  2. 协议类型:要进行转换的地址类型,可以将IP转Mac,也可以将Mac转IP;
  3. 硬件地址长度:硬件地址的长度,如果是以太网,就填写以太网的地址长度即可;
  4. 协议地址长度:上层协议的长度,如果是IP协议,就是4字节;
  5. OP:表示请求还是应答,1表ARP请求,2表示ARP应答;
  6. 后面的地址就不用说了,其中对于发送方的以太网地址是不知道的,一般直接填写全F。
  • 在数据链路层的报头中也不知道以太网目的地址,也填写全F,表示该报文是广播,所有主机都接收。
  • 帧类型,填写0806表示该报文是一个ARP请求或ARP应答。

根据上面的介绍,我们也可以总结以下主机如何根据IP地址获取Mac地址:

  1. 主机构建出ARP请求,将请求发送到局域网中;
  2. 局域网中所有主句收到请求,将报头与有效载荷进行分离,查看报头中以太网目的地址,发现是全F,并且帧类型是0806,将有效载荷向上受理,交给ARP软件层;
  3. 接收主机查看OP字段,看是ARP请求还是ARP应答;
  4. 如果是请求就将接收方IP与自己进行对比,不一样字节丢弃,一样就返回一个ARP响应;
  5. 如果是ARP响应,就将接收方IP地址和Mac地址与自己进行对比,不是自己就丢弃。

在ARP过程中,收到的任何ARP报文都需要先查看OP,来看是ARP请求还是应答。

如果每次在进行数据传输时,都进行ARP请求就会导致耗时耗力,因此一般主机内会将其他主机的IP地址与对应的Mac地址存储起来,属于临时存储,可能会过期;
通过arp -a可以查看当前主机从缓存的其他主机的IP和Mac地址:请添加图片描述

对原来步骤的补充:

  1. arp只有在缓存失效的情况下,才会进行;
  2. 如果我们主机收到了多个ARP应答,会以最新的为准。

根据第二条性质,这就可能会导致ARP中间人攻击,以及ARP欺骗:

ARP欺骗
请添加图片描述

  1. PC1中已经缓存着网关的IP与Mac地址(没缓存也行)后,欺骗者向PC1发送一个ARP应答,内部填写填写网关IP:欺骗者主机的Mac地址;
  2. 此时PC1会修改缓存中的映射关系,将网关的IP对应的Mac地址修改为欺骗者主机的Mac地址;
  3. 此时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

具体步骤如下:

  1. 主机A的IP是192.168.1.201,现在要进行跨网段通信,访问服务器;将数据向下进行封装,形成报文,发送出去;
  2. 此时路由器接收到报文,对报文向上交互,发现报文要访问的目标IP地址并不在当前子网,要进行跨网段传输,此时路由器将报文中源IP地址进行更改,更改为路由器的WAN口IP
  3. 路由器将报文发送出去,此时运营商的路由器接收到报文后,进行同样的操作,将源IP替换成路由器的WAN口IP。

通过上述对源IP进行替换的操作,使得我们的私有IP只会在家用路由器所构建的子网中进行使用,这就允许了不同的子网中主机可以使用相同的IP地址进行标识,使得IP地址可以重复使用,进而减缓了IP地址不足的问题。

以上这种将私有IP不断进行替换的技术,被称为NAT技术。

根据上面的描述,又出现了另一个问题,就是路由器将源IP进行替换了,那如果服务器要发送应答的时候,它只能找到最外侧的路由器,那这个路由器又是如何定位我的位置的呢???

请添加图片描述

在NAT路由器内部有一张转发表,记录了子网发送数据的源IP,源端口号,以及更改后的IP,端口号的映射关系,这张表被称为NAPT。

通过这张表,当服务器发送回响应的时候,路由器进行查表来看发送到子网中的哪一个IP地址,以及端口号。

我们能否直接区访问另一个子网中的其他主机???

  1. 不能,我们两台主机都在子网中,两台路由器的子网IP是没有意义的;
  2. 并且因为我们的目标主机在子网中,是接收方,路由器并没有在NAT转发表中记录IP地址以及端口号的映射关系,因此路由器在不到目标地址。

像我们在微信,QQ上进行聊天的时候,数据要先发送给腾讯的服务器,再由服务器发送给接收方。

如果我们像然内网中的两台主机进行通信,理论上也可以采用这种方式,通过一台具有公网IP的“中间服务器”,在两个设备之间建立一条通信的通道,这种方式被称为内网穿透

六. 代理服务器

“代理” 的本质是 “中间人” —— “代理服务器” ,介于 “发起请求的客户端” 和 “提供服务的目标服务器” 之间,负责转发两者的请求与响应,所有数据都必须经过代理服务器中转

6.1 正向代理

正向代理的核心是 “代理客户端” —— 它为客户端服务,帮助客户端访问 “客户端自己无法直接访问的目标服务器”,且只有客户端知道代理的存在,目标服务器不知道真实客户端是谁。

正向代理的典型流程:

  • 客户端(知道代理) → 正向代理服务器 → 目标服务器(只知道代理,不知道客户端)。

最常见的就是

  • VPN:突破网络限制,访问境外网站,客户端通过正向代理绕过地域封锁;
  • 校园内网:要求所有请求先经过正向代理(便于过滤不良网站、记录访问日志);

6.2 反向代理

反向代理的核心是 “代理目标服务器” —— 它为后端的目标服务器服务,客户端不知道代理的存在,以为自己直接访问的是 “目标服务器”,但实际上所有请求都先到反向代理,再由代理转发给后端真实服务器。

反向代理的典型流程:

  • 客户端(不知道代理,以为访问的是目标服务器) → 反向代理服务器 → 后端真实服务器(隐藏在代理后)。

常见应用场景

  • 负载均衡:比如大型网站(如淘宝、京东)背后有几百台后端服务器,反向代理将客户端请求均匀分配到不同服务器,避免单台服务器过载(比如 1000 个请求分给 10 台服务器,每台处理 100 个);

6.3 代理服务器与NAT的对比

代理服务器在行为上好像和NAT是一样的,都是将报文进行转发,往外进行发送。

  1. 目的不一样,NAT技术是网络构建中的基础设备之一,是为了解决IP地址不足;而代理服务器是一种更贴近需求的应用;
  2. 工作的位置不一样,NAT技术工作在网络层,而代理服务器工作在应用层;
  3. 部署的位置不一样,NAT技术是在子网的入口/出口出进行部署的,而代理服务器就没有这一限制;
  4. 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实现的,是一款核心的网络诊断工具,主要用于追踪数据包从本地设备目标主机(如某个网站、服务器)的完整传输路径,并记录路径中每一个 “中间节点”(通常是路由器)的信息:!请添加图片描述

http://www.dtcms.com/a/481657.html

相关文章:

  • 北京网站seowyhseo网站模板但没有后台如何做网站
  • 对接世界职业院校技能大赛标准,唯众打造高质量云计算实训室
  • 利用人工智能、数字孪生、AR/VR 进行军用飞机维护
  • [特殊字符] Maven 编译报错「未与 -source 8 一起设置引导类路径」完美解决方案(以芋道项目为例)
  • 【CV】泊松图像融合
  • 云智融合:人工智能与云计算融合实践指南
  • Maven创建Java项目实战全流程
  • 泉州市住房与城乡建设网站wordpress弹出搜索
  • [创业之路-691]:历史与现实的镜鉴:从三国纷争到华为铁三角的系统性启示
  • 时序数据库选型革命:深入解析Apache IoTDB的架构智慧与实战指南
  • 南通网站制作建设手机网页设计软件下载
  • OpenAI推出即时支付功能,ChatGPT将整合电商能力|技术解析与行业影响
  • 小杰深度学习(seventeen)——视觉-经典神经网络——MObileNetV3
  • 线性代数 | 要义 / 本质 (下篇)
  • C# 预处理指令 (# 指令) 详解
  • 有趣的机器学习-利用神经网络来模拟“古龙”写作风格的输出器
  • AI破解数学界遗忘谜题:GPT-5重新发现尘封二十年的埃尔德什问题解法
  • ui网站推荐如何建网站不花钱
  • Java版自助共享空间系统,打造高效无人值守智慧实体门店
  • 《超越单链表的局限:双链表“哨兵位”设计模式,如何让边界处理代码既优雅又健壮?》
  • HENGSHI SENSE 6.0技术白皮书:基于HQL语义层的Agentic BI动态计算引擎架构解析
  • C#实现MySQL→Clickhouse建表语句转换工具
  • 禁止下载app网站东莞网
  • MySQL数据库精研之旅第十九期:存储过程,数据处理的全能工具箱(二)
  • Ubuntu Linux 服务器快速安装 Docker 指南
  • Linux 信号捕捉与软硬中断
  • Linux NTP配置全攻略:从客户端到服务端
  • 二分查找专题总结:从数组越界到掌握“两段性“
  • aws ec2防ssh爆破, aws服务器加固, 亚马逊服务器ssh安全,防止ip扫描ssh。 aws安装fail2ban, ec2配置fail2ban
  • F024 CNN+vue+flask电影推荐系统vue+python+mysql+CNN实现