在浏览器中输入Google.com并且按下回车之后发生了什么?

本文试图回答一个古老的面试问题:当你在浏览器中输入google.com并且按下回车之后发生了什么?

  不过我们不再局限于平常的回答,而是想办法回答地尽可能具体,不遗漏任何细节。

  这将是一个协作的过程,所以深入挖掘吧,并且帮助我们一起完善它。仍然有大量的细节等待着你来添加,欢迎向我们发送Pull Requset!

  回车键按下

  为了从头开始,我们选择键盘上的回车键被按到最低处作为起点。在这个时刻,一个专用于回车键的电流回路被直接或者通过电容器闭合了,使得少量的电流进入了键盘的逻辑电路系统。这个系统会扫描每个键的状态,对于按键开关的电位弹跳变化进行噪音消除(debounce),并将其转化为键盘码值。在这里,回车的码值是13。键盘控制器在得到码值之后,将其编码,用于之后的传输。现在这个传输过程几乎都是通过通用串行总线(USB)或者蓝牙(Bluetooth)来进行的,以前是通过PS/2或者ADB连接进行。

  USB键盘:

  • 键盘的USB元件通过计算机上的USB接口与USB控制器相连接,USB接口中的第一号针为它提供了5V的电压

  • 键码值存储在键盘内部电路一个叫做"endpoint"的寄存器内

  • USB控制器大概每隔10ms便查询一次"endpoint"以得到存储的键码值数据,这个最短时间间隔由键盘提供

  • 键值码值通过USB串行接口引擎被转换成一个或者多个遵循低层USB协议的USB数据包

  • 这些数据包通过D+针或者D-针(中间的两个针),以最高1.5Mb/s的速度从键盘传输至计算机。速度限制是因为人机交互设备总是被声明成"低速设备"(USB 2.0 compliance)

  • 这个串行信号在计算机的USB控制器处被解码,然后被人机交互设备通用键盘驱动进行进一步解释。之后按键的码值被传输到操作系统的硬件抽象层

  虚拟键盘(触屏设备):

  • 在现代电容屏上,当用户把手指放在屏幕上时,一小部分电流从传导层的静电域经过手指传导,形成了一个回路,使得屏幕上触控的那一点电压下降,屏幕控制器产生一个中断,报告这次“点击”的坐标

  • 然后移动操作系统通知当前活跃的应用,有一个点击事件发生在它的某个GUI部件上了,现在这个部件是虚拟键盘的按钮

  • 虚拟键盘引发一个软中断,返回给OS一个“按键按下”消息

  • 这个消息又返回来向当前活跃的应用通知一个“按键按下”事件

  产生中断[非USB键盘]

  键盘在它的中断请求线(IRQ)上发送信号,信号会被中断控制器映射到一个中断向量,实际上就是一个整型数 。CPU使用中断描述符表(IDT)把中断向量映射到对应函数,这些函数被称为中断处理器,它们由操作系统内核提供。当一个中断到达时,CPU根据IDT和中断向量索引到对应的中端处理器,然后操作系统内核出场了。

  (Windows)一个 WM_KEYDOWN 消息被发往应用程序

  HID把键盘按下的事件传送给 KBDHID.sys 驱动,把HID的信号转换成一个扫描码(Scancode),这里回车的扫描码是 VK_RETURN(0x0d)。 KBDHID.sys 驱动和 KBDCLASS.sys (键盘类驱动,keyboard class driver)进行交互,这个驱动负责安全地处理所有键盘和小键盘的输入事件。之后它又去调用 Win32K.sys ,在这之前有可能把消息传递给安装的第三方键盘过滤器。这些都是发生在内核模式。

  Win32K.sys 通过 GetForegroundWindow() API函数找到当前哪个窗口是活跃的。这个API函数提供了当前浏览器的地址栏的句柄。Windows系统的"message pump"机制调用 SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam) 函数, lParam 是一个用来指示这个按键的更多信息的掩码,这些信息包括按键重复次数(这里是0),实际扫描码(可能依赖于OEM厂商,不过通常不会是 VK_RETURN ),功能键(alt, shift, ctrl)是否被按下(在这里没有),以及一些其他状态。

  Windows的 SendMessage API直接将消息添加到特定窗口句柄 hWnd 的消息队列中,之后赋给 hWnd 的主要消息处理函数 WindowProc 将会被调用,用于处理队列中的消息。

  当前活跃的句柄 hWnd 实际上是一个edit control控件,这种情况下,WindowProc 有一个用于处理 WM_KEYDOWN 消息的处理器,这段代码会查看 SendMessage 传入的第三个参数 wParam ,因为这个参数是 VK_RETURN ,于是它知道用户按下了回车键。

  (Mac OS X)一个 KeyDown NSEvent被发往应用程序

  中断信号引发了I/O Kit Kext键盘驱动的中断处理事件,驱动把信号翻译成键码值,然后传给OS X的 WindowServer 进程。然后, WindowServer 将这个事件通过Mach端口分发给合适的(活跃的,或者正在监听的)应用程序,这个信号会被放到应用程序的消息队列里。队列中的消息可以被拥有足够高权限的线程使用 mach_ipc_dispatch 函数读取到。这个过程通常是由 NSApplication 主事件循环产生并且处理的,通过 NSEventType 为 KeyDown 的 NSEvent 。

  (GNU/Linux)Xorg 服务器监听键码值

  当使用图形化的 X Server 时,X Server会按照特定的规则把键码值再一次映射,映射成扫描码。当这个映射过程完成之后, X Server 把这个按键字符发送给窗口管理器(DWM,metacity, i3等等),窗口管理器再把字符发送给当前窗口。当前窗口使用有关图形API把文字打印在输入框内。

  解析URL

  • 浏览器通过URL能够知道下面的信息:

    • Resource "/"

    • 请求的资源是主页(index)

    • Protocol "http"

    • 使用HTTP协议



  输入的是URL还是搜索的关键字?

  当协议或主机名不合法时,浏览器会将地址栏中输入的文字传给默认的搜索引擎。大部分情况下,在把文字传递给搜索引擎的时候,URL会带有特定的一串字符,用来告诉搜索引擎这次搜索来自这个特定浏览器。

  检查HSTS列表···

  • 浏览器检查自带的“预加载HSTS(HTTP严格传输安全)”列表,这个列表里包含了那些请求浏览器只使用HTTPS进行连接的网站

  • 如果网站在这个列表里,浏览器会使用HTTPS而不是HTTP协议,否则,最初的请求会使用HTTP协议发送

  • 注意,一个网站哪怕不在HSTS列表里,也可以要求浏览器对自己使用HSTS政策进行访问。浏览器向网站发出第一个HTTP请求之后,网站会返回浏览器一个响应,请求浏览器只使用HTTPS发送请求。然而,就是这第一个HTTP请求,却可能会使用户收到 downgrade attack 的威胁,这也是为什么现代浏览器都预置了HSTS列表。

  转换非ASCII的Unicode字符

  • 浏览器检查输入是否含有不是 a-z, A-Z0-9, - 或者 . 的字符

  • 这里主机名是 google.com ,所以没有非ASCII的字符,如果有的话,浏览器会对主机名部分使用 Punycode 编码

  DNS查询···

  • 浏览器检查域名是否在缓存当中

  • 如果缓存中没有,就去调用 gethostbynme 库函数(操作系统不同函数也不同)进行查询

  • gethostbyname 函数在试图进行DNS解析之前首先检查域名是否在本地Hosts里,Hosts的位置 不同的操作系统有所不同

  • 如果 gethostbyname 没有这个域名的缓存记录,也没有在 hosts 里找到,它将会向DNS 服务器发送一条DNS查询请求。DNS服务器是由网络通信栈提供的,通常是本地路由器或者ISP的缓存DNS服务器。

  • 查询本地 DNS 服务器

  • 如果DNS服务器和我们的主机在同一个子网内,系统会按照下面的 ARP 过程对 DNS 服务器进行 ARP查询

  • 如果DNS服务器和我们的主机在不同的子网,系统会按照下面的 ARP 过程对默认网关进行查询

  ARP

  要想发送ARP广播,我们需要有一个目标IP地址,同时还需要知道用于发送ARP广播的接口的Mac地址。

  • 首先查询ARP缓存,如果缓存命中,我们返回结果:目标IP = MAC

  如果缓存没有命中:

  • 查看路由表,看看目标IP地址是不是在本地路由表中的某个子网内。是的话,使用跟那个子网相连的接口,否则使用与默认网关相连的接口。

  • 查询选择的网络接口的MAC地址

  • 我们发送一个二层ARP请求:


Js 浏览量238 回复量2 关注量0 分享
0 0

good

0 0

1.DNS

在浏览器中输入URL后,首先要进行DNS解析,DNS解析的顺序为:

  • 浏览器缓存

  • 本地hosts文件

  • 系统缓存

  • 路由器缓存

  • DNS服务器迭代查询

2.发送请求

通过DNS得到目标的IP地址后,通过TCP协议向服务器发送请求即三次握手。

3.服务器永久重定向响应

大多数的网站会将用户访问的地址永久重定向,这主要与缓存和搜索排名有关。

  • 搜索排名方面:例如www.test.com与test.com搜索引擎认为是两个网站,不会将排名合并。如果使用重定向将test.com定向到www.test.com搜索引擎就会认为是一个页面将排名信息合并。

  • 缓存方面:如果使用不同的地址,在缓存中出现好几次,缓存友好性变差

4.跟踪重定向地址

根据返回新重定向地址,重新发送新的http请求

5.处理HTTP请求,返回响应

  • 建立连接:服务器允许客户端建立连接

  • 接受请求:从网络中读取HTTP报文交给Nginx或者Apache进行规则匹配

  • 处理请求:根据方法,资源,首部和可选的主体部分对请求进行处理

  • 访问资源:寻找存储对象,访问报文中指定的资源

  • 构建响应报文:创建有正确首部的HTTP响应报文

6.处理HTTP响应

  • 发送响应:将响应会送给客户端

  • 记录日志:将与已经完成的事务记录在一个日志文件中

7.浏览器解析显示

浏览器得到页面后会进行展示,如果还包含其他外部资源如图片、视频等等则继续请求其他资源。


回答 10
知识点 8
关注者 5

写回答