DNS、ICMP和NAT
文章目录
DNS是什么
DNS(D omain N ame System)是一整套从域名映射到IP的系统,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
TCP/IP中通常使用IP地址和端口号来标定主机上的一个服务,而IP地址通常是32位的二进制数字的集合,记起来非常不方便,因此就有人发明出来了域名((Domain Name),采用了就采用了域名系统来管理名字和IP的对应关系。
一个企业的web网站相当于网络上它的门户,而域名就是门户的门牌号,因此通常域名会使用企业的名字或简称。例如百度的域名https://www.baidu.com/
。b站的域名https://www.bilibili.com/
。使用域名的另一个好处是,当我想要访问某个网站,但又不记得该网站的域名,就可以通过输入其企业名字作为试探。实际上域名可以看作成一个字符串,这样会让网络上的服务好记些。
当一个用户想要访问网络上的服务时,可以通过IP地址进行访问,也可以输入域名进行访问。
域名系统的名字空间
域名空间的层次结构
- 名字空间是指定义了所有可能的名字的集合。域名系统的名字空间是层次结构的,类似Windows的文件名。
- 它可看作是一个树状结构,域名系统不区分树内节点和叶子节点,而统称为节点,不同节点可以使用相同的标记。
- 所有节点的标记只能由3类字符组成:26个英文字母(a~z)、10个阿拉伯数字(0~9)和英文连词号(-),并且标记的长度不得超过22个字符。
- 一个节点的域名是由从该节点到根的所有节点的标记连接组成的,中间以
.
分隔。最上层节点的域名称为一级(顶级)域名(TLD,Top-Level Domain),第二层节点的域名称为二级域名,依此类推。
例如
www.baidu.com
com
:一级(顶级)域名。表示这个是企业使用的域名,同级的还有net
(网络提供商),org
(非盈利组织)等。
baidu
:二级域名,通常是企业名。
www
:万维网的简称。只是一种习惯用法,之前人们在使用域名时, 往往命名成类似于ftp.xxx.xxx/www.xxx.xxx
这样的格式, 来表示主机支持的协议。
域名的分配和管理
域名由因特网域名与地址管理机构(ICANN,Internet Corporation for Assigned Names and Numbers)管理,这是为承担域名系统管理、IP地址分配、协议参数配置,以及主服务器系统管理等职能而设立的非盈利机构。ICANN为不同的国家或地区设置了相应的顶级域名,这些域名通常都由两个英文字母组成。例如:.uk代表英国、.fr代表法国、.jp代表日本。中国的顶级域名是.cn,.cn下的域名由CNNIC进行管理。
顶级类别域名
除了代表各个国家顶级域名之外,ICANN最初还定义了7个顶级类别域名,它们分别是是.com
、.top
、.edu
、.gov
、.mil
、.net
、.org
;.com
。.top用于企业,.edu用于教育机构,.gov用于政府机构,.mil用于军事部门,.net用于互联网络及信息中心等,.org用于非盈利性组织等。
例如因特网的域名空间
DNS域名解析过程
-
主机在浏览器中输入某个web服务器的域名后,主机首先会去自己的DNS高速缓存中查找该域名对应的IP地址。
-
如果没有找到,就会向网络上的某台DNS服务器申请查询,DNS服务器中含有域名和IP地址映射关系的数据库。
-
当DNS收到DNS查询报文后,在数据库中查询,之后将查询结果通过网络发送给主机。
-
给DNS给域名服务器,返回一个IP地址。
-
此时主机中的浏览器可以通过Web服务器的IP地址对其进行访问了。
域名解析包含两种查询方式,递归查询 和迭代查询。
递归查询
如果主机所询问的本地域名服务器不知道查询域名的IP地址,那么本地域名服务器会充当DNS客户端的身份,向其他根域名服务器继续发送查询请求报文,即替主机查询。
- 主机首先向本地域名服务器进行递归查询。
- 本地域名服务器收到查询请求后,在服务器的数据库中没有查询到对应内容,也采用递归查询的方式向某个根域名服务器查询。
- 根域名服务器收到查询请求后,在服务器的数据库中没有查询到对应内容,也采用递归查询的方式向某个顶级域名服务器查询。
- 当查询到域名对应的IP地址后,查询结果会在之前受委托的各域名服务器之间传递,最终传回给用户主机。
迭代查询
当根域名服务器收到本地域名服务器发送的迭代查询请求时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步去找哪个服务器进行查询。
- 主机首先向本地域名服务器进行递归查询。
- 本地域名服务器收到查询请求后,在服务器的数据库中没有查询到对应内容,采用迭代查询的方式向某个根域名服务器查询。
- 根域名服务器收到查询请求后,在服务器的数据库中没有查询到对应内容,告诉本地域名服务器可以向某个顶级域名服务器查询。
- 本地域名服务器向顶级域名服务器进行迭代查询。
- 顶级域名服务器收到查询请求后,当查询到域名对应的IP地址后,查询结果会直接发送给本地域名服务器,最终传回给用户主机。
高速缓存
为了提高DNS的查询效率,并减轻根域名服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛地使用了高速缓存 。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
域名与IP地址的映射不是永久不变的,为了保持高速缓存中内容的正确性,域名服务器应为每项内容设置计时器并删除超过合理时间的项。
不仅仅本地域名服务器需要高速缓存,用户主机也需要。许多用户主机在启动时从本地域名服务器下载域名和IP地址的全部数据库,维护存放自己最近使用的域名的高速缓存,只在从缓存中找不到域名时才向域名服务器查询。同理,主机也需要保持高速缓存中内容的正确性。
ICMP
ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP的定位
在TCP/IP四层模型中,网络协议栈自顶向下分为四层,分别是应用层、传输层、网络层、数据链路层。
其中应用层最常见协议的是HTTP、HTTPS和DNS,传输层最常见协议的是TCP、UDP,网络层最常见协议的是IP,数据链路层最常见协议的是MAC协议。
而ICMP、IMP协议和IP协议虽然同属于传输层层,但ICMP协议和IMP协议都位于IP帧协议的上层。
- 因此IP协议的上层协议不一定是TCP协议、UDP协议,有可能是ICMP协议/IMP协议。也就是说IP协议解包后向上交付时不只会交付给IP协议,也可能会交付给ICMP、IMP协议。
ICMP协议的功能
ICMP协议的主要功能包含:
- 确认IP包是否成功到达目标地址。
- 通知在发送过程中IP包被丢弃的原因。
- ICMP也是基于IP协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
- ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6。
举个例子
- 主机A想要跨网络发送数据给主机B,首先主机A会将数据包发送给路由器1,由路由器1转发。
- 路由器1将数据包转发给主机B的入口路由器,即路由器2,此时路由器2知道主机B的IP地址,但是不知道主机B的mac地址,因此发送arp请求给主机B,请求主机B的mac地址。
- 由于主机B掉线了,无法回答路由器2arp响应,经过多次的arp请求后,路由器2返回一个Destination Unreachable给主机A,通知主机A该IP数据包没有成功到达主机B。
ICMP的报文格式
ICMP大概分为两种报文:
- 一类是用于通知出错原因
- 一类是用于诊断查询
ICMP包常见类型如下:
类型 | 内容 |
---|---|
0 | 回送应答(Echo Reply) |
3 | 目标不可达(Destination Unreachable) |
4 | 原点抑制(Source Quench) |
5 | 重定向或改变路由(Redirect) |
8 | 回送请求(Echo Request) |
9 | 路由器公告(Router Advertisement) |
10 | 路由器请求(Router Solicitation) |
11 | 超时(Time Exceeded) |
17 | 地址子网请求(Address Mask Request) |
18 | 地址子网应答(Address Mask Reply) |
ping命令
ping命令是一个基于ICMP协议的TCP/IP工具。它的主要功能为:
- 用来检测网络的连通情况和测试网络速度。
- 根据域名得到相应主机的IP地址。
- 根据ping返回的TTL(IP包中的Time To Live, 生存周期)值来判断对方所使用的操作系统及数据包经过路由器数量。
因为具备了以上功能,ping命令常常被黑客用来做网络扫描和主机攻击。
现通过ping命令对百度的网站进行检测。会对域名www.baidu.com
解析成IP地址157.148.69.74
。
- ping命令会先发送一个ICMP Echo Request给对端。
- 对端接收到之后,会返回一个ICMP Echo Reply。
telnet对应的端口号是23,ssh对应的端口号是22,那ping对应的端口号是多少?
ping命令基于ICMP,是在网络层,而端口号是传输层的内容,传输层在网络层之上,因此在ICMP中根本就不关注端口号这样的信息。
traceroute命令
traceroute命令也是基于ICMP协议实现的,利用ICMP协议定位主机和目标主机之间的所有路由器。
- tracetoute命令通过控制数据包的TTL来获取到路径上的路由器信息。
- 每当数据包经过一个路由器,其TTL值就会减1,当TTL值减为0时对应路由设备就会将该数据包丢弃,并传送一个
Destination Unreachable
ICMP TTL数据包返回给主机。 - tracetoute命令底层修改TTL,多次发送数据包,就能够拿到路径上路由器信息。
NAT
NAT是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。
NAT技术背景
NAT实际上是为解决IPv4地址短缺而开发的技术。
之前介绍IP协议的时候提到过,早期的IP地址被划分为5类,由于B类设计的比较合理,会导致大多数人申请B类(最多能容纳6w多个主机号),而A类却浪费了大量地址。网络层协议---IP协议
- A类从0.0.0.0到127.255.255.255
- B类从128.0.0.0到191.255.255.255
- C类从192.0.0.0到223.255.255.255
- D类从224.0.0.0到239.255.255.255
- E类从240.0.0.0到247.255.255.255
因此需要通过NAT技术,将子网内的私有IP转化为公网IP,公网IP才要求唯一性。大大提高了IP地址的使用率。
NAT IP转换过程
例如客户端A想要跨网段将数据发送给服务器。客户端A的私有IP是10.0.0.10
。注意:私有IP的在子网内使用的,不同子网的私有IP可以相同,但在同一个子网内私有IP需要保持唯一性。
- 客户端A将数据包发送到同个子网的路由器,由路由器转发。数据包的源IP是客户端A的私有IP
10.0.0.10
,目的IP是服务器的公网IP163.221.120.9
。 在NAT路由器中,会将数据包IP首部的源IP由私有IP10.0.0.10
转化为公网IP202.244.174.37
,该公网IP在公网内具备唯一性。根据目的IP,NAT路由器将该报文进行转发。 - 报文经过多次跳转,最终发送到目标服务器上,由于该服务器是直接部署在公网上,因此服务器只认识公网IP,而该报文的源IP恰好就是全局IP。
- 服务器接收到了客户端A的请求,现发送响应给客户端A。源IP是服务器的公网IP
163.221.120.9
,目的IP是202.244.174.37
即NAT路由器所替换的全局IP。 - NAT路由器接收到数据包后,将全局IP
202.244.174.37
转换回客户端A的私有IP10.0.0.10
,然后将该报文发送到客户端A上。
- 实际上,NAT路由器内含有一张私有IP和全局IP的映射表。当
10.0.0.10
第一次向163.221.120.9
发送数据时就会生成表中的映射关系。NAT路由器转换数据包IP首部包含的IP地址就是根据该映射表完成的。 - NAT路由器所管理的子网内,私有IP统称为LAN口IP,而服务器发送给客户端A的响应IP首部包含的目的IP是NAT路由的WAN口IP。一个路由器可以配置两个地址,一个是LAN口IP,对内(子网)使用LAN口。一个是WAN口IP,对外(公网)使用WAN口。
NAPT
若局域网内具有多个主机同时访问一个公网上的服务器,对于服务器返回的数据包,目的IP都是相同的,NAT路由器如何判定将数据包发送给哪个客户端呢?
使用IP+port来解决
例如子网内的客户端A和客户端B都要发送请求给公网上部署的服务器,客户端A的私有IP是10.0.0.10
,端口号是1025
。客户端B的私有IP是10.0.0.11
,端口号是1025
。服务器的公网IP是163.221.120.9
,端口号是80
- 客户端A想要跨网段发送数据包给服务器,需要将数据包发送给子网的出口路由器,由路由器转发到公网上的服务器。NAT路由器接收到客户端A发送来的数据包时,建立私有IP和公网IP的地址转换表,其中数据包IP首部包含的IP地址和端口号字段
10.0.0.10:1025
对应的公网上使用的IP地址和端口号202.244.174.37:1025
。该公网IP是路由器的WAN口IP,端口号由路由器分配。 - 同理,路由器收到客户端B发送来的数据包,也建立对应的地址转换表。由于
1025
端口先前被使用了,因此分配1026
给客户端B,客户端B被路由器转发到公网上数据包的源IP+端口号字段为202.244.174.37:1026
。该公网IP是路由器的WAN口IP,端口号由路由器分配。 - 服务器先后接收到客户端A和客户端B发送来的请求数据包,由于两份数据包的源端口号字段不同,服务器能够区分出这是两份数据包。现需要对请求返回相应。返回的响应中,源IP+端口号字段都为
163.221.9:80
。不同的是,返回给客户端A的响应中包含的目的IP+端口号字段是202.244.174.37:1025
,返回给客户端B的响应中包含的目的IP+端口号字段是202.244.174.37:1026
。 - 路由器接收到两份响应,根据已经建立好的地址转换表,能够判别出数据包是发送给子网内的哪台主机。
这种关联关系也是由NAT路由器自动维护的。例如在TCP的情况下, 建立连接时, 就会生成这个表项,在断开连接后, 就会删除这个表项。
NAPT简介
NAPT(Network Address Port Translation),即网络地址端口转换,可将多个内部地址映射为一个合法公网地址,但根据不同的协议端口号,完成不同的内部地址相对应和转换。NAPT普遍用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT也被称为"多对一"的NAT。
总结一下:
- 当子网内的主机需要向公网上的主机发送数据时,路由器会将发送的报文包含的源IP替换成路由器的WAN口IP,并建立子网主机的私有IP与其对应公网IP的关系。
- 当一个子网内有多台主机需要向公网上的主机发送数据时,路由器不仅会将对发送的报文包含的源IP替换成路由器的WAN口IP,还会给主机分配端口号,并建立并建立子网主机的私有IP+端口号与其对应公网IP+端口号的关系。
- 公网上的主机虽收到同个源IP发送来的报文,但能通过不同的端口号进行判定这是不同的主机发送过来的报文。
如果说NAT技术通过建立私有IP与公网IP的联系保持子网主机的唯一性,那么NAPT技术就是通过建立私有IP+端口号与公网IP+端口号的联系保持子网主机的唯一性。即维护了一张转换表。
NAT的实现方式
NAT的实现方式有三种,即静态转换,动态转换和端口多路复用。
静态转换:内部本地地址一对一转换成内部全局地址,相当内部本地的每一台PC都绑定了一个全局地址。
静态转换维护子网内一台主机分配一个公网IP,其实际使用意义不大,因为一个公网IP只能唯一的对应一台子网主机。
动态转换:将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。
它能够将未注册的IP地址映射到注册IP地址池中的一个地址。不像静态转换那样,你无需静态的配置路由器,使其子网IP映射到公网IP上,但必须要包含足够的公网IP,让连接上公网的子网主机能够同时发送和接收数据。
端口多路复用(Port address Translation,PAT):是指在对IP进行转换的基础上,改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation),采用端口多路复用方式。
内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自公网的攻击。因此,网络中应用最多的就是端口多路复用方式。
NAT技术的缺陷
由于NAT依赖这个转换表,因此也具有诸多缺陷
- 无法从NAT外部向内部服务器建立连接。子网内的主机没有主动向公网上的主机建立连接的话,NAT路由器中就没有建立好子网IP+端口号与公网IP+端口号的对应关系。公网上的主机主动向子网内的机器发送连接时,NAT路由器就不能通过转换表将请求数据包传达到对应的子网内主机上。
- 转换表的生成和销毁都需要额外开销。
- 通信过程中一旦NAT设备异常, 即使存在热备, 所有的TCP连接也都会断开。NAT路由器作为子网主机与公网上的机器通信的桥梁,若NAT路由器异常,就不能进行正常通信。
实际上,NAT可以作为子网主机与公网上的机器通信的桥梁,那么也存在子网主机实际上是与另一个子网内的主机在通信,部署在公网上的设备实际上是两台NAT路由器罢了。通过NAT路由器将子网的主机暴露在公网上,可以当作云服务器使用,这种方法称为"内网穿透"。
代理服务器
代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。
正向代理
正向代理,指的是一台处于客户端和目标服务器之间的代理服务器,客户端不会直接访问目标服务器,而是先访问代理服务器,然后由代理服务器替客户端对目标服务器进行访问,并由代理服务器将目标服务器的响应转发回给客户端。
例如校园网,在宿舍内电脑通过校园网访问网上资源,实际上是学校的正向代理服务器代替电脑去对公网上的服务器发送资源申请,然后由代理服务器将资源返回给电脑。公网上的服务器并不认识宿舍的电脑IP地址。
正向代理的特点:
- 由于代理服务器是替客户端对目标服务器进行访问,那么目标服务器只能看到代理服务器的IP地址,隐藏了客户端的真实身份和位置。
- 当多个客户端需要对指定目标服务器的某个资源进行访问时,代理服务器会将该资源缓存在服务器中,客户端只需要对代理服务器访问就能拿到资源,无需再对目标服务器进行发起请求。
反向代理
反向代理,也指的是一台处于客户端和目标服务器之间的代理服务器,客户端对目标服务器进行访问,实际上是对反向代理服务器进行访问,由反向代理服务器对目标服务器进行资源申请,然后将资源返回给客户端。
例如WWW.baidu.com
,该百度官网实际上是反向代理服务器,我们对百度官网进行资源申请,实际上是由该代理服务器针对不同的资源将客户端的请求分发给内部的服务器,然后由该代理服务器返回客户端相应的资源,我们并不知道内部服务器的IP地址。
反向代理的特点:
- 由于客户端是直接访问的反向代理服务器,那么客户端只能看到反向代理服务器的IP地址,隐藏了目标服务器的真实身份和位置。
反向代理的优点:
- 反向代理常见的应用场景包括:负载均衡、高可用性、缓存和加速、安全过滤和防护等。它可以提供可靠的请求分发、保护内部服务器、优化性能并增加安全性。
- 反向代理常用于Web应用部署中,将客户端的请求分发给多个内部服务器,以实现负载均衡和高可用性。
NAT和代理服务器
路由器往往都具备NAT设备的功能, 通过NAT设备进行中转, 完成子网设备和其他子网设备的通信过程。
代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给目标服务器。服务器返回结果后,代理服务器又把结果转发给客户端。
么NAT和代理服务器的区别
- 从应用上讲,NAT设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器。
- 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换,代理服务器往往工作在应用层。
- 从使用范围上讲,NAT一般在局域网的出口部署,代理服务器可以在局域网做、在广域网做,还可以跨网。
- 从部署位置上看, NAT一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
最后作者在这里祝福大家1024节快乐!前途似锦,未来可期!