一、浏览器请求服务器的整个流程
浏览器输入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
这两个会发生变化,导致两个属性对不上,那会重新从服务器下载资源,既跳过了强缓存,又跳过了协商缓存。