java面试(二)---浏览器输入域名获取信息的过程
- 什么是HTTP协议:
HTTP是一个无连接的超文本协议,它允许将HTML文本从服务器发送给浏览器。
输入域名得到资源的过程有以下步骤:
- 输入域名通过dns解析得到服务器的ip地址
- 通过返回的IP地址访问服务器
- 向服务器发出tcp连接请求
- 服务器把含资源的HTML返回给浏览器
- 浏览器通过解析HTML渲染得到资源页面
以下是步骤的详细解答:
- 客户端得到域名,首先查找本机的域名高速缓存,如在自己本机则直接得到IP,否则访问本地的dns服务器,如果本地服务器也无法得到,则向根域名服务器发出访问,根域名服务器可以告诉本地服务器应该去那个顶级域名服务器访问,之后通过一层层的回复,最后得到ip地址或者返回一个查询不到。
现在常用的dns解析一般采用的都是迭代查询。可以减轻服务器的压力。
- 浏览器向服务器发送tcp链接请求
浏览器A向服务器B发送一个tcp链接请求,A请求中包含的数据有syn(同步序列编号)=j,并进入到SYN_SEND状态。
服务器B接受请求后,向浏览器发送一个对A的SYN确认的一个ACK消息=j+1,并且发送一个自己的SYN=k的同步***,进入到SYN_RECV状态。
浏览器A接受B的SYN_ACK消息后,发送一个自己的ACK=k+1,的确认信号,进入到TCP链接完成状态established。此时TCP链接建立完成。 - 服务器把资源发送给客户端后断开TCP链接。
由于TCP链接是全双工的,使用链接双方都需要发送一个fin后才能结束,如果是服务器发送资源完毕后,发送一个fin之后,客户端依旧可以发送请求,只有当客户端也发送了一个fin之后请求才被拒绝。
此处假设发送中断的是客户端
客户端发送一个fin完成信号,和结束的序号seq=u给服务器。进入到FIN_Wait
服务器接受到客户端得完成信号,但自己的资源发送还未完成,则发送一个ack=u+1,一自己的seq=v,并发一个ACk表示自己尚未完成,进入到close_wait.
客户端接受到信息后进入fin_wait,等待服务器发送fin。
服务器完成工作后,发送一个fin,ack=u+1,seq=w的信号,表示完成。
客户端表示收到发送一个Ack=w+1,的确认,之后等待2秒,如果没有收到重传信号,则算是TCP链接断开。 - 客户端对收到的HTML页面进行渲染。
-
解析html页面如果遇到需要请求外部资源
-
加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。遇到图片资源,浏览器也会另发出一个请求,来获取图片资源。这是异步请求,并不会影响html文档进行加载。
但是当文档加载过程中遇到js文件,html文档会挂起渲染的线程,不仅要等待文档中的js文件加载完毕,还要等待解析执行完毕,才能恢复html文档的渲染线程。