半桔:个人主页
🔥 个人专栏: 《网络编程》《手撕面试算法》《C++从入门到入土》
🔖生活就像一盒巧克力,你永远不知道下一颗是什么味道 《阿甘正传》
文章目录
- 前言
- 一. 数据链路层的报头(帧头)
- 二. 路由表
- 三. MTU与MSS
- 四. ARP协议
- 五. NAT技术
- 六. 代理服务器
-
- 6.1 正向代理
- 6.2 反向代理
- 6.3 代理服务器与NAT的对比
- 七. 补充
-
- 7.1 DNS
- 7.2 ICMP
前言
在数字化时代,计算机网络是信息交互的核心载体,小到个人设备通信,大到全球范围数据传输,都依赖各类网络技术的协同支撑。 本文围绕计算机网络核心技术展开:
期望通过对这些技术的梳理,助力读者理解网络通信原理,以及各技术如何协同构建稳定高效的网络环境。
一. 数据链路层的报头(帧头)
数据链路层是用来解决:让直接相连的主机之间,进行数据交互。
如下是数据链路层的报文:
关于数据链路层的报头结构比较简单:
在数据进行跨网段传输的过程中,不能直接将数据交给对方,而需要先将数据交给路由器,有路由器向外进行交付,因此跨网段传输报文肯定需要多次跳转。
那么在跨网段传输中,如何知道将当前报文交付给局域网中的那一台主机,即如何知道下一跳的IP地址???
此时就需要使用路由表。
二. 路由表
在每一台主机中都有一个自己的路由表,路由表是用来指引报文下一跳的位置的。
在Linux中可以通过route来查看路由表的信息: 
主机获取下一跳的IP地址思路:
根据上面的路由表,我们可以大致总结出,主机A将数据跨网段传输给主机B要经历的主要步骤:
根据上面的6个步骤,我们可以看出:Mac地址只在局域网中有效,经过路由器会将报文的Mac地址进行重新封装。
三. MTU与MSS
- 局域网中,主机越多,向网络中的发送的数据可能就越多,因此发生数据碰撞的概率就越大;
- 同样,如果向网路中发送的数据越大,发送数据碰撞的概率也就越大。
为了减少数据碰撞的概率,数据链路层规定上层不能依次让我发送过大的数据。
MTU:数据链路层,一次能传输的最大数据帧中有效载荷的大小,即IP数据包的大小;
因此就要求上层要对发送的数据进行处理,如果数据少,可以直接交给数据链路层进行发送;如果数据过大,就需要进行切片再发送给下层。
此时再根据IP网络层我们也就能理解,为什么TCP在发送数据的时候要进行分段发送:
MSS:TCP协议层,一次能传输的最大有效载荷的大小。 在TCP的三次握手中,双方就会协商MSS的大小。
所谓的数据发送到网络中实际上就是:让数据在无数个局域网中进行传输。
在上面我们已经介绍了:如何获得下一跳的IP地址,以及跨网段传输的相关流程。但是还有一个问题没有说:局域网中进行传输用的是Mac地址,如何将下一跳的IP地址转化为Mac地址???
此时就需要ARP协议来完成。
四. ARP协议
ARP协议属于数据链路层协议,用于在局域网中,将目标主句的IP地址,转化为Mac地址。
ARP协议原理:
以上的请求就是arp请求,对应的应答就是arp应答。 下面介绍以下arp请求/应答的报文结构:

- 在数据链路层的报头中也不知道以太网目的地址,也填写全F,表示该报文是广播,所有主机都接收。
- 帧类型,填写0806表示该报文是一个ARP请求或ARP应答。
根据上面的介绍,我们也可以总结以下主机如何根据IP地址获取Mac地址:
在ARP过程中,收到的任何ARP报文都需要先查看OP,来看是ARP请求还是应答。
如果每次在进行数据传输时,都进行ARP请求就会导致耗时耗力,因此一般主机内会将其他主机的IP地址与对应的Mac地址存储起来,属于临时存储,可能会过期; 通过arp -a可以查看当前主机从缓存的其他主机的IP和Mac地址:
对原来步骤的补充:
根据第二条性质,这就可能会导致ARP中间人攻击,以及ARP欺骗:
ARP欺骗: 
- 此时欺骗者拿到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。
具体步骤如下:
通过上述对源IP进行替换的操作,使得我们的私有IP只会在家用路由器所构建的子网中进行使用,这就允许了不同的子网中主机可以使用相同的IP地址进行标识,使得IP地址可以重复使用,进而减缓了IP地址不足的问题。
以上这种将私有IP不断进行替换的技术,被称为NAT技术。
根据上面的描述,又出现了另一个问题,就是路由器将源IP进行替换了,那如果服务器要发送应答的时候,它只能找到最外侧的路由器,那这个路由器又是如何定位我的位置的呢???

在NAT路由器内部有一张转发表,记录了子网发送数据的源IP,源端口号,以及更改后的IP,端口号的映射关系,这张表被称为NAPT。
通过这张表,当服务器发送回响应的时候,路由器进行查表来看发送到子网中的哪一个IP地址,以及端口号。
我们能否直接区访问另一个子网中的其他主机???
像我们在微信,QQ上进行聊天的时候,数据要先发送给腾讯的服务器,再由服务器发送给接收方。
如果我们像然内网中的两台主机进行通信,理论上也可以采用这种方式,通过一台具有公网IP的“中间服务器”,在两个设备之间建立一条通信的通道,这种方式被称为内网穿透。
六. 代理服务器
“代理” 的本质是 “中间人” —— “代理服务器” ,介于 “发起请求的客户端” 和 “提供服务的目标服务器” 之间,负责转发两者的请求与响应,所有数据都必须经过代理服务器中转。
6.1 正向代理
正向代理的核心是 “代理客户端” —— 它为客户端服务,帮助客户端访问 “客户端自己无法直接访问的目标服务器”,且只有客户端知道代理的存在,目标服务器不知道真实客户端是谁。
正向代理的典型流程:
- 客户端(知道代理) → 正向代理服务器 → 目标服务器(只知道代理,不知道客户端)。
最常见的就是
- VPN:突破网络限制,访问境外网站,客户端通过正向代理绕过地域封锁;
- 校园内网:要求所有请求先经过正向代理(便于过滤不良网站、记录访问日志);
6.2 反向代理
反向代理的核心是 “代理目标服务器” —— 它为后端的目标服务器服务,客户端不知道代理的存在,以为自己直接访问的是 “目标服务器”,但实际上所有请求都先到反向代理,再由代理转发给后端真实服务器。
反向代理的典型流程:
- 客户端(不知道代理,以为访问的是目标服务器) → 反向代理服务器 → 后端真实服务器(隐藏在代理后)。
常见应用场景
- 负载均衡:比如大型网站(如淘宝、京东)背后有几百台后端服务器,反向代理将客户端请求均匀分配到不同服务器,避免单台服务器过载(比如 1000 个请求分给 10 台服务器,每台处理 100 个);
6.3 代理服务器与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实现的,是一款核心的网络诊断工具,主要用于追踪数据包从本地设备到目标主机(如某个网站、服务器)的完整传输路径,并记录路径中每一个 “中间节点”(通常是路由器)的信息:!




