当你输入谷歌时会发生什么。进入浏览器,然后按enter?

2022-02-17 03:12:06

这个知识库试图回答一个由来已久的面试问题#34;当你输入谷歌时会发生什么。进入你的浏览器';s地址框,然后按Enter"

除了通常的故事,我们';我们将尽可能详细地回答这个问题。任何事都不能漏掉。

这是一个协作的过程,所以请深入挖掘并尝试帮助!有一些细节缺失,只是在等待你添加它们!所以请给我们发一个请求!

读读这篇文章简体中文 (简体中文),日本語 (日语),한국어(韩语)和西班牙语。注:alex未对这些进行审查/维护时会发生什么。

以下部分解释了物理键盘操作和操作系统中断。当你按下";g";浏览器接收事件和自动完成功能。取决于你的浏览器';s算法,如果您处于私密/匿名模式或没有,各种建议将在URL栏下方的下拉列表中呈现给您。这些算法大多基于搜索历史、书签、cookie和整个互联网上的热门搜索对结果进行排序和排序。当你输入";谷歌。com";许多代码块会运行,建议会随着每次按键而细化。它甚至可能暗示";谷歌。com";在你完成打字之前。

要选择一个零点,让';s选择键盘上的Enter键,点击其范围的底部。此时,特定于enterkey的电路闭合(直接或电容)。这允许少量电流流入键盘的逻辑电路,该电路扫描每个按键开关的状态,消除开关快速间歇性闭合的电气噪声,并将其转换为按键代码整数,在本例中为13。然后,键盘控制器对键盘代码进行编码,以便传输到计算机。现在,这几乎普遍通过通用串行总线(USB)或蓝牙连接实现,但历史上一直通过PS/2或ADB连接实现。

键盘的USB电路由计算机提供的5V电源供电';USB主机控制器。

主机USB控制器轮询";终点#34;每隔10毫秒(键盘声明的最小值),它就会获得存储在键盘上的键码值。

该值将传输至USB SIE(串行接口引擎),以便在一个或多个遵循低级USB协议的USB数据包中进行转换。

这些数据包通过差分电信号通过D+和D-引脚(中间2)以1.5 Mb/s的最大速度发送,因为HID(人机界面设备)设备总是被声明为a";低速装置";(符合USB 2.0标准)。

然后在计算机上对该串行信号进行解码';主机USB控制器,并由计算机#39;s人机界面设备(HID)通用键盘设备驱动程序。然后键的值被传递到操作系统';硬件抽象层。

当用户将手指放在现代电容式触摸屏上时,几乎所有的电流都会传输到手指上。这就完成了通过导电层静电场的电路,并在屏幕上的该点产生电压降。然后,屏幕控制器触发一个中断,报告按键的坐标。

然后,移动操作系统将其GUI元素之一(现在是虚拟键盘应用程序按钮)中的按下事件通知当前关注的应用程序。

虚拟键盘现在可以引发软件中断,以发送';按键';消息返回操作系统。

键盘在其中断请求行(IRQ)上发送信号,中断控制器将其映射为中断向量(整数)。CPU使用中断描述符表(IDT)将中断向量映射到内核提供的函数(中断处理程序)。当中断到达时,CPU用中断向量对IDT进行索引,并运行相应的处理程序。这样,就进入了内核。

HID传输将按键向下事件传递给KBDHID。将HID使用转换为扫描码的sys驱动程序。在这种情况下,扫描代码为VK_RETURN(0x0D)。KBDHID。sys驱动程序与KBDCLASS接口。sys(键盘类驱动程序)。该驱动程序负责以安全的方式处理所有键盘和小键盘输入。然后调用Win32K。sys(可能通过安装的第三方主板过滤器传递消息后)。这一切都发生在内核模式下。

Win32K。sys通过getForeGroundIndow()API确定哪个窗口是活动窗口。这个API提供了浏览器的窗口句柄#39;s的地址框。主窗口";信息泵";然后调用SendMessage(hWnd、WM_KEYDOWN、VK_RETURN、lParam)。lParam是一个位掩码,表示有关按键的进一步信息:重复计数(在本例中为0)、实际扫描代码(可能取决于OEM,但通常在VK#U返回之前不会出现),是否也按下了扩展键(例如alt、shift、ctrl)(它们没有出现)以及其他一些状态。

Windows SendMessage API是一个简单的函数,它将消息添加到特定窗口句柄(hWnd)的队列中。随后,调用分配给hWnd的主消息处理函数(称为WindowProc),以便处理队列中的每条消息。

处于活动状态的窗口(hWnd)实际上是一个编辑控件,在本例中,WindowProc有一个用于WM_KEYDOWN消息的消息处理程序。这段代码在传递给SendMessage(wParam)的第三个参数中查找,因为它是VK_RETURN,所以知道用户已经点击了ENTERkey。

中断信号触发I/O Kit kext键盘驱动程序中的中断事件。驱动程序将信号转换为密钥代码,并将其传递给theOS X Windows Server进程。结果,Windows服务器通过其RMACH端口将事件发送到任何适当的(例如,活动或侦听)应用程序,并将其放入事件队列中。然后,具有足够权限的线程可以调用mach_ipc_dispatch函数从该队列读取事件。这通常通过NSEventType KeyDown的NSEvent通过NSApplication主事件循环发生,并由其处理。

当使用图形X服务器时,X将使用通用事件驱动程序evdev获取按键。使用X服务器特定的密钥映射和规则将密钥码重新映射到扫描码。当按下键的扫描码映射完成时,X服务器将字符发送到窗口管理器(DWM、metacity、i3等),因此窗口管理器依次将字符发送到聚焦窗口。接收字符的窗口的图形API会在相应的聚焦字段中打印相应的字体符号。

当没有提供协议或有效域名时,浏览器继续将地址框中给出的文本反馈给浏览器';默认的网络搜索引擎。在很多情况下,URL会附加一段特殊的文本,告诉搜索引擎它来自特定的浏览器#39;s的URL栏。

浏览器会检查主机名中是否有不在a-z、a-z、0-9、、、或..中的字符。。

因为主机名是google。com那里赢了';没有,但如果有,浏览器会对URL的主机名部分应用Punycode编码。

浏览器检查其";预装HST(HTTP严格传输安全)和#34;列表这是一个只要求通过HTTPS联系的网站列表。

如果网站在列表中,浏览器将通过HttpSin而不是HTTP发送其请求。否则,初始请求将通过HTTP发送。(请注意,网站仍然可以使用HSTS策略,而不在HSTS列表中。用户对网站的第一个HTTP请求将收到一个应答,请求用户只发送HTTPS请求。但是,这个HTTP请求可能会让用户容易受到降级攻击,这就是为什么HSTS列表包含在mo中。)德恩·韦伯·克鲁斯。)

浏览器检查域是否在其缓存中。(要查看罗马的DNS缓存,请转到chrome://net-internals/#dns).

如果找不到,浏览器将调用gethostbyname库函数(不同的byOS)进行查找。

gethostbyname在尝试通过DNS解析主机名之前,检查主机名是否可以通过本地主机文件(其位置因操作系统而异)中的引用解析。

如果gethostbyname没有缓存它,也无法在hostsfile中找到它,那么它会向网络堆栈中配置的DNS服务器发出请求。这通常是本地路由器或ISP';正在缓存DNS服务器。

如果DNS服务器位于同一子网上,则网络库将遵循下面针对DNS服务器的ARP过程。

如果DNS服务器位于不同的子网中,则网络库将遵循以下默认网关IP的ARP过程。

为了发送ARP(地址解析协议)广播,networkstack库需要查找目标IP地址。它还需要知道用于发送ARP广播的接口的MAC地址。

ARP缓存首先检查目标IP的ARP条目。如果它在缓存中,库函数将返回结果:Target IP=MAC。

查找路由表,查看目标IP地址是否位于本地路由表上的任何子网上。如果是,库将使用与该子网关联的接口。如果不是,库将使用包含默认网关子网的接口。

网络库发送第2层(OSI模型的数据链路层)ARP请求:

如果计算机直接连接到路由器,路由器会用ARP应答(见下文)

如果计算机连接到集线器,集线器将从所有其他端口广播ARP请求。如果路由器连接在同一个";电线";,它将以ARP回复(见下文)进行回复。

如果计算机连接到交换机,交换机将检查其localCAM/MAC表,以查看哪个端口具有我们正在寻找的MAC地址。如果交换机没有MAC地址条目,它会将ARP请求重新广播到所有其他端口。

如果交换机在MAC/CAM表中有一个条目,它会将ARP请求发送到具有我们正在寻找的MAC地址的端口。

如果路由器在同一个";电线";,它将以ARP回复(见下文)进行回复

现在,网络库具有我们的DNS服务器或默认网关的IP地址,它可以恢复其DNS进程:

DNS客户端使用1023以上的源端口在DNS服务器上建立到UDP端口53的套接字。

如果本地/ISP DNS服务器没有,则需要进行递归搜索,该搜索将沿着DNS服务器列表向上流动,直到到达SOA,如果找到,则返回答案。

一旦浏览器接收到目标服务器的IP地址,它就会从URL获取该地址和给定的端口号(HTTP协议默认为port80,HTTPS默认为Port443),并调用名为socket的系统库函数,请求TCP套接字流——AF_INET/AF_INET6和SOCK_流。

该请求首先被传递到传输层,在传输层中起草了一个TCP段。目标端口被添加到报头中,源端口从内核中被关闭';s动态端口范围(ip_local_port_range inLinux)。

这个片段被发送到网络层,网络层封装了一个额外的iPhone阅读器。插入目标服务器和当前机器的IP地址以形成数据包。

数据包接下来到达链路层。添加一个帧头,其中包括机器的MAC地址#39;s NIC以及网关(本地路由器)的MAC地址。与之前一样,如果内核不知道网关的MACaddress,它必须广播一个ARP查询来找到它。

对于大多数家庭或小型企业的互联网连接,数据包将从您的计算机上传送,可能会通过本地网络,然后通过调制解调器(调制器/解调器)转换数字1和#39;s和0';转换成适合通过电话、电缆或无线电话连接传输的模拟信号。在连接的另一端是另一个调制解调器,它将模拟信号转换回数字数据,由下一个网络节点进行处理,在下一个网络节点上,将进一步分析from和to地址。

大多数大型企业和一些较新的住宅连接将采用光纤或直接以太网连接,在这种情况下,数据仍然是数字的,并直接传递到下一个网络节点进行处理。

最终,数据包将到达管理本地子网的路由器。从那里,它将继续进入自治系统#39;s(AS)边界路由器、其他ASE,最后连接到目标服务器。沿途的每个路由器从IP报头中提取目标地址,并将其路由到适当的下一跳。IP报头中的生存时间(TTL)字段对于通过的每个路由器减少一个。如果TTL字段为零或当前路由器队列中没有空间(可能是由于网络拥塞),则数据包将被丢弃。

客户机选择一个初始序列号(ISN),并将设置了SYN位的数据包发送到服务器,以指示其正在设置ISN

服务器将(客户机ISN+1)复制到其ACK字段,并添加ACK标志,以指示其正在确认收到第一个数据包

当另一方确认收到该数据包(或一串数据包)时,它发送一个ACK数据包,其ACK值等于从另一方收到的最后一个序列

客户端计算机向服务器发送ClientHello消息,其中包含其传输层安全性(TLS)版本、密码算法列表和可用的压缩方法。

服务器用ServerHello消息向客户端回复TLS版本、所选密码、所选压缩方法和服务器';由CA(证书颁发机构)签署的spublic证书。证书包含一个公钥,客户端将使用该公钥加密握手的其余部分,直到可以商定一个对称密钥。

客户端根据其受信任的CA列表验证服务器数字证书。如果可以基于CA建立信任,客户端将生成一个伪随机字节字符串,并使用服务器对其进行加密';spublic钥匙。这些随机字节可用于确定对称密钥。

服务器使用其私钥解密随机字节,并使用这些字节生成自己的对称主密钥副本。

客户端向服务器发送一条完成的消息,并使用对称密钥加密到目前为止的传输哈希。

服务器生成自己的哈希,然后对客户端发送的哈希进行解密,以验证其匹配性。如果是这样,它会将自己完成的消息发送到客户端,并使用对称密钥进行加密。

从现在起,TLS会话将传输使用约定的对称密钥加密的应用程序(HTTP)数据。

有时,由于网络拥塞或硬件连接不良,TLS包在到达最终目的地之前会被丢弃。然后,发送者必须决定如何反应。这种算法称为TCP拥塞控制。这取决于发送者;最常见的算法是新操作系统上的cubic算法和几乎所有其他系统上的New Reno算法。

对于每个已确认的数据包,窗口的大小都会翻倍,直到达到';慢启动阈值';。在某些实现中,该阈值是自适应的。

在达到慢启动阈值后,每个已确认的数据包的窗口都会增加。如果一个数据包被丢弃,窗口将以指数形式缩小,直到另一个数据包被确认。

如果使用的网络浏览器是由谷歌编写的,它将发送一个请求,尝试与服务器进行协商,而不是发送一个HTTPrequest来检索页面;升级";从HTTP到SPDY协议。

如果客户端使用HTTP协议且不支持SPDY,则会向服务器发送请求,格式如下:

其中,[other Header]指的是一系列按HTTP规范格式化的以冒号分隔的键值对,并由单个换行符分隔。(这假设正在使用的web浏览器没有任何违反HTTP规范的错误。这还假设web浏览器正在使用HTTP/1.1,否则它可能不会在请求中包含主机头,GET请求中指定的版本将是HTTP/1.0或HTTP/0.9。)

HTTP/1.1定义了";关闭";连接选项,用于发送方在响应完成后发出连接将关闭的信号。例如

不支持持久连接的HTTP/1.1应用程序必须包括";关闭";每个消息中都有连接选项。

在发送请求和标题后,web浏览器会向服务器发送一行空白换行符,指示请求的内容已完成。

服务器用表示请求状态的响应代码进行响应,并用以下形式的响应进行响应:

后跟一条换行,然后发送www.google的HTML内容的有效负载。通用域名格式。然后,服务器可以关闭连接,或者如果客户机发送了请求连接的头,则保持连接打开,以便重新用于进一步的请求。

如果web浏览器发送的HTTP头包含足够的信息,使web服务器能够确定自上次检索以来,webbrowser缓存的文件版本是否未被修改(即,如果web浏览器包含ETag头),则它可能会改为响应以下请求:

解析HTML后,web浏览器(和服务器)对HTML页面引用的每个资源(图像、CSS、favicon.ico等)重复此过程,除了GET/HTTP/1.1之外,请求将是GET/$(相对于www.google.com的URL)HTTP/1.1。

如果HTML引用了与www.google不同的域上的资源。com,web浏览器返回到解析另一个域所涉及的步骤,并遵循该域到目前为止的所有步骤。请求中的主机头将被设置为适当的服务器名,而不是google。通用域名格式。

HTTPD(HTTP守护进程)服务器是在服务器端处理请求/响应的服务器。最常见的HTTPD服务器是用于linux的Apache或nginx,以及用于Windows的IIS。

HTTP请求方法(GET、HEAD、POST、PUT、PATCH、DELETE、CONNECT、OPTIONS或TRACE)。如果直接在地址栏中输入URL,则将获取该URL。

请求的路径/页面,在本例中-/(因为没有请求特定的路径/页面,/是默认路径)。

服务器验证服务器上是否配置了与google对应的虚拟主机。通用域名格式。

服务器验证是否允许客户端使用此方法(通过IP、身份验证等)。

如果服务器安装了重写模块(如Apache的mod_rewrite或IIS的URL rewrite),它会尝试根据配置的规则之一匹配请求。如果找到匹配规则,服务器将使用该规则写入请求。

服务器去提取与请求对应的内容,在我们的例子中,它将返回到索引文件,如"/" 是主文件(某些情况下可以覆盖此文件,但这是最常见的方法)。

服务器根据处理程序解析文件。如果Google在PHP上运行,服务器将使用PHP解释索引文件,并将输出流式传输到客户端。

一旦服务器向浏览器提供资源(HTML、CSS、JS、图像等),它将经历以下过程:

渲染-构造DOM树→ 渲染树→ 渲染树的布局→绘制渲染树

浏览器';s的功能是通过从服务器请求并在浏览器窗口中显示所选的web资源来呈现该资源。资源通常是HTML文档,但也可能是PDF、图像或其他类型的内容。资源的位置是指定的

......