域名系统DNS是互联网的一项服务。它作为将域名IP地址相互映射的一个分布式数据库。比如:

域名如:alibaba.com (URL地址)
IP地址为:xx.233.xxs.12 (访问)

首先,第一步浏览器会请求DNS返回域名对应的IP,浏览器还提供了DNS数据缓存服务,如果某个域名已经被解析过了,浏览器就会缓存解析的结构,下次查询时直接使用,减少一次网络请求。

拿到IP后,就需要获取端口号,如果url没有明确指出端口号,HTTP协议默认是80端口。

在实际情况中,因为用户和服务器之间存在代理服务器比如nginx,这个解析到的域名一般是代理服务器的 IP地址(或者IP地址 :80端口 ),代理服务再去转发请求到真正的业务服务器,业务服务器和IP和端口号就跟访问的域名没啥关系了。

1.背景介绍

当我们把项目部署到自己的服务器上以后,一般可以通过两种形式访问项目,一种是ip+端口号,还有一种是域名访问.

那么这两种访问项目的方式的区别是什么呢?哪一种更好一些?IP,域名,端口号之间有什么联系呢?

2.知识剖析

IP,域名,端口号的基本概念

(1) IP

IP,(英语:Internet Protocol Address,又译为网际协议地址),缩写为IP地址(英语:IP Address),是分配给网络上使用IP协议的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类。目前我们使用的都是IPv4的地址,IPv4地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式表现。(以上参考于维基百科)

通俗点说就是IP地址是用于标识出网络上的每一台主机的编号。有这个编号,网络上的其他主机才能在互联网浩若繁星的主机中定位到唯一的一台主机。

(2)域名

域名,(英语:domain name),是由一串用“点”分隔的字符组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。域名按域名系统(DNS)的规则流程组成。在DNS中注册的任何名称都是域名。域名用于各种网络环境和应用程序特定的命名和寻址目的。(以上参考于维基百科)

域名和IP地址之间有区别也有联系,域名通常会和IP进行绑定,通过访问域名来访问网络上的主机的服务。IP地址通常指的是网络中的主机,而域名则通常表示一个网站,一个域名可以绑定到多个ip上,多个域名也可以绑定到一个ip上。

(3)端口号

端口,(英语:port),主要分为物理端口和逻辑端口。我们一般说的都是逻辑端口,用于区分不同的服务。因为网络中一台主机只有一个IP,但是一个主机可以提供多个服务,端口号就用于区分一个主机上的不同服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,标识是从0~65535.(以上参考于维基百科)

端口号分为公认端口(01023)、注册端口(102449151)和动态端口(49152~65535)。我们自己的服务一般都绑定在注册端口上。

3.常见问题及解决方案

(1)域名和端口号是怎么对应起来的?

客户端输入域名,通过DNS将域名解析成为服务器ip,找到代理服务器,因为http协议服务所占用的端口默认为80端口,所以会访问服务器的80端口,然后再通过代理服务器将请求转发到不同的服务器以及端口中.如图:域名和端口号的对应

ingress域名映射应该填那个ip 域名映射ip和端口_DNS

(2)应该通过域名访问项目吗?

答案是必须的。

如果用IP+端口号的方式访问,会有以下后果:

首先,非常难记,域名是对人友好的有含义的字符,而ip都是4组基本无规律的数字,对人不友好.

其次, 如果服务器中的资源发生迁移,那么原先的服务器ip地址就无效了,必须要重新使用新的ip地址访问服务器,用户还要再去记忆一遍IP地址。但是如果是使用域名则不存在这个问题.

最后, 不安全,通过ip直接访问服务器是非常危险的,相当于将整个服务器的大门向所有人打开,造成的后果是别有用心的人能够非常容易攻击到服务器.域名访问就能杜绝这种情况,用户是不知道服务器的IP地址的,而且就算有人通过域名恶意攻击,直接和用户交互的代理服务器也可以保护内容服务器。这样就算代理服务器被攻破,损失也相对较小。

(3)从域名服务商到服务器的流程是怎么样的?

个人理解就是域名解析过程。该过程如下图

ingress域名映射应该填那个ip 域名映射ip和端口_ingress域名映射应该填那个ip_02

4.扩展思考

DNS的查询方式有几种?

有两种,递归查询和迭代查询

递归查询是一次查询就得到最终的结果.通常是主机到DNS服务器之间的查询方式

迭代寻址是有可能发生多次请求,并且每次得到的结果有可能只是参考答案.DNS服务器会使用迭代查询

5. 补充URI URL

我理解的URL = domain(主机号) + URI。
之前做的少儿英语,比如发送请求:kids-ms-server-api/admin/role/getRoleList

request.getURL 得到的是:*kids-ms-server-api/admin/role/getRoleList
 request.getDomain 得到的是:kids-ms-server-api
 request.getURI 得到:admin/role/getRoleList (controller里的相对路径)