# HTTP 知识汇总

# 含义

HTTP 是超文本传输协议,即 HyperText Transfer Protocol. HTTP 是一个在计算机世界里专门在【两点】之间【传输】文本、图片、视频等超文本数据的【约定和规范】。 以 ASCII 码传输,建立在 TCP/IP协议上的应用层规范。

  • 分为三部分:状态行、请求头、消息主体。

# 状态码

状态码 含义
1xx 提示信息,协议处理的中间状态,还需后续操作
2xx 成功,报文已经收到并且被正确处理
3xx 重定向,资源位置发生变动,需要客户端重新发出请求
4xx 客户端错误,报文有误,服务器无法处理
5xx 服务器错误,服务器在处理请求时发生了错误
  • 201 Created,请求已成功,并创建了一个新的资源,主要用于POST请求。
  • 202 Accepted,请求已收到,但服务器还未处理。
  • 403,表示服务器禁止访问资源,并不是客户端的请求出错。

# 状态码 301 与 302

  • 301代表永久性重定向
  • 302代表暂时性性重定向
  • 重定向:浏览器拿到服务器返回的状态码后会自动跳转到一个新的URL地址(从响应首部Location字段中获取)
  • 301使用场景
    • 域名到期或者想换个域名。
    • 空间服务器不稳定,换空间的时候。(服务器上一定大小的磁盘空间)
  • 网址劫持(尽量使用301跳转)
    • 网址A重定向到网址B,大部分搜索引擎只会去抓取目标网址B。但假如网址A很短,网址B很长且有各种参数,那么搜索引擎就可能保留网址A,这就导致网址B的内容全都显示再网址A上了。这就是网址劫持。
    • 导致网站B在为网站A做贡献,网址A的搜索排名变的更前了。

# 状态码 204

  • 204 No content,请求执行成功,但响应头没有 body 数据。
  • 浏览器不用刷新页面.也不用导向新的页面。
  • 比如页面有个form表单,正常提交后会进行跳转,若状态码时204,则不会进行跳转,a标签也是一样。
  • 对于一些提交到服务器处理的数据,只需返回是否成功的情况,可以考虑204,从而省掉多余的数据传输。

# 状态码 502、503、504

  • 502:服务器自身正常运行,从上游服务器收到无效响应。比如:nginx + tomcat。此时tomcat就是上游服务器(产生内容的服务器)
  • 503:(服务不可用) 服务器目前无法使用(由于超载或停机维护)。服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后重试”的意思.
  • 504:网关超时,由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答

# HTTP常用字段

Host:指定请求的服务器域名

Content-Length:服务器返回数据的长度(字节)

Connection:要求服务器使用 TCP 持久连接(HTTP/1.1默认就是持久连接),兼容旧版,指定Connection: keep-alive

Accept:表示客户端能接收的数据格式

Content-Type:表示服务端回应的数据格式

Accept-Encoding:表示客户端能接收什么样的数据压缩格式

Content-Encoding:表示服务端采用什么样的数据压缩格式

# HTTP缺点

  • 无状态(好处是减轻服务器的负担,坏处是每操作一次都要验证身份信息)

    • 目前可通过Cookie,在请求和响应报文中加入Cookie信息来控制客户端的状态。
  • 通信使用明文(不加密),内容可能会被窃听。

    • 通信的加密,即通过SSL(Secure Socket Layer, 安全套接层)或者TLS(Transport Layer Security,安全层传输协议)的组合使用,即 用SSL建立安全通信线路,然后在这条线路上进行HTTP通信。称之为HTTPS
    • 内容加密,即对通信的内容进行加密处理,客户端跟服务器应具备加密和加密的机制。
  • 不验证通信方的身份,可能遭遇伪装。

    • 可能是伪装的服务器或者客户端。
    • 无法确定正在通信的对方是否有访问权限
    • 一些无意义的请求都会照单全收
  • 无法证明报文的完整性

    • 在通信的过程,可能出现攻击篡改。
  • HTTP + 加密 + 认证 + 完整性保护 = HTTPS

# HTTP/1.0

  • 可传输文字、图像、视频等超文本。
  • 除了GET,引入POSTHEAD命令。
  • 每次通信都必须包含头信息。新增状态码、缓存、内容编码等。
  • 头信息必须是 ASCII 码,后面的数据可以是其他格式(Content-Type),也可以压缩(Content-Encoding
  • 缺点
    • 每个TCP连接只能发一个请求,发送数据完毕后,连接就关闭。(Connection: keep-alive,要求服务器不要关闭TCP连接,从而达到请求复用,但这不是标准,不同的实现行为可能不一致。)

# HTTP/1.1

  • 长连接(持久连接)
    • HTTP/1.0, 每发起一个请求都需要新建一次TCP连接(三次握手),且是串行请求。
    • HTTP/1.1,新建一次TCP连接后,可进行多次请求,只要任意一端没有明确提出断开连接,则一直保持TCP连接。
  • 管道网络传输
    • 在同一个TCP连接里,可以同时发出多个请求,不需要依次的发。
    • 但是服务器还是按照顺序,依次回应相应的请求。假设前面的回应特别慢,就造成后面许多请求排队着,这就是队头阻塞
      • 减少请求数:合并脚本和样式表。

# HTTP/2 (不打算再发子版本,所以是叫 HTTP/2 版本)

  • 新的二进制格式HTTP/1.x是基于文本协议的格式解析,文本的表现形式多样性,而二进制只认0和1的组合,实现方便且健壮。
  • 多路复用。帧代表最小单位,每一会标识属于哪个,同一TCP请求可发送多个请求,通过的标识来确定属于哪个请求的。
  • header压缩HTTP/1.x的header带有大量信息,且每次请求都会带。而2.0在通信双方各自缓存了一份header fields表,即避免了重复的传输,又减小了传输的大小。
  • 服务器推送

# HTTP 原理

  1. 地址解析 (协议名、域名、端口、对象路径)
  2. 域名系统DNS解析域名,得到IP地址
  3. 封装成HTTP数据请求包
  4. 封装成TCP包,建立TCP连接(三次握手) SYN => SYN + ACK => ACK
  5. 客户端发送请求命令,格式为:统一资源标识符(URI)、协议版本号和信息内容
  6. 服务器响应
  7. 服务器关闭TCP连接。Connection: keep-alive可保持连接不关闭。 硬核!30 张图解 HTTP 常见的面试题 (opens new window)
最后一次修改时间: 9/28/2020, 11:37:23 AM