10 浏览器 – HTTP
简介:HTTP 在 TCP 的基础上,规定了 Request-Response 的模式, 纯粹的文本协议, 定了使用 TCP 协议来传输文本格式的一个应用层协议。
协议格式
HTTP Method(方法)GET POST HEAD PUT DELETE CONNECT OPTIONS TRACE
通过地址栏访问页面都是 GET 方法。表单提交产生 POST
HEAD 则是跟 GET 类似,只返回请求头,多数由 JavaScript 发起
PUT 和 DELETE 分别表示添加资源和删除资源,语义资源并非强约束
CONNECT 现在多用于 HTTPS 和 WebSocket
OPTIONS 和 TRACE 一般用于调试,多数线上服务都不支持
HTTP Status code(状态码)和 Status text
304: 客户端本地已经有缓存的版本,并且在 Request 中告诉了服务端,当服务端通过时间或者 tag,发现没有更新的时候,就返回一个不含 body 的 304 状态。
实际上 301 更接近于一种报错,提示客户端下次别来了
1xx 的状态被浏览器 http 库直接处理掉了,不会让上层应用知晓
HTTP Head (HTTP 头)
HTTP Request Body 常见 body 格式 form 标签:默认会产生 application/x-www-form-urlencoded,当有文件上传时,则会使用 multipart/form-data
HTTPS
作用:一是确定请求的目标服务端身份,二是保证传输的数据不会被网络中间节点窃听或者篡改。
区别:使用加密通道来传输 HTTP 的内容,TLS 构建于 TCP 协议之上,它实际上是对传输的内容做一次加密,所以从传输内容上看,HTTPS 跟 HTTP 没有区别
HTTP 2.0
改进:一是支持服务端推送,二是支持 TCP 连接复用提前把一部分内容推送给客户端,放入缓存当中,这可以避免客户端请求顺序带来的并行度不高,从而导致的性能问题。同一个 TCP 连接来传输多个 HTTP 请求,避免了 TCP 连接建立时的三次握手开销,和初建 TCP 连接时传输窗口小的问题。
补充知识
DNS 查询得到 IP
tcp/ip 的并发限制
get 和 post 的区别
w3c 对于区别做出的定义:(用法上)(1)对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制,允许二进制。
(2)GET 在浏览器回退 / 刷新时是无害的,而 POST 会再次提交请求。(3)GET 请求只能进行 url 编码 (application/x-www-form-urlencoded),而 POST 支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data),可以为二进制使用多重编码 – HTML 标准对 HTTP 协议的用法的约定,是浏览器拦截不让发(4)POST 比 GET 更安全,因为 GET 参数直接暴露在 URL 上,POST 参数在 HTTP 消息主体中,而且不会被保存在浏览器历史或 web 服务器日志中。- GET 提交数据还可能会造成 Cross-site request forgery 攻击 + 对于用户名等敏感信息暴露(5) 对参数数据长度的限制,GET 方法 URL 的长度是受限制的,最大是 2048 个字符,POST 参数数据是没有限制的。- 浏览器 / 服务器行为,http 没有做出限制:恶意伪造 content-length 很大的包头(6)GET 请求会被浏览器主动缓存,POST 不会,除非手动设置。(7)GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。(8)GET 请求可被收藏为书签,POST 不能。
常见答案:1. GET 使用 URL 或 Cookie 传参,而 POST 将数据放在 BODY 中。2. GET 方式提交的数据有长度限制,则 POST 的数据则可以非常大。3. POST 比 GET 安全,因为数据在地址栏上不可见。
在 HTTP 上看 HTTP 规范定义:GET 一般用于获取 / 查询资源信息,而 POST 一般用于更新资源信息。方法都只是规定:使用哪个 Method 与应用层的数据如何传输是没有相互关系的,get 一样可以发送 body HTTP 协议对 GET 和 POST 都没有对长度的限制 GET 幂等,POST 不幂等幂等是指同一个请求方法执行多次和仅执行一次的效果完全相同。1. 按照 RFC 规范,PUT,DELETE 和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。2. 引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退 / 刷新时遇到 POST 会给用户提示的原因:POST 语义不是幂等的,重复请求可能会带来意想不到的后果。3. 比如在微博这个场景里,GET 的语义会被用在「看看我的 Timeline 上最新的 20 条微博」这样的场景,而 POST 的语义会被用在「发微博、评论、点赞」这样的场景中。
总结:
GET 的语义是请求获取指定的资源。GET 方法是安全、幂等、可缓存的(除非有 Cache-Control Header 的约束),GET 方法的报文主体没有任何语义。POST 的语义是根据请求负荷(报文主体)对指定的资源做出处理,具体的处理方式视资源类型而不同。POST 不安全,不幂等,(大部分实现)不可缓存。http 的 method 的定义,只是对行为的定义,幂等 (有无副作用) 的定义,没有强制定义,对其约束很低,为了服务器 / 浏览器的压力和安全,才对 http 的 method 做出了一些限制,且对于不用浏览器和服务器这些限制是不同,其两者本质都是基于 TCP 传输,区别只是幂等 https://www.jianshu.com/p/8fd…
补充知识点
五层因特网协议栈 - 阮一峰的总结
长连接与短连接
TCP 就是数据传输的通道(先建立通道再传输数据,能够保证安全)
TCP 保活功能:为服务器应用提供,服务器应用希望知道客户主机是否崩溃
http2.0 与 http1.1 的显著不同点:
强缓存与协商缓存