整体大概流程
域名解析->发起TCP的三次握手->建立TCP连接后发起http请求->服务器响应http请求,浏览器得到html代码->浏览器解析html代码,并请求html代码中的资源->浏览器对页面进行渲染呈现给用户
首先,你在浏览器里输入一个地址之后
1.解析URL
首先浏览器会检测这个url是否正确存在,如果不合法,将会返回一个默认的搜索引擎。
如果存在并合法,那么可以解析得到协议(http或者https)、域名(baidu)、资源(首页)等信息。
2.DNS解析
浏览器要将你输入的URL解析为IP地址,浏览器先从浏览器缓存中去找,如果没找到就去本机hosts文件中找,如果没有就去路由器缓存中找, 如果还是没有就去ISP DNS缓存寻找,要是还是没找到,浏览器就从根域名服务器开始递归查找,到顶级域名服务器到下层域名服务器,直到找到
3.建立TCP连接后发起http请求
找到IP地址后,就要对这个IP地址发起TCP三次握手连接了,这时候浏览器获得了目标服务器的IP(DNS返回)、端口(URL中包含,没有就使用默认(HTTP默认80端口)),浏览器会调用库函数socket,生成一个TCP流套接字,也就是完成了TCP的封包,网络层再对其进行封装IP数据报,在链路层根据其大小是否大MTU,如果大于,因为是TCP连接,所以在和对端第一次进行握手时确认MTU大小,取其较小值,封装成以太网帧,这个请求到达服务端后,经过路由器,经过网卡,然后进入到内核TCP/IP协议栈,一层层的剥开封装,最终到达WEB程序,建立连接
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复
2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认
3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了
4.服务器接收请求并根据请求方法返回响应
HTTP有很多请求方法,比如:GET / POST / PUT / DELETE / HEAD等等,我们浏览器输入URL这种,是GET方法。
服务器接收到GET请求,服务器根据请求信息,获得相应的相应内容。例如我们输入的是https://www.baidu.com/,那么意味着访问百度的首页文件
5.浏览器解析并渲染
浏览器从服务器拿到了想要访问的资源,大多数时候,这个资源就是HTML页面,当然也可能是一个其他类型的文件。
浏览器先对HTML文档进行解析,生成解析树(以DOM元素为节点的树)。
加载页面的外部资源,比如JS、CSS、图片。
遍历DOM树,并计算每个节点的样式,最终完成渲染,变成我们看到的页面。
1. DNS 解析:浏览器查询 DNS,获取域名对应的 IP 地址:具体过程包括浏览器搜索自身的 DNS 缓存、搜索操作系统的 DNS 缓存、读取本地的 Host 文件和向本地 DNS 服务器进行查询等。对于向本地 DNS 服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地 DNS 服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个 IP 地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
2. TCP 连接:浏览器获得域名对应的 IP 地址以后,浏览器向服务器请求建立链接,发起三次握手;
3. 发送 HTTP 请求:TCP 连接建立起来后,浏览器向服务器发送 HTTP 请求;
4. 服务器处理请求并返回 HTTP 报文:服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
5. 浏览器解析渲染页面:浏览器解析并渲染视图,若遇到对 js 文件、css 文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
6. 连接结束。