Browser 浏览器如何知道哪些标头添加到请求中

Browser 浏览器如何知道哪些标头添加到请求中,browser,server,request,http-headers,Browser,Server,Request,Http Headers,当我在浏览器的地址栏中键入站点的url时,浏览器会发送一个请求,以通过url获取资源。但是当我访问不同的网站google.com、amazon.com等时,初始化页面的请求对于不同的网站有不同的标题 如果浏览器在第一次初始化时仅具有有关此资源的URL的信息,则浏览器从何处获取加载页面的请求标题集 例如,当我转到google.com时,浏览器会发送这样的请求标题: :authority: www.google.com :method: GET :path: / :scheme: https acc

当我在浏览器的地址栏中键入站点的url时,浏览器会发送一个请求,以通过url获取资源。但是当我访问不同的网站google.com、amazon.com等时,初始化页面的请求对于不同的网站有不同的标题

如果浏览器在第一次初始化时仅具有有关此资源的URL的信息,则浏览器从何处获取加载页面的请求标题集

例如,当我转到google.com时,浏览器会发送这样的请求标题:

:authority: www.google.com
:method: GET
:path: /
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7
cache-control: max-age=0
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
对于amazon.com,请求的标题是不同的:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7
Connection: keep-alive
Host: amazon.com
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36

在地址栏中键入URL时,需要将其转换为HTTP请求

因此,键入www.google.com意味着您需要从该服务器获取默认页面。这基本上都包含在第一个请求的前4行中

浏览器也知道它可以接受什么类型的格式。大多数情况下,我们会返回HTML,因此文本/HTML肯定在其中,但我们也接受其他格式,包括完全通用的*/*顺便说一句!:-

请求通常使用gzip、deflate或更新的brotli-br格式进行压缩,以便浏览器在accept-encoding报头中告诉服务器它支持哪种格式

当您安装浏览器时,您还设置了默认语言,以便我们可以告诉服务器。一些服务器将基于此返回不同的内容

还有一些安全性标题,我将不讨论这些,因为它们非常复杂

最后是用户代理头。这基本上就是浏览器告诉服务器它是Chrome,还是Firefox或其他什么。但它的长度远远超过了铬

因此,基本上,请求头是浏览器发送给服务器的东西,用于向服务器提供有关浏览器及其功能的更多信息。对于刚输入浏览器的请求,无论URL是什么,请求头基本上都是相同的。对于页面发出的其他请求(例如,通过JavaScript代码),如果添加更多的标题,则这些请求可能会有所不同

关于您提出的两个示例请求之间的差异:

如果使用Chrome,Google使用HTTP/2或QUIC,但就这个问题而言,目前基本上是HTTP/2。如果将option Protocol列添加到developer tools中,则可以看到这一点

HTTP/2与HTTP/1相比有几个变化,即:

HTTP头名称大小写较低。从技术上讲,在HTTP/1中,它们是不区分大小写的,但按照惯例,许多工具(如browser)使用标题大小写来大写每个单词的第一个字母。 请求(例如GET/HTTP/1.1)被转换为以冒号开头的伪头:method:GET、:path:/…等。。 主机基本上是:HTTP/2中的权限。 :scheme在HTTP/2中基本上是新的,因为以前它不是HTTP请求的显式部分,而是在连接级别处理的。 HTTP/2中的连接已失效。即使在HTTP/1.1中,它也默认保持活动状态,因此不需要使用上面的头,但出于历史原因,许多浏览器和其他客户端发送了它。 我认为这解释了所有的差异


那么浏览器如何知道是使用HTTP/2还是HTTP/1.1呢?这基本上取决于HTTPS会话何时建立,如果服务器建议它可以支持HTTP/2,而浏览器想要使用它。

你能在你的问题中添加不同标题的示例吗?我的意思是,如果我只键入URL,浏览器如何知道其余的信息请求标题等。哪种机制允许浏览器知道除用户键入的URL以外的其余信息?一些DNS服务器,但它只是为了获取IP,设置连接,一些路由器或什么?也许一些较低级别的协议发送了这些信息?OSI的哪个级别取决于它?如果我没记错的话,TLS负责选择HTTP协议,TLS还负责协议的所有其他数据,包括请求的头,不是吗?添加了一些更多的注释。希望这能回答你的问题。好的,我明白了。那么缓存控制呢:max age=0请求头字段?它是由HTTP/2或服务器通过TLS配置的,还是不是TLS而是其他协议?基本上这就是我收到这个问题的原因不,那是因为你刷新了第一个页面,所以浏览器说嘿,这家伙想让我检查这是否是最新的页面,所以请不要给我发送任何缓存的旧页面,第二个页面你没有。如果刷新amazon.com,您将看到相同的缓存控件:max age=0标头。