博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[基础技能] 网络技术——当在浏览器中输入一个网址并按下回车后发生的事情...
阅读量:5285 次
发布时间:2019-06-14

本文共 1755 字,大约阅读时间需要 5 分钟。

面对这个古老典型的笔面试问题,考虑比较周全的人会从键盘按下开始,从键盘电路开始回答,但是题目的本质是在考察网络的基础知识,所以一切都围绕着网络的知识才是最合理的。

 

下面对细节过程做一个总结:

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的渲染布局和绘制步骤等。

 这大致是一个以网络内容为核心的整体的处理过程。

 

转载于:https://www.cnblogs.com/yushuo1990/p/5984232.html

你可能感兴趣的文章
android:scaleType属性
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Linux中防火墙centos
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
css & input type & search icon
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
MetaWeblog API Test
查看>>
c# 文件笔记
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>