计算机网络之一文掌握HTTP协议
HTTP消息是纯文本的,因此可以在途中被拦截、读取甚至更改
方法
http 属于无状态协议,由于不用保持状态,所以节省了服务端CPU和内存消耗,但是可以借助cookie 等实现状态保持功能。
方法 | 说明 | – |
---|---|---|
GET | ||
HEAD | ||
POST | ||
PUT | ||
DELETE | ||
OPTIONS | ||
TRACE |
在初始 http 版本中,每一次http通信都是一次 tcp 连接和断开,增加了通信的开销。
http 1.1 和部分1.0 中新增了 持久连接,好处在于减少了TCP连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使HTTP请求和响应能够更早地结束,这样Web页面的显示速度也就相应提高了。
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文
状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
常用状态码类别:
类别 | 原因 | |
---|---|---|
1XX | ||
2XX | ||
3XX | ||
4XX | ||
5XX |
客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If-Modified-Since
或者If-None-Match
,两者 一同使用的时候,If-None-Match 优先级更高(假如服务器支持的话)。
- 当使用 if-Modified-Since 时, 这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。服务端只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。
由于 if-Modified-Since 使用的是时间戳,时间戳的最小单位是1s, 所以 1s 内资源发生变化,这个弊端会导致无法获取到最新的资源。
- 当使用 If-None-Match 时,当且仅当服务器上没有任何资源的
ETag
属性值与这个首部中列出的相匹配的时候,服务器端会才返回所请求的资源,响应码为200
。反之对于 GET 或者 HEAD 来说,返回304。
状态码 | 含义 |
---|---|
Http/1.1
持久连接
管线化
http 缺点
- 通信使用明文(HTTP报文使用明文(指未经过加密的报文)方式发送),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
- 缺少状态问题。
- 由于使用文本格式,所以HTTP消息比较大。
https
http + SSL 或者 TLS
当在浏览器中输入www.baidu.com 发生了什么?
浏览器根据DNS服务器返回的真实地址请求网页资源。
浏览器请求计算机建立对这个地址 标准web接口 或者 标准安全接口 TCP 连接。
百度服务器返回响应内容,一般来说,初始响应包含HTML格式的网页文本,为了让用户看到丰富的媒体样式,HTML还引用了其他资源(图片、CSS样式,js等)。
Web 浏览器处理响应,解析处理HTML,期间还会发现显示页面需要其他一些资源(CSS、js等)
Web 浏览器请求额外资源。
浏览器获取到足够的资源后,开始渲染页面。
网页被完全加载后,浏览器停止显示加载图标。
状态保持
Cookie session
SPDY
SPDY 基于http构建,没有从根本上改变协议,只是对http进行封装,所以就不会带来兼容性问题。
流多路利用 , 请求和响应使用单个TCP连接传输数据,它们被分成不同的数据包,以流的方式分组。
请求优先级 ,在同时发送所有请求时,为了避免引入新的性能问题,引入了请求优先级的概念。
HTTP首部压缩 ,HTTP体早就可以压缩了,现在首部也可以压缩了。
http/2.0
HTTP/2是SPDY的标准化版本
服务端推送
服务端推送就是允许服务端直接返回客户端未请求的额外资源。在 2.0 版本之前如果页面资源中包含了额外资源(CSS、js等),客户端必须先请求到页面资源,通过解析才能知道包含了那些额外资源,然后再请求它们,响应渲染。如下图:
二进制协议
报文首部压缩
为什么需要首部压缩?