关于HTTP

53 阅读2分钟

是什么?

客户端 和 服务器的通信协议(报文格式)

请求行

请求方法, url, http版本

常用请求头

  • Referer(指明该请求是从哪个地址过来的) 作用:防盗,比如你只想自己的服务器访问自己的图片服务器;有时候会碰到图片403错误,参考如下解决方式。
<meta name="referrer" content="no-referrer" />
  • Content-Type application/x-www-form-urlencoded(formdata) application/json
  • Accept(接受的MIME类型) 对应响应头 Content-Type: text/html;utf-8
  • Accept-Charset(字符集)
  • Accept-Encoding 对应响应头 Content-Encoding
关于压缩
gzip(利用重复字符的替换进行压缩)
服务端将响应数据通过 gzip 压缩, 在响应头中增加 Content-Encodin: gzip;
客户端查看响应头 Content-Encodin: gzip 表示数据需解压处理

客户端可以通过代码将请求数据压缩,然后在请求头中加入 Content-Encodin: gzip

数据体

json字符串, urlencoded, 文件

不同版本的 HTTP

  • http1.0:慢
  • http1.1:使用流量多 ,但稳定并行
http1.1 默认都是长连接(维持一个tcp信道),但依然存在http对头阻塞
解决方式:浏览器默认限制同个域名支持多信道tcp  6个 (域名切片)

关闭长连接:
1. 服务器设置超时时间 或者 请求次数上限    
2. 客户端设置请求头: connection: close
  • http2.0:流量省 但是如果丢包性能反而更差
分帧层:每个请求都是一个数据流,数据流被切割成多个帧,头部标记streamID;服务器会归档
多路复用:所有的双向数据在一条tcp上传输(做到并行发送和响应)
报文前后diff(省流)
映射表(标记常用请求头)
服务器推送

对头阻塞

  • http对头阻塞
HTTP请求和应答模式决定的,http规定下一个请求必须在前一个请求响应到达之后才能发送
  • tcp对头阻塞
一条数据会被分割成多个TCP数据包
每个TCP数据包都会带着一个唯一的序号被发出
所有的数据包必须按顺序传送到接收端,如果中途有一个数据包没能到达接收端
那么后续的数据包必须保存在接收端的TCP缓冲区上,应用程序不能访问,需要等待丢失的数据包重发到接收端
应用程序对TCP重发和缓冲区中排队的数据包一无所知,必须等待分组全部到达才能访问数据