# 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,引入POST和HEAD命令。 - 每次通信都必须包含头信息。新增状态码、缓存、内容编码等。
- 头信息必须是 ASCII 码,后面的数据可以是其他格式(
Content-Type),也可以压缩(Content-Encoding) - 缺点
- 每个TCP连接只能发一个请求,发送数据完毕后,连接就关闭。(
Connection: keep-alive,要求服务器不要关闭TCP连接,从而达到请求复用,但这不是标准,不同的实现行为可能不一致。)
- 每个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 原理
- 地址解析 (协议名、域名、端口、对象路径)
- 域名系统
DNS解析域名,得到IP地址 - 封装成
HTTP数据请求包 - 封装成TCP包,建立
TCP连接(三次握手) SYN => SYN + ACK => ACK - 客户端发送请求命令,格式为:统一资源标识符(URI)、协议版本号和信息内容
- 服务器响应
- 服务器关闭
TCP连接。Connection: keep-alive可保持连接不关闭。 硬核!30 张图解 HTTP 常见的面试题 (opens new window)