1.HTTP基本概念
1.1 HTTP是什么
HTTP(HyperText Transfer Protocol)是超文本传输协议。它是一种双向传输协议。具体来说HTTP是一种在计算机世界里,专门在[两点]之间[传输]文字、图片、音频、视频等[超文本]数据的[约定和规范]。
1.2 HTTP常见状态码有哪些
1XX类状态码属于提示信息,是协议处理中的一种中间状态;
2XX类状态码表示服务器成功处理了客户端的请求;
- [200 OK]是最常见的成功状态码,表示一切正常。如果非HEAD请求,服务器返回的响应头都会有body数据;
- [204 NoContent]也是最常见的成功状态码,与200 OK基本相同,但响应头没有body数据;
- [206 partical Content]应用于HTTP分块下载或断点续传,表示响应返回的body数据并不是资源的全部,而是其中一部分,也是服务器处理成功的状态。
3XX类状态码表示客户端请求的资源发生了变动,需要客户端用新的URL重新发送请求获取资源,即重定向。
- [301 Moved Permantly]表示永久重定向,说明请求的资源已经不存在,需改用新的URL再次访问;
- [302 Found]表示临时重定向,说明请求的资源还在,但是暂时需要用另一个URL访问该资源;
- [304 Not Modified]表示资源未修改,重定向到已存在的缓存文件,即缓存重定向。告诉客户端可以继续使用缓存资源,用于缓存控制。
4XX类状态码表示客户端发送的报文有误,服务端无法处理,即客户端错误
- [400 Bad Request]表示客户端请求的报文有误;
- [403 Forbidden]表示服务器的资源禁止访问,或客户端无权访问,并不是客户端请求出错;
- [404 Not Found]表示客户端请求的资源在服务端不存在或找不到,所以无法提供给客户端。
5XX类状态码表示客户端请求报文正确,但服务器处理时内部发生错误,属于服务端错误。
- [500 Internal Server Error]与400类似,笼统通用的错误码;
- [501 Not Imaplmwented]表示客户端请求的功能服务端暂时不支持,类似“即将开业,敬请期待”;
- [502 Bad Gateway]通常是服务端作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生错误;
- [503 Service Unavailable]表示服务器正忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”。
1.3 HTTP常见字段有哪些
- Host字段:用于请求发送到同一台服务器的不同程序;
- Content-Length:服务器返回数据的数据长度。HTTP协议通过设置回车符、换行符作为HTTP header边界,通过Content-Length字段作为Http Body边界,解决“粘包”问题。
- Connection字段:(Cnotallow=keep-alive)表示用户端与服务端使用HTTP长连接机制,只要任意一端没有明确断开连接,则保持TCP连接状态;
- Content-Type(Content-Type=text/html;charset=utf-8):用于响应客户端,告诉其本次数据什么格式;客户端Accept:*/*表示接收任何数据格式;
- Content-Encoding字段(Content-Encoding:gzip)表示服务端返回数据使用的压缩方法;客户端的Accept-Encoding=gzip,deflate表示接收这两种压缩方式。
2.GET与POST
2.1 Get和Post区别
RFC(Request For Comment):互联网工程任务组(IETTF)发布的用于标准化互联网协议和技术的文件。该文件包含协议规范、安全、路由、传输控制、网络管理等相关信息,该文档是互联网工程和网络技术领域的权威性和可信度文档。
- 根据RFC规范,Get是从服务其获取指定的(静态文本、页面、图片、音视频)资源。Get请求参数写在支持ASCLL字符且长度有限制的URL中。
- 根据RFC规范,Post是请求负荷(任意类型和大小的报文body)对指定的(静态文本、页面、图片、音视频)资源作出处理。
关于Get和Post方法请求流程这里贴上xiaolincoding的图片
2.2 Get和Post方法都是安全和幂等的吗
在HTTP协议中,安全是指请求方法不会破坏服务器上的资源;幂等是指多次执行相同的操作,结果都是相同的。
- 根据RFC规范,Get方法时安全且幂等的,可以对Get请求的数据做缓存,缓存在浏览器本身(减少浏览器重复请求相同资源),也可以用于代理(如Nginx),浏览器的Get请求可保存为书签;
- 根据RFC规范,Post方法不是安全幂等的,浏览器一般不会缓存Post请求,也不能将其保存为书签。
RFC中并没有规定Get不能带body,理论上任何请求都可以带有body;URL查询参数并不是Get独有,Post请求的URL也可以带有参数。
3.HTTP特性
3.1 Http/1.1优点
- 简单:头部信息键值对是简单文本形式,基本报文格式:header+body;
- 灵活易于扩展:协议中的请求方法、URI/URL、状态码、头字段可以由开发人员自定义和扩展。在HTTP下层传输协议中,HTTPS在HTTP与TCP之间增加了SST/TLS安全传输层;HTTP/1.1和HTTP/2.0传输协议使用的TCP协议,HTTP/3.0协议使用的UDP协议;
- 应用广泛、跨平台:无论是电脑还是
3.2 Http/1.1缺点
- 无状态双刃剑:不额外使用资源记录状态信息,减轻服务器负担;每次操作都需要验证用户身份,用户体验感差。我们可以将请求和响应报文写入Coolie信息控制客户端状态。流程r如下图:
- 明文传输双刃剑:方便阅读但是无隐私可言
- 不安全:
1)内容被窃取:找好信息泄漏,号没了;
2)不验证通行身份,遭遇伪装,访问淘宝,拼多多,钱没了;
3)无法验证报文完整性,可能被篡改:网页植入垃圾广告,视觉污染,眼没了
HTTP的安全问题可以通过在HTTPS协议在HTTP和TCP协议中间添加SSL和TLS协议增加安全性。
3.3 Http/1.1性能
HTTP协议基于TCP/IP协议,使用[请求--回应]通信模式;
- 长连接:减少TCP重新建立和断开的额外开销,减轻服务器负担。只要任意一端没有明确提出断开连接,TCP保持连接状态。如果某个HTTP连接超过一定时间没有任何数据交互,服务器会主动断开该连接。
- 管道网络传输:同一个TCP连接中,客户端可以发起多个请求,只要第一个请求发送出去,不必等待其响应,就可以发送第二个请求,减少整体响应时间。但是服务器必须按照管道的请求顺序响应请求。HTTP/1.1解决了请求的对头阻塞,但是没有解决响应的对头阻塞。
- 队头阻塞:如果顺序发送的请求序列中一个请求因为某种原因被阻塞,后面排队的所有请求一同被阻塞,导致客户端一直请求不到数据。
4.HTTP缓存技术
为避免重读的Http请求发送,可以将[请求-响应]的数据缓存在本地,因此Http头部中有很多针对缓存的字段。Http缓存技术有两种:强制缓存,协商缓存。
4.1 强制缓存
强制缓存是指浏览器如果判断缓存没有过期,则直接使用浏览器的本地缓存,使用缓存的主动性在浏览器这边。如下图,返回200状态码表示数据返回成功,在其后续括号中标识了from disk cache,这标识了使用强制缓存。
强制缓存通过HTTP响应头部的Cache-Control(相对时间)字段和Expires(绝对时间)字段实现,表示资源在客户端浏览器缓存的有效期。如果同时又Cache-Control和Expires字段,Cache-Control优先级更高。
Cache资源选项更多,设置更详细,建议使用Cache-Control实现强制缓存,工作流程如下:
- 当浏览器第一次访问服务器资源时,服务器在返回该资源的同时,在Response头部加上Cache-Control,并在Cache-Control中设置过期时间;
- 浏览器再次请求访问服务器中的该资源时,先通过请求资源的时间与Cache-Control中设置的过期时间大小计算比较资源是否过期,没过期就是用缓存,过期就重新请求服务器;
- 服务器再次收到请求后,会再次更新Response头部的Cache-Control。
4.2 协商缓存
协商缓存是指服务端通过状态码304告诉客户端可以使用缓存的资源。
协商缓存过程:与服务器协商之后,通过协商结果判断是否使用本地缓存。
协商缓存通过两种头部实现:
第一种:请求头部中的if-Modified-Since字段与响应头部中的Last-Modified字段实现
- 响应头部中的Last-Modified:标识响应资源的最后修改时间
- 请求头部中的If-Modified-Since:当资源过期,如果响应头部中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified;服务器收到请求后比较If-Modified-Since和Last-Modified时间,若Last-Modified时间大,则资源被修改过,服务器返回新资源,HTTP 200 OK;如果if-Modified-Since时间大,说明资源没有被修改过,响应HTTP 304走本地缓存获取资源。
第二种:请求头部中的if-None-Match字段和响应头部中的Etag字段
- 响应头部的Etag:唯一标识响应资源;
- 请求头部中的if-None-Match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器发起请求时,会将请求头中的If-None-Match设置为Etag的值。服务器收到请求后进行对比,如果资源没有变化返回304,如果资源变化重新请求服务器返回200。
两者比较:
第一种请求头部的If-Modified-Since和响应头部的Last-Modfied是基于时间的,第二种请求头部If-None-Match和响应头部的Etag是基于唯一标识的,相对来说后者能够更加准确地判断文件内容是否被修改,避免由于时间篡改导致不可靠问题。
第一次请求服务器资源时,服务器返回的HTTP响应头部同时由Etag和Last-Modified字段。客户端再次请求的时候,会带上这两个字段访问服务器,这时Etag优先级更高,服务器会先判断Etag是否变化,如果有变化不再判断Last-Modified,如果有变化再烂Last-Modified。
ETag现规定与Last-Modified优点:
- 在没有修改改动情况下,Last-Modified可能改变,导致客户端认为文件改动,重新请求服务器;
- 可能有些文件是在秒级以内修改,而If-Modified-Since检查到的粒度是秒级,使用Etag能够保证在这种需求下客户端在一秒内刷新多次;
- 有些服务器不能精准获取文件最后修改时间。
注意:协商缓存中请求和响应中的两个字段需要配合Cache-Control字段使用,只有在没有命中强制缓存的情况下,才能发起带有协商缓存的字段请求。总体缓存流程图如下:
使用Etag字段实现协商缓存过程:
- 当浏览器第一次请求服务器资源时,服务器在返回资源的同时,在其Response头部加上Etag唯一标识,这个标识值是根据当前请求的资源生成的;
- 当浏览器再次请求服务器的资源时,首先会检查强制缓存是否过期:
- 如果没有过期,直接使用本地缓存;
- 如果缓存过期,会在Request拖布加上If-None-Match字段,该字段值就是Etag唯一标识
- 服务器再次收到请求后,会根据请求的If-None-Match值与当前请求的资源生成的唯一标识进行比较:
- 如果值相等,则返回304 Not Modified,不会返回资源;
- 如果值不相等,则会返回200状态码和请求资源,并在Respons头部加上新的Etag唯一标识
- 如果浏览器收到304请求响应状态码,则从本地缓存中加载资源,否则更新资源。
5.HTTP与HTTPS
6.HTTP的演变
7.参考链接
本人博客内容是基于小林coding的计算机网络写的,中间省略了部分内容,大家可以去小林coding博客看更详细的图解网络,链接为:小林coding (xiaolincoding.com)。
标签:面试题,缓存,HTTP,请求,Modified,服务器,客户端 From: https://blog.51cto.com/u_15839058/6675658