【网络】DNS | ICMP | NAT | 代理服务器
🐱作者:一只大喵咪1201
🐱专栏:《网络》
🔥格言:你只管努力,剩下的交给时间!
前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程,但是还有几个坑没填,以及一些重要的协议和技术没有讲解。
DNS | ICMP | NAT | 代理服务器
- 😽DNS
- 😽ICMP协议
- 😽NAT技术
- 😽代理服务器
- 😽总结
😽DNS
- DNS是一整套从域名映射到IP地址的系统,也就是域名解析服务。
- DNS服务的默认端口号是53。
本喵在讲解网络通信的时候,都是说的IP地址,但是我们生活中访问一些网站时都用的域名,如www.baidu.com访问的就是百度的服务器。
在整个网络通信的协议栈中我们也并没有看到和域名有关的任何东西,因为网络通信的实现就是通过IP地址,并不是域名,域名也需要转换成IP地址,然后再进行通信。
对于使用网络的人来说,IP地址并不方便记忆,因为它是数字性的东西,所以将域名和IP地址映射起来,形成一一对应的关系,在是使用的时候直接使用域名字符串就行。

最初,在每个人的主机上都存在一个hosts文件文件,该文件中存放的就是域名和IP地址的映射关系,如上图所示,主机名host-a对应着IP地址172.20.2.1。
这个hosts文件是由互联网中心(SRI-NIC)来管理的:
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更
hosts文件。 - 其他计算机也需要定期下载更新新版本的
hosts文件才能正确上网。
每当我们访问一个服务器输入域名的时候,浏览器都会自动去本地的hosts文件中查找对应的IP地址,然后再进行绑定创建套接字等发起网络请求。

如上图所示,查看/etc/hosts路径的文件,可以看到hosts文件中的内容,红色框中的是IP地址,绿色框中是与之映射的域名,也就是字符串。
但是这样的方式太麻烦了,需要定期去更新hosts文件,增加时还要修改再提交申请等等,所以就产生了DNS系统。
- DNS:一个组织的系统管理机构,维护系统内的每个主机的IP和域名的对应关系,该机构就像CA机构一样,具有权威性。
- 如果新计算机接入网络,需要将这个信息注册到数据库中。
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址,返回给用户。
域名简介:
既然有了一个权威性的机构来提供域名解析服务,所以域名也有命名规则,以www.baidu.com为例:
com: 一级域名,表示这是一个企业域名,同级的还有net(网络提供商),org(非盈利组织) 等。baidu:二级域名,一般是公司名或者组织的名称。www:只是一种习惯用法,不写都可以,直接使用baidu.com也可以访问百度的服务器。
域名解析过程:
在Linux机器上使用yum -y install bind-utils指令可以安装一个dig工具,可以看到域名解析的过程。

如上图,是解析域名www.baidu.com的过程。
- 第一个绿色框中的内容是
dig工具的版本号等信息。 - 第二个绿色框是域名解析的结果,
NOERROR表示解析成功。 - 第三个绿色框是要解析的域名。
- 第四个绿色框是解析后的结果,在解析时,先将
www.baidu.com解析成了www.a.shifen.com,然后再将www.a.shifen.com解析成了两个IP地址。 - 最后一个绿色框是解析后的结构统计,包括解析时长,
DNS服务器的IP地址等信息。

如上图所示,在浏览器中输入解析出来的IP地址112.80.248.76,也可以直接访问到百度的首页,和输入域名www.baidu.com结果一样,区别在于:
- 使用IP地址访问时,浏览器自动采用
HTTP协议。 - 使用域名访问时,浏览器自动采用
HTTPS协议。
😽ICMP协议

如上图所示,主机A向主机B发送数据,数据经过多次局域网转发后到了路由器2,路由器2为了获取主机B的MAC地址,发送ARP请求,但是发送了多次都没有收到主机B的ARP应答。
此时路由器2会返回一个Destination Unreachable结果给主机A,主机A收到以后就知道了数据传送错误的原因。
这种返回错误的功能之前IP协议是没有的,如果发送不成功,传输层就会触发超时重传再次发送。这种方式对于使用者来说是没有问题的,但是对于网络管理员来说不够。
他们需要知道错误的原因从而进行修复,让网络通信正常,此时ICMP协议就派上了用场。
ICMP协议是一个网络层协议,它能确认IP数据包是否成功到达目标地址。- 如果没有发送成功,通知发送端IP数据包被丢弃的原因。
-
ICMP协议也是基于IP协议工作的,它并不是传输层的功能,所以我们把它归结为网络层协议。
ICMP只能搭配IPv4使用,如果是IPv6的情况,需要使用ICMPv6协议。
协议格式(了解):

关于协议格式,本喵不会详细讲解,有个了解就可以,ICMP报文大致分为两类,一类是通知出错原因,一类是用于诊断查询。

如上图表所示便是ICMP常见代码和代码所代表的内容。
ping命令:
我们在验证一个机器的网络是否连接成功时,通常都会使用ping。

如上图就是本喵在对www.baidu.com使用ping命令,可以在Linux上进行,也可以在Windows上进行。
- 此处
ping的是一个域名,而不是url(服务器web文件路径),域名可以通过DNS解析成IP地址。ping命令不仅能验证网络的连通性,而且也会统计响应的时间和TTL(IP协议中的生存时间,也就是跳数)。ping命令会先发送一个IMCP的Echo Request给对端,对端接收到之后会返回一个IMCP的Echo Reply。
ping命令是通过ICMP协议实现的,是网络层的协议,所以没有端口号,它绕过了应用层和传输层,直接从网络层开始。

如上图所示,traceroute 域名指令可以查询当前主机当目标主机之前经历了多少路由器,这也是基于ICMP协议实现的。
😽NAT技术
前面本喵在讲解IP协议数据发送的时候的时候,数据从局域网发送到公网服务器的过程中,每经过一个入口路由器,就会将IP报头中的目的IP地址替换成当前路由器的WAN口IP。
NAT能够将私有IP对外通信时转为公网IP,也就是一种将私有IP和公网IP相互转化的技术方法。

如上图所示,此时局域网的客户端A向公网中的服务器发送数据,客户端A将数据在网络层的时候封装IP报头,其中目的IP地址是服务器的公网IP地址163.221.120.9,源IP地址是自己的私有IP地址10.0.0.10,数据最后以MAC帧的形式发送到NAT路由器。
-
NAT路由器的内网LAN口IP地址是10.0.0.1,公网WAN口IP地址是202.244.174.37。
数据帧被路由器进行解包分用交给自己的网络层后,将IP报头中的源IP地址换成了WAN口IP地址,然后再封装成数据帧发送给公网中的服务器。
当目标IP地址的服务器响应时,同样也需要封装IP报头,其中目的IP就填路由器的WAN口IP,路由器拿到这个响应后,再将IP报头中的目的IP改成客户端A的IP地址10.0.0.10,再发送给客户端A。
问题来了,如果局域网中有多台客户端主机都访问这同一个服务器,甚至每台主机上有多个进程在访问这个服务器,请求数据包都可以通过NAT路由器发送给服务器,服务器也可以将响应返回给路由器。
- 但是,路由器收到数据包后,所有数据的IP报头中的目的IP地址都是
WAN口IP,路由器如何判断这个数据是给局域网中的哪个主机呢?又是该给主机上的哪个进程呢?
NAPT:
这个时候NAT就来解决问题了,采用的是IP + port的方式建立一个转换表。

如上图所示,局域网中的每台客户端的IP地址都是唯一的,一台客户端上每个进程的端口号又是唯一的,所以将IP地址和端口号组合成IP:port也是唯一的。
所有客户端,所有进程访问的都是同一台服务器的同一个服务进程,所以它们的目的IP和端口都是相同的。
- 将
源IP:源port和目的IP:目的port组合在一起形成一个四元组,这个四元组在局域网中也是唯一的。
一个四元组其实就是IP报头中的一部分,当数据传送到NAT路由器以后,路由器会维护一份转换表,如上图所示。
转换表中,将局域网四元组的源IP地址替换成WAN口IP,四元组中的端口号也替换成一个唯一的数字,此时就形成了一个新的四元组,该四元组在公网中是唯一的,然后和旧的四元组形成一个映射关系。
- 这个映射关系是互为键值的。
路由器也是一个主机,客户端A的数据包和客户端B的数据包,它们的四元组不同,路由器就好像是创建了两个“进程”来转发这两个数据包,并且将这两个数据包的源IP地址替换,端口号替换。
由于是路由器的不同“进程”在转发数据包,所以每一对映射关系中,路由器的四元组中的端口号都是不同的,和操作系统分配端口号是一个规则。
当服务器响应多个数据包给NAT路由器的时候,虽然目的IP地址都是WAN口IP,但是端口号不同。
路由器再根据不同端口号的公网四元组找到对应的局域网四元组,将数据发给相应客户端的相应进程。
NAT路由器中的映射关系转换表是由路由器自动维护的。- 假设使用TCP协议,当连接建立时,路由器中就会生成这对通信双方的映射表项,断开连接后就会删除这个表项。
路由器通常情况下都带有NAT功能,否则无法完成内网和公网的IP地址转换问题。
NAT技术的缺陷:
由于NAT技术非常依赖映射转换表,所以就有诸多限制:
- 服务器无法从公网主动给内网中的客户端发数据,因为路由器中没有映射关系,映射关系是在客户端给服务端发送数据时建立的。
- 转换表的生成和销毁都需要一定的开销,会增大路由器的负担。
- 通信过程中,一旦
NAT设备异常,所有的TCP连接就会出现异常。
😽代理服务器
假设你想买一些韩国的化妆品,但是你去韩国不方便,正好有个同学在韩国留学,此时你就可以让他帮你去实体店买,然后再给你。这个过程中,你同学扮演的就是正向代理的角色。
由于这个化妆品很好,所以你周围有很多人都让你同学帮代购,你同学觉得不停的去买比较麻烦,所以就在他国内的家里屯了一堆化妆品,有人让他代购的时候,他就将家里的化妆品给它,此时你同学扮演的就是反向代理的角色。

假设现在你的学校里办活动需要自己买一些东西,你和你的同学们一起从淘宝买,此时你们使用的都是校园网,淘宝为了满足大量客户的访问,所以它的服务器不止一台,而是一个服务器机群。
你和同学在访问淘宝服务器时,其实并不是你的客户端在直接访问,而是你将自己的请求交给学校的正向代理服务器,然后正向代理服务器代替你去请求淘宝。
当多个请求发送给淘宝服务器时,并不是直接发给了机群中的某台服务器,这样会导致服务器扛不住压力而奔溃。所以这些请求都是交给了淘宝的反向代理服务器。
反向代理服务器通过一些均衡策略,让这些大量的请求去访问不同的服务器,将请求压力分摊给每一台服务器,保证它的正常服务。
- 比如
Nginx就是专门用来做负载均衡,以及支持大量线程并发访问的服务器。
- 这也就是为什么我们在访问淘宝时,并不需要区分具体哪个服务器,只需要访问淘宝即可。
- 因为我们访问的实际上是淘宝的反向代理服务器。
上面过程中,学校的代理服务器离我们近,它是正向代理服务器,淘宝的代理服务器离我们远,它是反向代理服务器。

如上图所示,假设你用学校的校园网去看《战狼2》电影,你从客户端向腾讯视频发起请求,你的请求会被学校的代理服务器拦截下来,然后由代理服务器替你向腾讯视频发起请求。
腾讯视频收到代理服务器的请求后,将对应的电影资源响应给代理服务器,代理服务器收到响应后再将这个响应转发给你,并且将这个电影的响应缓存到代理服务器中。
你给你的同学推荐了这个电影,你的同学也用腾讯视频看这个电影,当他发起请求后,同样会被代理服务器拦截,然后发现本地有这个电影的缓存资源,就直接将这个资源给他返回了,代理服务器也不再向腾讯视频的服务器发起代理请求了。
这个过程中,你的同学拿到这个电影的资源比你会快很多,因为学校的代理服务器离你们更近。
- 代替客户端发起请求的,就是正向代理服务器。
- 用来作缓存的一般就是反向代理服务器。
实际上,正向代理服务器和反向代理服务器并没有非常明确的界限,就像上面例子中,学校的代理服务器既代替我们发起请求,也缓存了电影资源,它既是一个正向代理服务器也是一个反向代理服务器。
NAT和代理服务器:
代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后,代理服务器又把结果回传给客户端。
局域网中的客户端将请求交给NAT设备,NAT设备再将请求通过路由发送给目标服务器,目标服务器再将响应发送给NAT设备,NAT设备再将响应转发给局域网中的客户端。
二者的区别:
- 从应用上讲,
NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,像迅游这样的加速器,也是通过代理服务器缓存数据来达到加速的目的。 - 从底层实现上讲,
NAT是工作在网络层,直接对IP地址进行替换。代理服务器工作在应用层。 - 从使用范围上讲,
NAT一般在局域网的出口部署。代理服务器可以在局域网,也可以在广域网,也可以跨网。 - 从部署位置上看,
NAT一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
😽总结
这篇文章填了一些前面的坑,还介绍了网络中常用的技术和协议,是用来完善网络体系才写的,这些内容仅作为了解,并不是重点内容。
相关文章:
【网络】DNS | ICMP | NAT | 代理服务器
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程ÿ…...
详细手机代理IP配置
嗨,亲爱的朋友们!作为一家代理产品供应商,我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时,常常会遇到一些IP限制的问题。别担心!今天我要给大家分享一下手机IP代理的设置方法,让你们轻松应对这些限…...
【C++】—— 简述C++11新特性
序言: 从本期开始,我将会带大家学习的是关于C11 新增的相关知识!废话不多说,我们直接开始今天的学习。 目录 (一)C11简介 (二)统一的列表初始化 1、{}初始…...
协议的分层结构
1.1TCP/IP 协议 为了使各种不同的计算机之间可以互联,ARPANet指定了一套计算机通信协议,即TCP/IP 协议(族). 注意TCP /IP 协议族指的不只是这两个协议 而是很多协议, 只要联网的都使用TCP/IP协议族 为了减少 协议设计的复杂度 ,大…...
Linux下彻底卸载jenkins
文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…...
Nebula基础的查询操作介绍
Nebula基础的查询操作介绍 这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph 关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。 …...
C++ STL序列式容器(详解)
STL基础 C STL基本组成(6大组件13个头文件) 通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,它们各自的含义如表 1 所示。 表 1 STL 组成…...
C++获取map最小值算法,STL---std::min_element()!
std::min_element 定义于头文件 <algorithm> 以下是API文档说明! 寻找范围 [first, last) 中的最小元素。 1) 用 operator< 比较元素。 3) 用给定的二元比较函数 comp 比较元素。 2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is…...
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

