HTTP相关的网络知识总结

202 阅读7分钟

1.HTTP协议的请求报文和响应报文结构


请求报文

请求行(request line):请求行包括三个字段,有请求的方法、请求URL、HTTP版本

  • 请求的方法:GET\POST等等
  • 请求URL:请求的地址
  • HTTP版本:HTTP/2, HTTP/1.1等等

头部(header line)

  • 首部字段名: 值

请求实体(entity body)

  • GET方法,实体体为空;POST方法,可以不为空

响应报文

状态行(status line):状态行包括三个字段,协议版本字段、状态码、相应的状态信息

  • 协议版本: HTTP1.1 / HTTP1.0 / HTTP2.0 等等
  • 状态码: 2xx/ 3xx/ 4xx/ 5xx
  • 状态信息: 对应状态码的状态信息

头部(header line)

  • 首部字段名: 值

响应实体(entity body)


2.HTTP协议请求方法(共9种)


GET(HTTP 1.0)

  • 发送一个GET请求可以获取服务器上的资源
  • GET可以在请求的URL中附带参数, 比如: ?name=zhangsan
  • 在浏览器地址栏输入网址访问资源的时候,都是使用GET方法来发送HTTP请求的
  • GET请求所携带的数据内容有限制,只允许ASCII字符
  • GET请求所携带的数据长度有限制,由于数据携带在URL里面,URL长度是有限制的(服务端和浏览器端会进行限制), 不同的浏览器的限制大小不同。
  • GET只应当用于获取数据,而不是修改数据,即GET请求不应该产生副作用,幂等,即不论进行多少次GET请求都应该返回一样的结果

POST(HTTP 1.0)

  • 用于向服务器上提交数据,请求的数据在body中发送,也可以在url中携带参数
  • POST方法传递的数据长度没有限制
  • POST方法传递的数据格式没有限制
    • 通过Content-Type来确定请求中的body部分是何种类型
  • POST请求可能会导致服务器上的资源被修改
  • 当浏览器中页面回退的时候,浏览器会提醒POST请求会重新提交,从而可能会改变服务器上的资源
  • 相较于GET更加安全,参数不会保存在浏览器的历史记录中,数据不会显示在URL中

HEAD(HTTP 1.0)

  • 同GET方法,会向服务器请求资源,是获取数据, 不同的地方是此时不会返回响应报文的body部分
  • 应用: 检查是否需要更新浏览器缓存(应用之一)

OPTIONS(HTTP 1.1)

  • 请求web服务器,获知web服务器所支持的各种功能,包括服务器普遍支持哪些请求方法、对于特定的资源支持哪些请求方法
  • 应用:发送跨域请求时,跨域请求有简单请求和复杂请求,复杂请求在真正的请求前会先发送一次OPTIONS请求,根据返回的Access-Control-* 的信息,判断是否具有访问权限。

PUT(HTTP 1.1)

  • 向指定的资源位置上传其最新的内容
  • 与POST不同,PUT方法是幂等的,重复执行多次,产生的效果是一样的

PATCH

  • 用于资源的部分更新

  • 当资源不存在的时候,会去创建该资源,PUT是对已有的资源进行更新

DELETE(HTTP 1.1)

  • 请求服务器删除Request-URL所标识的资源

CONNECT(HTTP 1.1)

  • HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器(这里不太了解)

TRACE(HTTP 1.1)

  • 回显服务器收到的请求,主要用于测试和诊断

3.HTTP的版本

http1.0

  • 默认是非持久连接,即一个TCP连接,只提供一个HTTP连接使用,如果需要建立长连接,需要设置字段Connection: keep-alive
  • 支持三种请求方法:GET\POST\HEAD
  • 资源请求返回整个对象,不支持断点续传
  • 使用If-Modified-Since、Expires来作为缓存的判断标准

http1.1

  • TCP连接可以复用,默认支持长连接,在一个TCP连接上可以传递多个HTTP请求和响应,减少了建立、关闭连接的消耗(包括时延还有运算消耗)
  • 增加如下字段来支持缓存策略: If-Unmodified-Since \ If-Match \ If-None-Match\ Cache-Control
  • 新增了host字段,指定服务器的域名
  • 添加了支持OPTIONS\PUT\DELETE\TRACE\CONNECT作为请求方法
  • 引入range,允许请求资源的某个部分(比如客户端已经有资源的一部分了,现在想要的是另一部分),服务器相应的返回了range范围的内容,则响应码是206(Partial Content),响应头部有Content-Range字段,声明返回这部分的偏移量和长度。

http2.0

  • 二进制协议: 在HTTP1.1中,body部分是文本\二进制,头部部分必须是文本,即ASCII码的形式,HTTP2.0中,header和body部分都是二进制,在传输层和应用层之间多了一个二进制帧层,将不同的请求拆分成了不同的stream,并标记上id,并且将其分为head帧和data帧,根据id和帧的类型,使得在接收方的二进制帧层可以进行有序的重组。因此可以解决HTTP1.1中的请求阻塞问题。
  • 多路复用: 在一个TCP连接中,Server和Client能够同时发送多个请求或者响应,不用按照顺序
  • 首部压缩: 在Client和Server端使用首部表来跟踪键值对,在发送请求报文、响应报文的时候,只发送差异数据,减少头部(header)开销
  • 服务器推送: 支持Server主动向客户端发送一些资源(静态资源),减少延迟时间(避免客户端再次发送请求获取资源)

4. HTTP响应的状态码

2XX

200(OK) 客户端发送的请求已经被服务端正常处理

204(No Content) 客户端发送HEAD请求时,表示响应报文中没有body部分。只需要从客户端向服务端发送信息,而服务端不需要发送信息给客户端。

206(Partial Content) 客户端请求时有range字段,请求资源的一部分,服务器执行了这部分的GET请求,响应报文中Content-Range指定这部分资源的偏移量和长度。

3XX

301(Moved Permanently) 永久重定向,请求的资源被重新分配了地址,响应头的Location字段会指定该新地址。

302(Found) 临时重定向, 资源临时改变了地址,但是以后还可能发生变化。

303(See Other) 资源改变了地址,同时应该使用GET方法来获取该资源,经常作为PUT或者POST操作的返回结果。

304(Not Modified) 可以使用客户端缓存中的数据,无需访问服务器上的资源。浏览器缓存相关。

4XX

400(Bad Request) 请求报文中存在错误,例如请求方法和请求地址不匹配。

401(Unauthorized) 表示该请求需要通过HTTP认证

403(Forbidden) 服务器拒绝该请求资源的访问

404(Not Found) 服务器上找不到请求的资源

405(Method Not Allowed) 服务器禁止使用该方法,客户端可以通过OPTIONS方法来查看服务器允许的方法,服务器的响应中,Access-Control-Allow-Methods字段会知名允许的方法,例如Access-Control-Allow-Methods: GET, HEAD, POST, PUT

5XX

500(Internal Server Error) 服务器在执行请求的时候发生了错误

502(Bad Gateway) 网关或者代理服务器收到的响应无效

503(Service Unavaliable) 服务器正处于超负载或者停机维护

504(Gateway Timeout) 网关或者代理服务器无法在规定的时间内获得想要的响应

5.URL编码

关于URL编码 - 阮一峰的网络日志 (ruanyifeng.com)

URL限制只能使用ASCII字符集来进行传输,因此"只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。"

使用js中的encodeURI来对url进行编码,decodeURI进行解码,是utf8编码

encodeURI()、encodeURIComponent()区别及使用场景_Saga Two的博客-CSDN博客_encodeuricomponent使用场景

注意 encodeURI不会对 ; / ? : @ & = + $ , # 进行编码, encodeURIComponent会,同时采用decodeURIComponent解码。