# HTTP 协议

HTTP,全称超文本传输协议,是一种详细规定客户端与web服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议

# HTTP 报文结构

对于 TCP 来说,在传输的时候分为两个部分:TCP 头和数据部分
HTTP:起始行 + 头部 + 空行 + 实体
请求报文:请求行 + 请求头 + 空行 + 请求体
响应报文:响应行 + 响应头 + 空行 + 响应体

  • 起始行
    1. 对于请求行:包括方法、URL 字段、HTTP 版本,用空格隔开
      例如:GET /home HTTP/1.0
    2. 对于响应行:包括 HTTP 版本、状态码、原因
      例如:HTTP/1.1 200 OK
  • 头部 -> 请求头/响应头
    格式:
    1. 字段名不区分大小写
    2. 字段名不允许出现空格,不可以出现下划线
    3. 字段名后面必须紧跟 :
  • 空行
    用来区分头部和实体
    如果在头部中间故意加一个空行,空行后面所有的内容会被视为实体
  • 实体
    具体的数据,body 部分 -> 请求体(请求携带的数据) 和 响应体(服务器响应的数据)

# 特点

  1. 无状态,每个请求结束后都会被关闭,每次的请求都是独立的,服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器。一句话概括 --- 人生若只如初见(例如登录之后进行请求,因为 http 的无状态,用户下一次请求还需要再次登录,需要 session 和 cookie 进行状态管理)
  2. 明文传输(未经加密的报文)
  3. 不验证通信双方的身份,因此有可能遭遇伪装。在 http 协议通信中会存在服务器是否就是发送请求中 URI 真正指定的主机,返回的响应是否真的返回到实际提出请求的客户端等问题。在 HTTP 协议通信时,由于不存在确认通信方的处理步骤,任何人都可以发起请求,服务器只要收到请求,不管对方是谁(发送端的 IP 地址和端口号没有被 Web 服务器设定限制访问的前提下)都会返回一个响应(即使是无意义的请求也会照单全收 --- DDOS 攻击)
  4. 无法证明报文的完整性,没有任何办法确认发出的请求/响应和接收到的请求/响应是前后相同的,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应的内容遭到篡改,也没有办法知道
  5. 灵活可扩展
- 语义上,只规定了基本格式
- 传输形式的多样性,不仅可以传输文本,还能传输图片、视频等任意数据  
  1. 可靠传输,基于 TCP/IP
  2. 请求-应答,一发一收,有来有回

# 缺点

  1. 无状态 -> 两种情景
- 在长连接的场景中,需要保存大量的上下文信息,以免传输大量重复的信息,这个时候无状态就是一个缺点 
- 有一些应用只是为了获取一些数据,不需要保存上下文信息,无状态减少了网络开销,这个时候无状态就是一个优点  
  1. 明文传输
    协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式
    让 HTTP 的报文信息暴露给了外界,给攻击者也提供了便利
    举例:WIFI 陷阱 -> 利用 HTTP 明文传输的缺点,诱导你连上热点,然后封装抓取你所有的流量,从而拿到你的额敏感信息
  2. 队头阻塞问题
    当 http 开启长连接时,共用一个 TCP 连接,同一时刻只能处理一个请求,那么当前请求耗时过长的情况下,其它的请求只能处于阻塞状态,也就是著名的队头阻塞问题
Last Updated: 5/6/2020, 11:48:16 AM