网址,也叫域名,域名就像一个 IP 地址的可读版本,比如,百度的域名 www.baidu.com,他的 ip 是 110.242.68.3,输入 IP 一样可以跳转到百度搜索的页面,我想没有一个人没去记百度的 IP 吧。其实我们真正访问的就是这个IP。
所以输入网址之后,实际就是将网址解析,查询 IP 地址,然后通过 IP 和端口访问到百度的网站。
解析网址
当输入到地址栏之后,首先浏览器需要对网址进行解析。
首先看一下 URL 的组成,https://www.baidu.com
首先是协议,http 或者 https,
然后 www.baidu.com 就是域名,域名可以理解为 IP 的可读版本。
再然后冒号后面的就是端口。
再后面的是资源路径,表示在服务器上的文件路径。
问号后面的是参数,参数是在发送某些请求时添加在 URL 里的。参数的格式:key=value。
最后井号后面的时锚点。
对 URL 进行解析之后,浏览器就知道了 web服务器,资源地址和资源名,根据这些内容生成 HTTP 的请求信息。
DNS获取真实地址
HTTP 请求信息为被操作系统发送到 web 服务器,但在发送之前,需要通过域名获取到真实的 IP 地址。
打个比方,我们保存联系人都是用名字来保存,很少会有人记住几十个电话号码的。但是我们需要打电话时又不能直接通过名字打电话,手机理解不了这个名字,只能理解电话号码,其实就是手机得知你要打电话,比如你要打给张三,手机查到张三的电话是 10086,然后给 10086打电话。
这里的名字和电话就是域名和 IP 的关系。要想通过域名得到对应的 IP,此时就需要 DNS 服务器了。
DNS 服务器-应用层
从大到小有 根服务器、顶级域服务器、权威服务器、本地服务器
DNS 的工作流程
-
首先客户端发出来一个 DNS 请求,想要直到 www.server.com 的 IP 地址,发送给本地 DNS 服务器。
-
本地服务器接受到请求之后,会去缓存中查找是否存在,如果有直接返回即可,如果没有,就会去问根服务器。
-
根服务器接到请求之后,发现后缀域名是 .com,说你去问问 .com 的顶级域服务器,看看他有没有这个 IP
-
本地服务器拿着请求找到顶级域服务器,询问是否有该域名的 IP 地址,顶级域服务器也不知道,说你去问问 server.com 的权威服务器。
-
本地服务器有拿着这个域名找到权威服务器,权威服务器查询之后就把对应的 IP 告诉了本地服务器。
-
本地服务器将 IP 返回给客户端。
除了上面的迭代式的查询,还有一种递归式的查询,顺序不同,但是这样根服务器的压力会比较大。
同时,浏览器会先看是否存在缓存,如果有缓存就不用发送给本地服务器,直接返回即可。
TCP 传输数据--传输层
获取到 IP 地址后,由于 DNS 只指路不带路,所以需要一个协议栈,将 HTTP 传输工作交给协议栈,协议栈使用 TCP 和 UDP 协议来收发数据。
TCP 报文头部格式,首先有源端口号和目标端口号,相当于导航的出发地和目的地,打车的时候司机才知道到哪接你,送你去哪,你就是数据包。
然后是序列号,主要是为了解决包的乱序问题。
还有确认号,目的是确认是否收到,确保不出现丢包的情况。
状态位,例如 SYN、ACK、RST、FIN分别是连接,应答,重新连接,断开连接。
窗口大小,主要用于流量控制,根据接收端的处理能力限制窗口流量。
值得一提的是,TCP 传输数据前需要进行三次握手建立连接,计算机网络------TCP 协议的三次握手 / 四次挥手-CSDN博客
TCP 是传输层的协议,会给应用层传下来的 HTTP 报文加上 TCP 的头部,头部包含了上面的各类信息,然后将数据包给网络层处理。
IP协议--网络层
IP 协议的主要功能就是寻址和路由,相当于导航,导航最重要的就是起点地址和目的地地址。在 IP 协议中就表现为源 IP 地址和目的地 IP 地址。
还需要记录协议号,表示使用的是 TCP 协议。当目标设备有多个网卡,就会有多个 IP 那么该怎么判断传给哪个网卡,主要是通过 路由表规则来判断,如果都不符合,就会发送给 0.0.0.0。
IP 协议给传输层传下来的 TCP 报文加上 IP 头,之后传递给网络接口层处理。
网络接口层会给 IP 数据报加上MAC头部,用来找到路由器。
最后数据通过网关,交换机,路由器,最终成功发到了服务器。
解析请求
服务器接收到了HTTP请求之后,会对请求进行解析,根据请求的内容执行相应的操作,比如数据库查询,读取文件等。
处理完一系列的请求操作后,服务端会发送 HTTP 的响应报文,客户端接收到了响应之后,同样进行解析,获取到 HTML 文件,图片等数据,然后对其进行渲染,生成网页,同时根据网页中其他的 URL 再次请求服务器,直到网页完全渲染。
最后不再传输数据后,关闭 TCP 连接,通过四次挥手的方式。
总结
-
地址栏输入 URL
-
应用层 DNS 协议解析域名的IP地址
-
网络层 TCP 协议发起连接,传输对应的 HTTP 请求报文,通过每层模型的不同的协议,生成最终的请求数据包并发送给服务器
-
服务器接收到了请求数据包后,解析请求,并进行处理,比如读取文件,查询数据库,然后生成响应的 HTTP 报文
-
浏览器接收到了响应报文之后,同样进行解析,获取其中的 HTML 文件,图片视频的 URL等,然后将这些渲染到页面上,同时根据获取到的图片视频等的 URL 再次请求服务器,直到所有 URL 都解析完成,然后将页面所有内容都渲染完毕。
-
结束数据传输可以断开 TCP 的连接。