「前言」文章内容是DNS协议、ICMP协议、NAT技术的讲解。
「归属专栏」网络编程
「主页链接」个人主页
「笔者」枫叶先生(fy)
目录
- 一、DNS协议
- 1.1 背景
- 1.2 域名简介
- 1.3 域名解析的过程
- 二、ICMP协议
- 2.1 ICMP简介
- 2.2 ping命令
- 2.3 traceroute命令
- 三、NAT技术
- 3.1 NAT技术背景
- 3.2 NAT技术对IP地址转换过程
- 3.3 NAPT
- 3.4 NAT技术的缺陷
- 四、NAT和代理服务器
- 4.1 正向代理
- 4.2 反向代理
- 4.3 NAT和代理服务器的区别
一、DNS协议
DNS(
Domain Name System
,域名系统)协议是一种用于将域名解析为对应IP地址的协议。它是互联网上最重要的基础设施之一,用于将人类可读的域名转换为计算机可理解的IP地址。
1.1 背景
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。
但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts
文件夹来描述主机名和IP地址之间的对应关系
刚开始,这个hosts文件是由互联网信息中心(SRI-NIC)来管理的:
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更hosts文件
- 其他计算机也需要定期下载更新新版本的hosts文件才能正确上网
这样就太麻烦了,于是产生了DNS系统(用于帮助互联网进行商业化):
- 由一个组织的系统管理机构,维护系统内的每个主机的IP和主机名的对应关系
- 如果新计算机要接入网络,或者某个计算机IP变更,就需要将对应信息注册到数据库中
- 当用户通过域名访问互联网服务时,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容
在Linux上查看hosts文件cat /etc/hosts
即现在都是使用域名来代替IP地址进行访问,域名例如:www.baidu.com
1.2 域名简介
域名是互联网上的网站或网络资源的地址,它是由一串字符组成的标识符。域名的作用是方便用户记忆和使用,使得用户可以通过简单易记的名称来访问互联网资源,而不需要记住复杂的IP地址
域名由多个部分组成,每个部分用点分隔:
- 域名的最后一部分称为顶级域名(TLD)或者称为一级域名,例如
.com、.net、.org
等。顶级域名可以表示不同的组织类型或国家/地区,例如,.com
表示这是一个工商企业域名,.net
表示网络提供商和.org
表示开源组织或非盈利组织 - 顶级域名之前的部分称为二级域名,例如example.com中的example就是二级域名。二级域名可以由域名所有者自由选择
www
:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议
例如,www.baidu.com
,.com
是一级域名,baidu
是二级域名
1.3 域名解析的过程
域名解析是将域名转换为对应的IP地址的过程,它是通过DNS(域名系统)协议来实现的。下面是域名解析的基本步骤:
- 用户在浏览器中输入一个域名,例如www.example.com。 浏览器会向本地DNS服务器发送一个查询请求,询问该域名对应的IP地址
- 如果本地DNS服务器缓存了该域名的IP地址,它会直接返回给浏览器
- 如果本地DNS服务器没有缓存该域名的IP地址,它会向根域名服务器发送一个查询请求
- 根域名服务器会告诉本地DNS服务器,该域名对应的顶级域名服务器的地址。 本地DNS服务器再向顶级域名服务器发送一个查询请求
- 顶级域名服务器会告诉本地DNS服务器,该域名对应的权威域名服务器的地址。 本地DNS服务器再向权威域名服务器发送一个查询请求
- 权威域名服务器会返回该域名对应的IP地址给本地DNS服务器。 本地DNS服务器将IP地址缓存起来,并将它返回给浏览器。
- 浏览器收到IP地址后,会向该IP地址发送HTTP请求,与服务器建立连接,并获取网页内容
- 服务器将网页内容返回给浏览器,浏览器进行渲染,最终显示在用户的屏幕上
二、ICMP协议
2.1 ICMP简介
ICMP(
Internet Control Message Protocol
)是一种网络层协议,用于在IP网络中传输控制信息和错误报告。它是在网络层上工作的协议,主要用于网络设备之间的通信和网络故障的诊断
ICMP协议的定位:
准确来说,ICMP协议介于传输层和网络层之间,ICMP协议位于IP协议的上层
但是ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议
ICMP的主要功能包括:
- 确认IP包是否成功到达目标地址
- 通知在发送过程中IP包丢弃的原因
- ICMP只能搭配IPv4使用,如果是IPv6的情况下,需要使用ICMPv6
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因
例如
比如当主机A在向主机B发送数据的过程中,主机B因为某些原因已经离线了
因此路由器在多次发送ARP请求包而得不到响应后,就会返回一个ICMP Destination Unreachable
的包给主机A,此时主机A就知道自己发送的数据无法到达主机B
ICMP大概分为两类报文:
- 一类是通知出错原因的
- 一类是用于诊断查询的
ICMP包常见类型解释如下:
2.2 ping命令
ping命令前面已经介绍过了,不再赘述,这里谈一下原理
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常
例如,使用ping www.baidu.com
命令,测试本地主机与百度服务器之间的通信信道是否正常
- ping命令不仅能验证网络的连通性,同时也会统计响应时间和TTL(IP包中的Time To Live,生存时间)
- ping命令会先发送一个
ICMP Echo Request
给对端 - 对端接收到之后,会返回一个
ICMP Echo Reply
注意:此处ping的是的域名,该域名会由DNS解析成IP地址
一个值得注意的坑
telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
- ping命令基于ICMP,是在网络层
- 而端口号,是传输层的内容,在ICMP中根本就不关注端口号这样的信息(ICMP绕过了传输层)
2.3 traceroute命令
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器
在Linux安装该命令:
sudo yum install -y traceroute
例如,使用traceroute www.baidu.com
命令,遍历数据包传送到百度服务器所经过的所有路由器
三、NAT技术
NAT(
Network Address Translation
,网络地址转换)是一种常用的网络技术,用于在一个网络中将私有IP地址转换为公共IP地址,以实现多个设备共享一个公共IP地址的功能,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
3.1 NAT技术背景
- IPv4地址空间只有32位,最多可以表示42亿个地址,而随着互联网的迅速发展,这个地址空间很快就被耗尽了
- 为了解决这个问题,IPv6地址空间被设计为128位,可以表示更多的地址,但是IPv6的普及和应用还需要时间
- 在IPv4地址不足的情况下,NAT技术应运而生
- NAT技术可以将多个私有IP地址映射到一个或多个公共IP地址上,从而节约了公共IP地址的使用
- 同时,NAT技术还可以隐藏内部网络的真实IP地址,提高了网络的安全性
3.2 NAT技术对IP地址转换过程
这个在IP协议已经谈过
NAT技术对IP地址转换过程(数据包从局域网到公网的过程)(出去,也就是发送请求)
路由器是连接两个或多个子网的硬件设备,在路由器上有两种网络接口,分别是LAN口
和WAN口
:
- LAN口(
Local Area Network
):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连 - WAN口(
Wide Area Network
):表可以理解为连接公网网络的接口,一般指互联网
LAN口的IP地址叫做LAN口IP(对内),也叫做子网IP,将WAN口的IP地址叫做WAN口IP,也叫做外网IP(对外)
子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP
地址替换成路由器的WAN口IP
,这样逐级替换,最终数据包中的源IP
地址成为一个公网IP
(NAT技术)
数据包转发的大致流程如下:
- 假设数据包要去往
122.77.241.3/24
- 数据包从自己的主机发送给路由器之后,路由器发现要去往的目的IP不再自己的子网内
- 此时就会进行
源IP
替换成路由器的WAN口IP
,再转发给跟自己直接相连的另一个子网 - 假设转发的数据包到了运营商的路由器,经过多级转发(经过运营商的多个子网),最后发现数据包要去往的目的IP不在自己的子网内
- 此时也进行
源IP
替换成路由器的WAN口IP
,然后直接把数据包转发到公网上 - 再由公网转发到对应的目的IP
上述是数据包从局域网到公网的转换过程
NAT技术对IP地址转换过程(数据包从公到局域网的过程)(回来,也就是服务端发送响应)
外网的主机在和局域网的某一台主机进行通信时,路由器会不断将数据包IP首部中的目的IP
地址替换成路由器的WAN口IP
,这样逐级替换,最终数据包中的源IP
地址换成相应主机的局域网IP地址,然后将数据包发送到相应的主机(NAT技术)
数据包转发回来的大致流程如下:
- 数据包从主机
122.77.241.3/24
发送给路由器之后(数据包不知道最终的目的IP是多少,需要通过查询地址转化表得知下一个路由器的IP地址,地址转化表下面说),通过路由地址转化表得知下一个路由器的IP地址(WAN口IP) - 此时就会进行
目的IP
替换成下一个路由器的WAN口IP
,再转发给下一个路由器 - 经过多级转发和替换,数据包最终到达了相应的局域网
- 也是通过查询地址转换表,直接把数据包发送给相应的主机
注:地址转化表下面讲,上述就是数据包从公网回到局域网的过程
- 如果该局域网只有一台主机访问该服务器,数据包从公网回到局域网,IP地址转换过程也是和上面一样
- 但是,该局域网如果有多台主机都访问该服务器,那么对于服务器返回的数据包,目的IP都是相同
的,那么路由器如何判定将这个数据包转发给哪个局域网的主机? - 如何把数据包转发给对应的主机(同一局域网内有多台主机(客户端)访问同一台服务器),这里就涉及到NART
3.3 NAPT
先谈一下上面的地址转化表
地址转化表
- 当局域网当中的主机要访问公网时,路由器会将这些数据包的源IP地址替换成路由器自己的
WAN口IP
地址(每到达一个路由器就转化一次) - 当公网发来响应数据包时,则是对目的IP进行替换
当公网转发的数据包到达相应的局域网,数据包如何把数据包转发给相应的主机?
- 实际上,在路由器内部,有一张自动生成的(路由器自动维护),用于地址转换的表
- 该转换表中维护的就是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系(键值对,kv)
- 局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系
- 比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系
在上述例子中,主机192.168.1.201
第一次向服务器发起数据请求时,路由器中就会建立以下映射关系
当路由器收到服务器向发来的响应数据时,就可以通过查表得知该响应数据是发送给局域网当中的主机
但是,如果局域网中的主机192.168.1.201
和主机192.168.1.202
(多台主机)同时都在访问该服务器,那么此时转换表中就会建立如下两对映射关系:
此时就会产生一个问题:对于服务器返回的数据包,目的IP都是相同的,那么路由器如何判定将这个数据包转发给哪个局域网的主机?
- 上面的地址转换表只能保证从左到右的唯一性,而不能保证从右到左的唯一性
- 此时路由器就无法判断该数据包应该转发给主机
192.168.1.201
还是主机192.168.1.202
- 此时就需要用到NAPT技术
NAPT
NAPT(Network Address and Port Translation
)技术是一种基于NAT的扩展,它不仅会转换数据包中的IP地址,还会转换端口号
NAPT技术通过转换IP地址和端口号,实现了多个内部主机共享单个公网IP地址进行通信的功能
- 也就是说,除了建立局域网中私有IP与其对应访问的公网IP之间的映射关系外,还会加上一个由路由器选定的端口号进行替换
- 即
IP + port
为一组映射关系,上面谈的地址转换表并不完整 - 当外部网络返回数据包时,NAPT会根据转换表将目的IP地址和端口号进行转换,将数据包正确地发送到内部网络的相应主机上
- 此时就解决了路由器如何判定将这个数据包转发给哪个局域网的主机
例如
比如局域网中的主机A和主机B都在访问同一个服务器(假设服务器的端口号是80),并且它们访问服务器时采用的端口号都是1025(两台主机上的进程端口号可能会相同,就拿这个举例)
- 假设主机A发送的数据包先到达路由器,此时路由器将数据包的源IP地址替换成自己的
WAN口IP
地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变 - 当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的
WAN口IP
地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换
映射关系如下:
此时这张转换表既能保证从左到右的唯一性,也能保证从右到左的唯一性
- 当服务器发来的响应数据到达局域网的路由器时,虽然服务器发给主机A和主机B的数据包对应的
目的IP
地址是一样的 - 但路由器是用自己的1025号端口代替主机A进行数据请求的,而用的是1026号端口代替主机B进行数据请求的
- 因此路由器进行查表,可以继续根据地址转化表的源端口号,来判断应该将该数据包转发给主机A还是主机B
- 最后进行对数据包中的目的IP地址和目的端口号进行替换,然后转发给局域网内对应的主机
3.4 NAT技术的缺陷
NAT技术进行私有IP和公网之间的替换,主要就是依赖NAT路由器当中维护的网络地址转换表,但这张转换表也体现出了NAT的一些缺陷:
- 无法从NAT外部向内部服务器建立连接,因为外部无法知道内部的私网IP,也就无法主动与内部服务器建立连接
- 转换表的生成和销毁都需要额外开销
- 通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开
总之,NAT技术的优点大于缺点
补充:内网穿透
- 内网穿透是一种网络技术,用于在私有网络(如局域网)中的设备与公共网络(如互联网)上的设备进行通信
- 通常情况下,私有网络中的设备由于NAT(网络地址转换)或防火墙的限制,无法直接被公共网络上的设备访问
- 内网穿透技术的目的就是克服这些限制,使得私有网络中的设备可以被公共网络上的设备访问
- 简单来说就是,允许你内网的机器暴露在公网上,通过公网可以访问到你内网上的机器(这样你内网上的机器就相当于一台云服务器)
- 内网穿透技术通常是基于NAT(网络地址转换)技术实现的,可以说内网穿透技术是在NAT技术基础上的一种扩展
四、NAT和代理服务器
- 代理服务器(Proxy Server)是一种位于客户端和目标服务器之间的服务器,它充当客户端和目标服务器之间的中介,转发客户端的请求并获取目标服务器的响应
- 代理服务器可以用于访问受限制的内容、提高网络安全性、提高访问速度、隐藏客户端的真实IP地址等目的
- 常见的代理服务器类型包括正向代理服务器和反向代理服务器
4.1 正向代理
正向代理(Forward Proxy)是一种代理服务器,它代表客户端向目标服务器发送请求
- 当客户端需要访问互联网上的资源时,它会向正向代理服务器发送请求,然后代理服务器会将请求转发给目标服务器,并将目标服务器的响应返回给客户端
- 服务器响应的结果也是让正向代理服务器转发给相应的客户端
- 正向代理服务器会把服务端响应的数据缓存到本地上
- 如果客户端需要访问的资源在正向代理服务器本地缓存有,那正向代理服务器就会直接返回本地的资源给客户端,不再把请求转发给服务端
- 正向代理服务器更靠近的是客户端
如果请求的资源已经存在:
- 举例来说,学校的校园网,校园网的服务器就是正向代理服务器,我们使用校园网,校园网的代理服务器会帮我们转发我们的请求
- 当校园网的服务器收到对应外网的响应数据后,再由这台服务器将数据转发给你
- 当然,也可以对你的请求进行拦截
正向代理服务器的好处是:
- 正向代理在访问控制、隐私保护、内容过滤、加速访问速度等方面具有广泛的应用
- 加速访问速度:代理服务器可以缓存经常访问的内容,提高访问速度,减轻目标服务器的负载(例如:游戏加速器)
- 绕过网络限制:在企业、学校或国家级防火墙中,正向代理可用于绕过网络限制,访问受限制的内容或网站(例如:fan墙)
4.2 反向代理
反向代理(Reverse Proxy)是一种代理服务器,它代表目标服务器向客户端发送请求
- 当客户端需要访问某个服务时,它发送请求到反向代理服务器,然后反向代理服务器将请求转发给后端的目标服务器,获取响应后再返回给客户端
- 反向代理服务器更靠近的是服务端
反向代理广泛应用于 Web 服务器、负载均衡、安全防护、内容加速等场景
负载均衡
- 负载均衡(Load Balancing)是一种用于在多个服务器之间分配工作负载的技术,旨在提高系统的性能、可靠性和可扩展性
- 负载均衡器(Load Balancer)通常位于客户端和服务器之间,接收来自客户端的请求,并将其分发到多个后端服务器上,以确保这些服务器能够平衡地处理请求
- 负载均衡其实就是反向代理服务器
例如:一家公司的服务器不止一台,会把一台服务器充当反向代理服务器(入口服务器),当大量的请求到来时,反向代理服务器通过一些策略和算法,均匀这把请求打到每一台服务器上(负载均衡)
正反代理服务器的异同
作用对象:
- 正向代理:代理的对象是客户端,客户端通过正向代理来访问其他服务器或资源
- 反向代理:代理的对象是服务器,客户端通过反向代理来访问后端的服务器或资源
使用场景:
- 正向代理:常见于绕过网络限制、访问国外内容、保护客户端隐私等场景
- 反向代理:常见于负载均衡、安全防护、内容加速、隐藏真实服务器等场景。
部署位置:
- 正向代理:通常部署在客户端所在的网络中,客户端需要配置代理服务器的地址和端口
- 反向代理:通常部署在目标服务器所在的网络中,客户端并不直接感知反向代理的存在
4.3 NAT和代理服务器的区别
路由器往往都具备NAT的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程
代理服务器看起来和NAT有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端
NAT和代理服务器的区别
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题,而代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,游戏加速器等
- 从底层实现上讲,NAT一般工作在网络层,直接对IP地址进行替换,而代理服务器工作在应用层
- 从使用范围上讲,NAT一般在局域网的出口部署,而代理服务器可以在局域网代理,也可以在广域网代理,也可以跨网代理
- 从部署位置上看,NAT一般集成在防火墙、路由器等硬件设备上,而代理服务器则是一个软件程序(比如Nginx和Apache),需要部署在服务器上
以上就是所有内容
「 作者 」 枫叶先生
「 更新 」 2024.1.1
「 声明 」 余之才疏学浅,故所撰文疏漏难免,或有谬误或不准确之处,敬请读者批评指正。