本篇博客主要说明如下几个问题: 1、什么是域名?什么是URL?两者有什么关系? 2、域名是如何转换成IP地址? 3、浏览器是怎么访问一个网站的?
域名是分等级的,一般分为:主机名.二级域名.顶级域名.。注意,最后有一个点代表的是根域,是所有域的起点。常见的域名有www.google.com、www.baidu.com等。
顶级域名TLD(Top Level Domain)
- 国家顶级域名 nTLD: .cn 表示中国,.us 表示美国,.uk 表示英国,等等。
- 通用顶级域名 gTLD:.com (公司和企业),.net (网络服务机构),.org (非赢利性组织),.edu (美国专用的教育机构),.gov (美国专用的政府部门),.mil (美国专用的军事部门),.int(国际组织)。(最早的顶级域名)
- 基础结构域名(infrastructure domain):这种顶级域名只有一个,即 arpa,用于反向域名解析,因此又称为反向域名。
顶级域名的管理服务由对应的域名注册管理机构(域名注册局)负责,注册服务通常由域名注册商负责。
当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。
比如http://mail.163.com/index.html
- http://:这个是协议,也就是HTTP超文本传输协议,也就是网页在网上传输的协议。
- mail:这个是服务器名或主机名(host),代表着是一个邮箱服务器,所以是mail.,常见www.baidu.com中,www是服务器名。主机名又称为“三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
- 163.com:com是顶级域名、163是二级域名。
- mail.163.com:这是一个域名,真正的域名是mail.163.com.root,简写为mail.163.com.(注意最后由个点)。因此,根域名.root对于所有域名都是一样的,所以平时是省略的。
- /:这个是根目录,也就是说,通过域名找到服务器,然后需要知道访问该服务器下的哪个目录,这里的根目录并不是服务器的根目录下,具体的目录是服务器的配置文件决定,由配置文件完成对URL中的根目录与服务器目录的映射。
- index.html:这个是根目录下的默认网页,有时候输入http://mail.163.com/,服务器会在自己的目录下寻找默认的网页,一般是index.html(163默认网页是否是这个不清楚)。
- http://mail.163.com/index.html:这个叫做URL,统一资源定位器,全球性地址,用于定位网上的资源。
所以域名是URL的一部分。
DNS(Domain Name Server,域名服务器) 是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。将域名解析为IP的称为正向解析,将IP解析为域名的称为反向域名解析。 (思考:知道IP地址,那端口号怎么知道?端口号80)
DNS 使用 TCP 和 UDP 端口 53。 DNS 是一个应用层协议。
Linux下搭建DNS 服务器
域名与IP之间的对应关系,称为"记录(record)"。根据使用场景,"记录"可以分成不同的类型(type),常见的资源记录类型有:
- NS 记录: 域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
- MX 记录: 邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。
- A 记录: 地址记录(Address),返回域名指向的IPv4地址。DNS里用得最多的记录。
- AAAA 记录: 地址记录(Address),返回域名指向的 IPv6 地址记录。
- CNAME: 规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转。
- PTR 记录: 逆向查询记录(Pointer Record),PTR记录用于定义与 IP地址相关联的名称。PTR 记录是A或AAAA记录的逆。 PTR记录是唯一的,因为它们以 .arpa根开始并被委派给IP地址的所有者。
每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。
主机名到 IP 地址的映射有两种方式:
-
静态映射:在本机上配置域名和 IP 的映射,旨在本机上使用。Windows 和 Linux 的 hosts 文件中的内容就属于静态映射。
-
动态映射:建立一套域名解析系统(DNS),只在专门的 DNS 服务器上配置主机到 IP 地址的映射,网络上需要使用主机名通信的设备,首先需要到 DNS 服务器查询主机所对应的 IP 地址。
通过域名去查询域名服务器,得到 IP 地址的过程叫做域名解析。在解析域名时,一般先静态域名解析,再动态解析域名。可以将一些常用的域名放入静态域名解析表中,这样可以大大提高域名解析效率。
有DNS的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。 DNS查询顺序:浏览器缓存→系统缓存→路由器缓存→ISP DNS 缓存→迭代搜索
主机向本地域名服务器的查询一般都是采用递归查询。 本地域名服务器向根域名服务器的查询通常是采用迭代查询。
上图展示了一个域名解析的流程,步骤如下, 首先进行静态域名解析:
- 用户打开 Web 浏览器,在地址栏中输入 www.163.com,然后按 Enter 键。
- 浏览器先检查自身缓存中有是否解析过这个域名对应的ip地址,如果有,解析结束。 查看浏览器中的域名解析缓存结果:chrome://net-internals/#dns(该命令行针对于chrome浏览器,只需要复制粘贴到Chrome的地址栏,回车即可)。 浏览器的DNS缓存查看和清除
- 如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts文件(c:windowssystem32driversetc)来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。在Linux中可以通过 /etc/hosts 文件来设置。 在windows操作系统下,可通过ipconfig /displaydns命令进行查看本地的缓存的DNS域名解析的结果。(该缓存中包含,hosts文件中的信息。当断网后,该缓存中的信息就是hosts文件中的信息。)
如果静态域名解析未命中,则需要进行动态域名解析。
再进行动态域名解析:
- 如果至此还没有命中域名,将解析请求路由到本地域名服务器(LDNS) 来解析这个域名,该过程为上图中的step1。这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。这一般由用户的 Internet 服务提供商 (ISP) 进行管理,例如有线 Internet服务提供商、DSL宽带提供商或公司网络。
- 如果LDNS仍然没有命中,则LDNS将域名解析请求发送给根域名服务器解析,开启迭代搜索。根域名服务器的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。
- 根域名服务器接受请求并返回给LDNS一个顶级域名服务器地址(该例中域名是以.com作为顶级域名,所以返回的地址是.com域服务器的IP地址)。
- 根据上一步返回的地址信息,LDNS发送解析请求给顶级域名服务器。
- 顶级域名服务器接受请求并返回给LDNS一个这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器(163.com域服务器)。
- 根据上一步返回的地址信息,LDNS发送解析请求给Name Server注册的域名服务器。
- 163.com域服务器通过查询得知www服务器对应的ip地址,返回该域名对应的IP和TTL值给LDNS,LDNS缓存这个域名和IP地址,缓存时间由TTL值控制。
- LDNS将IP地址返回给网络客户端,用户根据TTL值缓存在本地系统,域名解析过程结束。
DNS服务器根据域名的层级,进行分级查询。 dig - DNS lookup utility(DNS查找工具),可以显示整个查询过程。
上面的命令会输出六段信息: 第一段是查询参数和统计:
- 第一行:dig程序的版本号和查询的域名。
- 第二行:表示可以在命令后面加选项。
- 第三行:表示以下是获取信息的内容。
- 第四行:这是返回信息的头部。 opcode(操作码):QUERY(代表是查询操作); status有四种状态:NXDOMAIN( 否定回答,不存在此记录)、NOERROR(没有错误,查询成功)、REFUSED(DNS服务器拒绝回答,记录未生效) 以及SERFAIL(DNS服务器停机或DNSsec响应验证失败); id:编号,在DNS协议中,通过编号匹配返回和查询。
- 第五行:flags:标志; qr:query 查询标志,代表这是查询操作; rd:recursion desired,代表希望进行递归查询操作; ra:recursion available 在返回中设置,代表查询的服务器支持递归查询操作; aa:authoritative answer 权威回复,如果查询结果是由管理域名的域名服务器而不是缓存服务器提供的,则称为权威回复; QUERY:1表示查询数,对应下面的QUESTION SECTION:的记录数; ANSER:4表示4个查询结果,对应下面的ANSWER SECTION:的记录数; AUTHORITY:4表示4个权威域名服务器记录数,代表该域名有4个权威域名服务器,可供域名解析用,对应下面的AUTHORITY SECTION:的记录数; ADDITIONAL:4表示4个额外记录数,表示权威域名服务器的所有IP地址,对应下面的ADDITIonAL SECTION:的记录数。
- 第一行:向DNS请求的问题(请求部分)。
- 第二行:查询域名math.stackexchange.com.的A记录。
- 第一行:得到问题的答案(回应部分)。
- 第一列:查询的域名。
- 第二列:TTL缓存时间,表示缓存域名服务器可以在缓存中保存多少秒该记录。
- 第三列:class要查询信息的类别,IN代表类别为internet。
- 第四列:TYPE要查询的记录类型。
- 第五列:VALUE域名对应的A的值,即IP地址。
- 第一行:权威域名部分,即哪些服务器负责管理stackexchange.com的DNS记录,上面结果显示stackexchange.com共有四条NS记录,即四个域名服务器。
- 第一列:NAME域名。
- 第二列:TTL缓存时间。
- 第三列:class要查询信息的类别,IN代表类别为internet。
- 第四列:TYPE要查询的记录类型。
- 第五列:VALUE域名对应的权威域名解析服务器,即域名。
- 第一行:权威ns服务器的所有IP地址(额外记录部分)。
- 第一列:NAME域名。
- 第二列:TTL缓存时间。
- 第三列:class要查询信息的类别,IN代表类别为internet。
- 第四列:TYPE要查询的记录类型。
- 第五列:VALUE域名对应的A的值,即IP地址。
- 第一行:查询耗时。
- 第二行:查询使用的服务器地址和端口,其实就是本地配置的DNS域名服务器。
- 第三行:查询的时间。
- 第四行:回应的大小,收到305个字节。
如果不想看到这么多内容:
1、分级查询:
- 第一部分收到的receive,来自系统指定的DNS域名服务器(192.168.72.2)。根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问.com的NS记录。
- 第二部分收到的receive,来自192.58.128.30(dig -x 192.58.128.30命令查看,域名:j.root-servers.net.)。上面结果显示.com域名的13条NS记录,同时返回的还有每一条记录对应的IP地址。DNS服务器向这些IP地址发出查询请求,询问stackexchange.com的NS记录。(全球13台根域名服务器的 IP 地址 )
- 第三部分收到的receive,来自192.55.83.30(域名:m.gtld-servers.net.)。上面结果显示stackexchange.com域名的4条记录,同时返回的还有每一条记录对应的IP地址。然后,DNS服务器向这些IP地址发出查询请求,询问math.stackexchange.com的A记录。
- 第四部分收到的receive,来自216.239.34.109(域名:ns-cloud-d2.googledomains.com.)。上面结果显示math.stackexchange.com有四条A记录,即这四个IP地址都可以访问到网站。
dig命令无法找到IP地址,返回一条SOA记录。
2、指定向DNS服务器8.8.8.8查询:
从中可知,根域名服务器的NS记录来自IP地址为8.8.8.8的DNS域名服务器,这13条NS记录是13台根域名服务器。根域名服务器的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面,这也是为什么13条记录信息不是来自根域名服务器而是来自IP地址8.8.8.8(google DNS服务器)。
3、IP地址反查域名:
nslookup有交互式和非交互式两种使用方式如下图:
host命令可以看作dig命令的简化版本,返回当前请求域名的各种记录。 host命令也可以用于逆向查询,即从IP地址查询域名,等同于dig -x 。
万维网的操作过程:首先是域名解析,然后http访问
- 浏览器分析超链接指向页面的URL。
- 浏览器向DNS请求解析网站名www.tsinghua.edu.cn的IP地址。
- 域名服务器DNS解析出清华大学服务器的IP地址。
- 浏览器与服务器建立TCP连接。
- 浏览器发出取文件命令:GET /chn/yxsz/index.html
- 服务器给出响应,把文件index.html发送给浏览器。
- TCP连接释放。
- 浏览器通过渲染,显示文件index.html中的所有文本。