解密HTTP协议

tech2026-01-15  8

一、浏览器请求服务器的整个流程

       浏览器输入URL,浏览器作为HTTP请求发起的客户端,首先会找到本机的hosts文件中有没有IP和域名的映射关系,没找到先请求本地的DNS域名解析服务器,也就是配置宽带时候设置的DNS,一般是8.8.8.8或者114.114.114.114。如果本地DNS服务器没找到就将这个域名往根DNS域名解析服务器(也可以设置不直接请求根DNS服务器,而是采用就近原则,逐层往上抛)上丢,逐层去解析域名,一旦解析成功就返回对应的IP地址,浏览器再去请求对应的IP地址+端口,得到响应。

       DNS服务器的分布式架构与下图所示:

二、基于TCP/IP的应用层协议

       拿微服务架构举例子,A服务通过RPC调用B服务,A服务的数据需要沿着TCP/IP的四个分层逐层地往下传输,每层都需要在数据上添加首部,到达链路层则通过网线、光纤等介质直接进行传输,B服务则从链路层的数据帧逐层往上传输,逐层地去掉首部,直到到达B服务的应用层。

三、URI、URL、URN

       URI:Uniform Resource Identifier,统一资源标识符。        URL:Uniform Resource Locator,统一资源定位符。        URN:Uniform Resource Name,统一资源名。

       URI包括URL和URN,        URN相当于只是一个人的名字,URL就等于这个人的住所,可以用过URL找到这个人。

       URI和URL的唯一区别仅仅是提供的访问机制(协议)不同,换句话说URL提供了协议,而URI则不一定。

       举例:https://www.baidu.com就是URL同时也是URI,而www.baidu.com仅仅只是URI不是URL。

四、HTTP的缓存机制

       这段时间,正好师姐在看前端的面经,其中就提到HTTP缓存,所以特意来了解了一下。

       HTTP缓存可以分别为强缓存和协商缓存。强缓存可以理解为当强缓存的属性和协商缓存的属性都有效的时候,强缓存处在一个强势地位,即不会对服务器发起人和请求,直接从缓存中拿资源。

1、强缓存

       利用请求头中的expires/cache-control:max-age属性决定客户端是否需要再发请求给服务器,如果还没到期直接从本地缓存中拿静态资源。

2、协商缓存

       当用户第一次请求某个资源的时候,服务端会传回Last-Modified或者Etag(两个都代表服务端中资源最后次更新的时间),用户每次请求(还是会请求服务器判断资源是否是最新的)的时候会带上If-Modified-Since(带的值就是第一次服务器返回的Last-Modified属性)或者If-None-Match(带的值就是第一次服务器返回的Etag属性),如果这一对属性对不上,就重新去服务端下载资源,如果对上了直接从缓存中获取资源。

3、Last-Modified和Etag区别

       ① Last-Modified这个属性只能精确到秒级别,也就是说如果服务器的资源文件在一秒内变化多次,客户端是无法正确感知的。而Etag是服务器通过加密算法实现的,只要资源文件有一丁点变化,这个值会立刻改变。

       ② 服务器仅仅只是打开了这个资源文件且不做任何修改,那服务器的Last-Modified的属性也会发生变化。

4、F5和Ctrl+F5发生的事情

       ① 按下F5刷新页面之后,请求头中的cache-control:max-age属性类似就变为0这种感觉了,也可能完全丢掉了这个属性,此时协商缓存的属性起作用,但是强缓存被跳过了。

       ② 当按下Ctrl+F5的时候,请求头中的cache-control会变为no-cache状态,即虽然还是使用缓存,但是每次都会请求服务器当前资源是否为最新的。PS:此时猜测请求头中的If-Modified-Since或If-None-Match这两个会发生变化,导致两个属性对不上,那会重新从服务器下载资源,既跳过了强缓存,又跳过了协商缓存。

最新回复(0)