应用层—DNS
本文最后更新于 2025-03-24,文章超过7天没更新,应该是已完结了~
域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成(此处以IPv4的地址为例,IPv6的地址同理),记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。
域名的构成
域名是指为了识别主机名称和组织机构名称而采用的一种具有分层的名称。例如,华中科技大学的域名如下:hust.edu.cn 最左边的 hust 表示华中科技大学,edu表示教育机构,cn表示中国。dns的分层如下图所示:
① 各个域的分层上都有各自的域名服务器
②各层域名服务器都了解该层以下分层中所有域名服务器的IP地址。因此它们从根节点开始呈树状结构相互连接。
③由于所有域名服务器都了解根域名服务器的IP地址,所以若从根开始按顺序追踪,可以访问世界上所有域名服务器的地址。
DNS查询
域名的查询过程注意两点:
①主机向本地域名服务器的查询采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向根域名服务器继续发出查询请求报文,而不是让主机自己进行下一步查询。因此,递归查询返回的结果或者是要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
②本地域名服务器向根域名服务器的查询通常采用迭代查询。迭代查询的特点是这样的:当根域名服务器收到本地域名服务器发出的迭代查询请求报文是,要么给出所要查询的IP地址,要么告诉域名服务器下一步要向哪个域名服务器进行查询。然后本地域名服务器继续进行下一步查询。
输入网址回车发生的事情
一、URL解析
1.当我们在输入网址时,浏览器其实就已经在智能匹配可能的url ,它会从历史记录,书签等地方,找到 已经输入的字符串对应的url,然后给出智能提示,让你补全url地址。
2.浏览器对用户输入的网址做初步的格式化检查,只有通过检查才会进行下一步。
3.浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。
4.检查缓存
二、DNS查询
1.请求一旦发起,浏览器首先要解析这个域名。
检查浏览器的缓存
再查查本地硬盘的hosts文件
检查路由器缓存
先查查自己内存的DNS Cache
实在没办法,本地 DNS 服务器会将请求转发到互联网上的根域,下面这个图很好的诠释了整个流程:
三、TCP连接
TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装;每一层都呼叫它的下一层所提供的协议来完成自己的需求
1. 应用层:发送 HTTP 请求
在前面的步骤我们已经得到服务器的 IP 地址,浏览器会开始构造一个 HTTP 报文,其中包括:
请求报头(Request Header):请求方法、目标地址、遵循的协议等等
请求主体(其他参数)
其中需要注意的点:
浏览器只能发送 GET、POST 方法,而打开网页使用的是 GET 方法
2. 传输层:TCP 传输报文
传输层会发起一条到达服务器的 TCP 连接,为了方便传输,会对数据进行分割(以报文段为单位),并标记编号,方便服务器接受时能够准确地还原报文信息。
在建立连接前,会先进行 TCP 三次握手(先通过网络层知道对方MAC地址才能握手)。
3. 网络层:IP协议查询Mac地址
将数据段打包,并加入源及目标的IP地址,并且负责寻找传输路线。
判断目标地址是否与当前地址处于同一网络中,是的话直接根据 Mac 地址发送,否则使用路由表查找下一跳地址,以及使用 ARP 协议查询它的 Mac 地址。(通过 ARP 协议,向本网络的所有机器发送(广播),接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃。接收方回应是单播。)
注意:在 OSI 参考模型中 ARP 协议位于链路层,但在 TCP/IP 中,它位于网络层。
4. 链路层:以太网协议
以太网协议
根据以太网协议将数据分为以“帧”为单位的数据包,每一帧分为两个部分:
标头:数据包的发送者、接受者、数据类型
数据:数据包具体内容
Mac 地址
以太网规定了连入网络的所有设备都必须具备“网卡”接口,数据包都是从一块网卡传递到另一块网卡,网卡的地址就是 Mac 地址。每一个 Mac 地址都是独一无二的,具备了一对一的能力。
广播
发送数据的方法很原始,直接把数据通过 ARP 协议,向本网络的所有机器发送,接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃。
注意:接收方回应是单播。
三次握手完成后,TCP阿姨和对方建立起一个可靠的虚拟通道。浏览器和服务器建立连接后,浏览器将http请求通过TCP/IP发送给这个IP地址的服务器。
这个get请求包含了主机(Host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的"代理人",Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。可能还会有Cookies,Cookies保存了用户的登陆信息,一般保存的是用户的JSESSIONID,在每次向服务器发送请求的时候会重复发送给服务器。
在建立连接发送请求时每个服务端需要和客户端保持通信,有很多客户端都会和服务器进行通信。服务器为了识别是哪个客户端与它通信,就必须用一个标识记录客户端的信息。客户端首次访问服务器,服务端返回响应时通过附带一个记录的客户端信息的标识来返回给客户端,这个标识就是JSESSIONID,JSESSIONID就放在了客户端的Cookies里。当客户端再次向服务器发送请求时上就使用上次记录的Cookies里面的JSESSIONID,这样服务器就知道是哪个浏览器了。这样他们之间就能保持通信了。
发送完请求接下来就是等待回应了,如下图:
当服务器返回响应之后,浏览器读取关于这个响应的响应头,然后开始解析这个响应并在页面上显示出来。浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分显示,直到完全显示,因此在浏览器没有完全接受全部HTML文档时,它就已经开始显示这个页面了。在浏览器显示HTML时,打开一个网页的过程中,主页页面框架传送过来后,浏览器还会因页面上的静态资源多次发次连接请求,需要获取嵌入在HTML中的其它地址的资源,这时浏览器会发送一些请求来获取这些文件。这些内容也要一点点地请求过来,这些请求的内容是主页里面包含的一些资源,如图片,视频,css样式,js文件等等,这些文件属于静态文件,首次访问会留在浏览器缓存中,过期才会从服务器去取,静态文件一般会从CDN(CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术)去取。而对于动态的请求,Nginx可能会专门设置一些服务器来处理这些访问动态页面的请求。
当数据完成请求到返回的过程之后,根据Connection的Keep-Alive属性可以选择是否断开TCP连接,HTTP/1.1一般支持同一个TCP多个请求,而不是1.0版本下的完成一次请求就发生断开。TCP的断开与连接不一样,断开可以分为主动关闭和被动关闭,需要经过4次挥手。
当浏览器需要的全部数据都已经加载完毕,一个页面就显示完了。
- 感谢你赐予我前进的力量