「前言」文章内容是DNS协议、ICMP协议、NAT技术的讲解。
「归属专栏」网络编程
「主页链接」个人主页
「笔者」枫叶先生(fy)
DNS(
Domain Name System
,域名系统)协议是一种用于将域名解析为对应IP地址的协议。它是互联网上最重要的基础设施之一,用于将人类可读的域名转换为计算机可理解的IP地址。
TCP/IP中通过IP地址和端口号的方式,来确定网络中一个主机上的一个程序。
但IP地址是一长串数字,并不便于人们记忆,于是人们发明了一种叫做主机名的东西,并用hosts
文件夹来描述主机名和IP地址之间的对应关系
刚开始,这个hosts文件是由互联网信息中心(SRI-NIC)来管理的:
这样就太麻烦了,于是产生了DNS系统(用于帮助互联网进行商业化):
至今,我们的计算机上仍然保留了hosts文件,这个hosts文件当中一般存储的是主机名与IP地址之间的映射,用户也可以在hosts文件中自主添加域名和IP映射关系,在域名解析的过程中会优先查找hosts文件的内容
在Linux上查看hosts文件cat /etc/hosts
即现在都是使用域名来代替IP地址进行访问,域名例如:www.baidu.com
域名是互联网上的网站或网络资源的地址,它是由一串字符组成的标识符。域名的作用是方便用户记忆和使用,使得用户可以通过简单易记的名称来访问互联网资源,而不需要记住复杂的IP地址
域名由多个部分组成,每个部分用点分隔:
.com、.net、.org
等。顶级域名可以表示不同的组织类型或国家/地区,例如,.com
表示这是一个工商企业域名,.net
表示网络提供商和.org
表示开源组织或非盈利组织www
:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议例如,www.baidu.com
,.com
是一级域名,baidu
是二级域名
域名解析是将域名转换为对应的IP地址的过程,它是通过DNS(域名系统)协议来实现的。下面是域名解析的基本步骤:
ICMP(
Internet Control Message Protocol
)是一种网络层协议,用于在IP网络中传输控制信息和错误报告。它是在网络层上工作的协议,主要用于网络设备之间的通信和网络故障的诊断
ICMP协议的定位:
准确来说,ICMP协议介于传输层和网络层之间,ICMP协议位于IP协议的上层
但是ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议
ICMP的主要功能包括:
一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通,但是IP协议并不提供可靠传输,如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因
例如
比如当主机A在向主机B发送数据的过程中,主机B因为某些原因已经离线了
因此路由器在多次发送ARP请求包而得不到响应后,就会返回一个ICMP Destination Unreachable
的包给主机A,此时主机A就知道自己发送的数据无法到达主机B
ICMP大概分为两类报文:
ping命令前面已经介绍过了,不再赘述,这里谈一下原理
ping命令是基于ICMP协议实现的,通常用于测试本地主机与另一台主机之间的通信信道是否正常
例如,使用ping www.baidu.com
命令,测试本地主机与百度服务器之间的通信信道是否正常
ICMP Echo Request
给对端ICMP Echo Reply
注意:此处ping的是的域名,该域名会由DNS解析成IP地址
一个值得注意的坑
telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
traceroute命令也是基于ICMP协议实现的,traceroute命令可以遍历数据包传送到目标主机所经过的所有路由器
在Linux安装该命令:
sudo yum install -y traceroute
例如,使用traceroute www.baidu.com
命令,遍历数据包传送到百度服务器所经过的所有路由器
NAT(
Network Address Translation
,网络地址转换)是一种常用的网络技术,用于在一个网络中将私有IP地址转换为公共IP地址,以实现多个设备共享一个公共IP地址的功能,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机
这个在IP协议已经谈过
NAT技术对IP地址转换过程(数据包从局域网到公网的过程)(出去,也就是发送请求)
路由器是连接两个或多个子网的硬件设备,在路由器上有两种网络接口,分别是LAN口
和WAN口
:
Local Area Network
):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连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
替换成路由器的WAN口IP
,再转发给跟自己直接相连的另一个子网源IP
替换成路由器的WAN口IP
,然后直接把数据包转发到公网上上述是数据包从局域网到公网的转换过程
NAT技术对IP地址转换过程(数据包从公到局域网的过程)(回来,也就是服务端发送响应)
外网的主机在和局域网的某一台主机进行通信时,路由器会不断将数据包IP首部中的目的IP
地址替换成路由器的WAN口IP
,这样逐级替换,最终数据包中的源IP
地址换成相应主机的局域网IP地址,然后将数据包发送到相应的主机(NAT技术)
数据包转发回来的大致流程如下:
122.77.241.3/24
发送给路由器之后(数据包不知道最终的目的IP是多少,需要通过查询地址转化表得知下一个路由器的IP地址,地址转化表下面说),通过路由地址转化表得知下一个路由器的IP地址(WAN口IP)目的IP
替换成下一个路由器的WAN口IP
,再转发给下一个路由器注:地址转化表下面讲,上述就是数据包从公网回到局域网的过程
先谈一下上面的地址转化表
地址转化表
WAN口IP
地址(每到达一个路由器就转化一次)当公网转发的数据包到达相应的局域网,数据包如何把数据包转发给相应的主机?
在上述例子中,主机192.168.1.201
第一次向服务器发起数据请求时,路由器中就会建立以下映射关系
当路由器收到服务器向发来的响应数据时,就可以通过查表得知该响应数据是发送给局域网当中的主机
但是,如果局域网中的主机192.168.1.201
和主机192.168.1.202
(多台主机)同时都在访问该服务器,那么此时转换表中就会建立如下两对映射关系:
此时就会产生一个问题:对于服务器返回的数据包,目的IP都是相同的,那么路由器如何判定将这个数据包转发给哪个局域网的主机?
192.168.1.201
还是主机192.168.1.202
NAPT
NAPT(Network Address and Port Translation
)技术是一种基于NAT的扩展,它不仅会转换数据包中的IP地址,还会转换端口号
NAPT技术通过转换IP地址和端口号,实现了多个内部主机共享单个公网IP地址进行通信的功能
IP + port
为一组映射关系,上面谈的地址转换表并不完整例如
比如局域网中的主机A和主机B都在访问同一个服务器(假设服务器的端口号是80),并且它们访问服务器时采用的端口号都是1025(两台主机上的进程端口号可能会相同,就拿这个举例)
WAN口IP
地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变WAN口IP
地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换映射关系如下:
此时这张转换表既能保证从左到右的唯一性,也能保证从右到左的唯一性
目的IP
地址是一样的NAT技术进行私有IP和公网之间的替换,主要就是依赖NAT路由器当中维护的网络地址转换表,但这张转换表也体现出了NAT的一些缺陷:
总之,NAT技术的优点大于缺点
补充:内网穿透
正向代理(Forward Proxy)是一种代理服务器,它代表客户端向目标服务器发送请求
正向代理服务器的好处是:
反向代理(Reverse Proxy)是一种代理服务器,它代表目标服务器向客户端发送请求
反向代理广泛应用于 Web 服务器、负载均衡、安全防护、内容加速等场景
负载均衡
例如:一家公司的服务器不止一台,会把一台服务器充当反向代理服务器(入口服务器),当大量的请求到来时,反向代理服务器通过一些策略和算法,均匀这把请求打到每一台服务器上(负载均衡)
正反代理服务器的异同
作用对象:
使用场景:
部署位置:
路由器往往都具备NAT的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程
代理服务器看起来和NAT有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端
NAT和代理服务器的区别
以上就是所有内容
「 作者 」 枫叶先生
「 更新 」 2024.1.1
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。