面对这个古老典型的笔面试问题,考虑比较周全的人会从键盘按下开始,从键盘电路开始回答,但是题目的本质是在考察网络的基础知识,所以一切都围绕着网络的知识才是最合理的。
下面对细节过程做一个总结:
1、回车键按下后,浏览器会对输入的地址数据进行解析:
1.1、检查输入的URL是http协议,请求资源是对应主机名网站主页。 1.2、然后检查浏览器的严格安全传输列表( HSTS列表 ),如果网站在列表中,则浏览器直接使用https协议进行传输,否则直接使用http协议传输,或者先使用http协议向网站服务器发送一个请求,服务器返回浏览器只能以https协议进行,则接下来仍然只以https协议来进行传输。 1.3、然后检查输入地址中是否有非ASCII码的unicode字符,如果有的话进行字符转换。 1.4、当协议或主机名不合法时,浏览器会将地址栏中输入的内容传递给默认的搜索引擎。2、然后进行DNS递归查询
2.1、DNS查询过程中,首先在缓存中进行查询,找到直接返回结果否则 2.2、再使用gethostbynme库函数进行查询,库函数查询过程中,首先到hosts中进行检查,查看域名是否在本地hosts文件中,找到直接返回结果,如果没有记录且库函数查询也没有记录则 2.3、以上查询均未果,则会向DNS服务器发送一条DNS查询请求。查询DNS服务器通常是在本地路由器或者ISP的缓存DNS服务器上进行,如果对应记录存在,则返回该映射地址,并且该地址会被标记为非权威服务器应答标签,如果对应记录不存在,则会递归向高层 DNS 服务器做查询,直到返回最终结果。 2.4、如果DNS查询失败,则返回无法解析DNS地址,停止,否则浏览器根据查询到的对应ip地址进行下一步操作,即使用套接字进行数据访问。3、使用套接字进行数据访问
3.1、浏览器获得目标IP地址,以及URL中给出的端口号(http 协议默认端口号是 80, https 默认端口号是 443),调用系统库函数socket,请求一个TCP流套接字。 3.2、该请求首先被交给传输层,封装成TCP segment,然后被送往网络层,添加目标服务器IP地址以及本机的IP地址,封装成TCP packet,再接下来会进入链路层,在封包中加入frame头部,包含本机网卡的MAC地址和网关MAC地址等,形成最终的TCP封包。 3.3、TCP封包完成之后,会通过以太网等网络进行传输到目标地址。4、建立TCP连接
建立TCP连接会进行三次握手的过程,然后进行发送HTTP请求过程和接收过程。 4.1、进行三次握手,首先向服务器发送一个syn报文,其中syn=1,seq number=1022(随机); 4.2、服务器接收到syn报文,根据syn=1判断客户端请求建立连接,并返回一个syn报文,为第一次握手,其中ack number=1023(客户端seq number+1),seq number=2032(随机),syn=1,ack=1; 4.3、客户端根据服务器的syn报文,确认其ack number是否与上一次发送的seq number+1相等,且ack=1,确认正确,则回应一个ack报文,为第二次握手,即ack number=2033(服务器seq number+1),ack=1, 4.4、服务器根据接收到的ack报文,确认ack number是否与上一次发送的seq number+1相等,并且ack=1,确认正确,则建立连接,进入Established状态,为第三次握手。 4.5、建立TCP连接后,会使用HTTP协议发送HTTP的GET请求,服务器处理请求返回资源数据。5、浏览器处理数据
5.1、再接收到所请求的资源之后,浏览器会对接收到的html、css、js等数据根据标准格式进行解析。 5.2、然后会通过构建和遍历DOM节点树,进行各个节点的渲染计算,最后进行GPU的渲染布局和绘制步骤等。这大致是一个以网络内容为核心的整体的处理过程。