目录css
HTTP全称是Hyper Text Transfer Protocol(超文本传输协议),它容许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。这也是Web程序之间的最基本的一个通讯协议,也是面试常考点。
@html
服务器返回的 响应报文 中第一行为状态行,包含了状态码以及缘由短语,用来告知客户端请求的结果。
面试
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽量简单,使得它可以处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器以后向同一服务器再次发起请求时被携带上,用于告知服务端两个请求是否来自同一浏览器。因为以后每次请求都会须要携带 Cookie 数据,所以会带来额外的性能开销(尤为是在移动环境下)。
Cookie 曾一度用于客户端数据的存储,由于当时并无其它合适的存储办法而做为惟一的存储手段,但如今随着现代浏览器开始支持各类各样的存储方式,Cookie 渐渐被淘汰。新的浏览器 API 已经容许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB。数据库
用途浏览器
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源。若是每进行一次 HTTP 通讯就要新建一个 TCP 链接,那么开销会很大。
长链接只须要创建一次 TCP 链接就能进行屡次 HTTP 通讯。
从 HTTP/1.1 开始默认是长链接的,若是要断开链接,须要由客户端或者服务器端提出断开,使用 Connection : close;
在 HTTP/1.1 以前默认是短链接的,若是须要使用长链接,则使用 Connection : Keep-Alive。缓存
HTTP 有如下安全性问题:安全
HTTPs并非新协议,而是让HTTP先和SSL(Secure Sockets Layer)通讯,再由SSL和TCP通讯,也就是说HTTPs 使用了隧道进行通讯。
经过使用 SSL,HTTPs 具备了加密(防窃听)、认证(防假装)和完整性保护(防篡改)服务器
对称密钥加密(Symmetric-Key Encryption),加密和解密使用同一密钥。
优势:运算速度快;
缺点:没法安全地将密钥传输给通讯方。cookie
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不一样的密钥。
公开密钥全部人均可以得到,通讯发送方得到接收方的公开密钥以后,就可使用公开密钥进行加密,接收方收到通讯内容后使用私有密钥解密。
非对称密钥除了用来加密,还能够用来进行签名。由于私有密钥没法被其余人获取,所以通讯发送方使用其私有密钥进行签名,通讯接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。
优势:能够更安全地将公开密钥传输给通讯发送方;
缺点:运算速度慢。网络
详细内容请见上文
HTTP/1.1 默认是长链接
HTTP/1.1 支持管线化处理
HTTP/1.1 支持同时打开多个 TCP 链接
HTTP/1.1 支持虚拟主机
HTTP/1.1 新增状态码 100
HTTP/1.1 支持分块传输编码
HTTP/1.1 新增缓存处理指令 max-age
HTTP/1.x 实现简单是以牺牲性能为代价的:
在通讯系统中,只有一个TCP链接存在,它承载了任意数量的数据双向流(Stream)
帧(Fram)是最小的通讯单位,来自不一样数据流的帧能够交错发送,而后再根据每一个帧头的数据流标识符从新组装。
HTTP/2.0 在客户端请求一个资源时,会把相关的资源一块儿发送给客户端,客户端就不须要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一块儿发给客户端。
HTTP/1.1 的首部带有大量信息,并且每次都要重复发送。
HTTP/2.0 要求客户端和服务器同时维护和更新一个包含以前见过的首部字段表,从而避免了重复传输。
不只如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。
GET 用于获取资源,而 POST 用于传输实体主体。
GET 和 POST 的请求都能使用额外的参数,可是 GET 的参数是以查询字符串出如今 URL 中,而 POST 的参数存储在实体主体中。不能由于 POST 参数存储在实体主体中就认为它的安全性更高,由于照样能够经过一些抓包工具(Fiddler)查看。
由于 URL 只支持 ASCII 码,所以 GET 的参数中若是存在中文等字符就须要先进行编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参考支持标准字符集。
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。
GET 方法是安全的,而 POST 却不是,由于 POST 的目的是传送实体主体内容,这个内容多是用户上传的表单数据,上传成功以后,服务器可能把这个数据存储到数据库中,所以状态也就发生了改变。
安全的方法除了 GET 以外还有:HEAD、OPTIONS。
不安全的方法除了 POST 以外还有 PUT、DELETE。
幂等的 HTTP 方法,一样的请求被执行一次与连续执行屡次的效果是同样的,服务器的状态也是同样的。换句话说就是,幂等方法不该该具备反作用(统计用途除外)。
全部的安全方法也都是幂等的。
在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。
GET /pageX HTTP/1.1 是幂等的,连续调用屡次,客户端接收到的结果都是同样的:
GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1
POST /add_row HTTP/1.1 不是幂等的,若是调用屡次,就会增长多行记录:
POST /add_row HTTP/1.1 -> Adds a 1nd row POST /add_row HTTP/1.1 -> Adds a 2nd row POST /add_row HTTP/1.1 -> Adds a 3rd row
DELETE /idX/delete HTTP/1.1 是幂等的,即使不一样的请求接收到的状态码不同:
DELETE /idX/delete HTTP/1.1 -> Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -> Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -> Returns 404
若是要对响应进行缓存,须要知足如下条件: