HTTP 协议
| OSI 七层模型 | TCP/IP 五层模型 | TCP/IP 四层模型 | 对应 UDP | 对应 TCP/IP 协议族的协议 |
|---|---|---|---|---|
| 应用层 | 应用层 | 应用层 | 数据 | HTTP、TFTP、FTP、NFS、WAIS、SMTP |
| 表示层 | Telnet、Rlogin、SNMP、Gopher | |||
| 会话层 | SMTP、DNS | |||
| 传输层 | 传输层 | 传输层 | 段 | TCP、UDP |
| 网络层 | 网络层 | 网络层 | 包 | IP、ICMP、IGMP |
| 数据链路层 | 数据链路层 | 网络接口层 | 帧 | ARP、RARP、Ethernet、PPP |
| 物理层 | 物理层 | 数据比特流 | IEEE 802.1A、IEEE 802.2 ~ IEEE 802.11 |
从前面网络的模型中可以看到位于应用层的 HTTP 协议。

一、什么是 HTTP 协议
HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一个用于从服务器传输超文本到本地浏览器的传送协议,是基于 TCP/IP 协议的应用层协议。

通常使用的网络(包括互联网)是在 TCP/IP 协议族的基础上运作的,而 HTTP 属于它内部的一个子集,基于 TCP/IP 协议通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。它不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认使用 80 端口。
二、HTTP 的特点
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。
灵活:HTTP 允许传输任意类型的数据对象。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP 协议是无状态的,HTTP 协议自身不对请求和响应之间的通信状态进行保存,任何两次请求之间都没有依赖关系。

三、HTTP 报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。
HTTP 报文包括请求报文和响应报文两大部分:
- 请求端(客户端)的 HTTP 报文叫做请求报文;
- 响应端(服务端)的叫做响应报文。

1、请求报文
请求报文包括请求行、请求头和请求体。

1-1、请求行
请求行用来说明请求类型,请求的资源及使用的 HTTP 版本,这些字段都由空格符分隔。
GET /test/hi-there.txt HTTP/1.1
上面代码中,GET 为请求方法,/test/hi-there.txt 为请求 URL,HTTP/1.1 代表协议和协议的版本(在 HTTP/1.0 之前不要求请求行中包含 HTTP 版本号)
1-2、请求头
请求头由关键字和值成对组成,每行一对,关键字和值用英文冒号 : 分隔。
请求头部通知服务器关于客户端请求的信息,包含许多客户端环境和请求正文的信息,例如:
- Host:表示主机名,虚拟主机;
- Connection:HTTP/1.1 增加的,使用 keepalive 即持久连接,一个连接可以发多个请求;
- User-Agent:请求发出者,兼容性以及定制化需求。
注意:最后一个请求头之后是一个空行,表示请求头已经结束,接下来的是请求正文。
1-3、请求体
请求体可以承载多个请求参数的数据。
name=tom&password=1234&realName=tomson
上面代码,承载着 name、password、realName 三个请求参数。
2、响应报文
响应报文包括响应行、响应头和响应体。

2-1、响应行
响应行由 HTTP 版本、状态码、状态消息三部分组成。
2-2、响应头
响应头用来说明客户端要使用的一些附加信息。
注意:响应头后面的空行是必须的。
2-3、响应体
响应体是服务器返回给客户端的文本信息。
四、HTTP 请求方法
HTTP 1.0 定义了三种请求方法:GET、POST 和 HEAD。
HTTP 1.1 新增了五种请求方法:PUT、DELETE、OPTIONS、CONNECT 和 TRACE。
1、GET 请求资源
GET 请求指定的页面信息,并返回实体主体。指定的资源经服务端解析后返回响应内容。也就是说,如果请求的资源是文本,那就保持原样返回;如果是像 CGI(Common Gateway Interface,通用网关接口)那样的程序,则返回经过执行后的输出结果。


2、POST 传输数据
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。


3、PUT 传输文件
PUT 从客户端向服务器传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。但鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般的 Web 网站不使用该方法。


4、HEAD 获得报文头部
HEAD 方法和 GET 方法一样,只是不返回报文主体部分,用于获取报文头部。


5、DELETE 删除文件
DELETE 请求服务器删除指定的页面,是与 PUT 相反的方法。HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机制,所以一般的 Web 网站也不使用 DELETE 方法。当配合 Web 应用程序的验证机制,或遵守 REST 标准时还是有可能会开放使用的。


6、OPTIONS 查询支持的方法
OPTIONS 用来查询针对请求 URI 指定资源支持的方法。


7、TRACE 追踪路径
TRACE 回显服务器收到的请求,主要用于测试或诊断,是让服务端将之前的请求通信环回给客户端的方法。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最后接收到请求的服务端则返回状态码 200 OK 的响应。
客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改/篡改的。但 TRACE 方法不怎么常用,再加上它容易引发 XST(Cross-SiteTracing,跨站追踪)攻击,通常就更不会用到了。


8、CONNECT 要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。


五、HTTP 状态码
HTTP 状态码是当客户端向服务端发送请求时,描述返回的请求结果。
HTTP 状态码由三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx指示信息--表示接收的请求正在处理2xx成功--表示请求已被成功处理完毕3xx重定向--需要进一步的操作以完成请求4xx客户端错误--请求有语法错误或请求无法实现5xx服务端错误--服务器未能实现合法的请求
常见的状态码:
200表示从客户端发来的请求在服务端被正常处理。
204表示请求处理成功,但没有资源返回。
301表示永久重定向。即请求的资源已被永久分配了新的 URI。
302表示临时重定向。即请求的资源已被临时分配了新的 URI。
304表示服务端已允许请求访问资源,但文档的内容并没有改变。
307也表示临时重定向,但会遵照浏览器标准,不会从 POST 变成 GET。
400表示请求报文中存在语法错误。
401表示未授权,当前请求需要用户验证。
403表示对请求资源的访问被服务器拒绝了。
404表示服务器上无法找到请求的资源。
500表示服务端在执行请求时发生了错误。
503表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
六、持久连接
HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接,每次的请求都会造成无谓的 TCP 连接建立和断开,增加通信量的开销。

而 HTTP/1.1 默认使用持久连接,在持久连接的情况下,服务端响应后将 TCP 连接保持打开状态,后续的请求和响应可以通过这个连接发送。

持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务端的负载。
另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。
七、管线化
管线化就是将请求打包一次性发过去,响应打包一次性传回来。管线化的前提是在持久连接下。

假如当请求一个包含 10 张图片的 HTML Web 页面,与挨个连接相比,用持久连接可以让请求更快结束,而管线化技术则比持久连接还要快。
持久连接:
请求1 → 响应1 → 请求2 → 响应2 → 请求3 → 响应3
管线化:
请求1 → 请求2 → 请求3 → 响应1 → 响应2 → 响应3
八、HTTP 优化方案
- TCP复用
TCP 连接复用是将多个客户端的 HTTP 请求复用到一个服务器端 TCP 连接上,而 HTTP 复用则是一个客户端的多个 HTTP 请求通过一个 TCP 连接进行处理。前者是负载均衡设备的独特功能;而后者是 HTTP 1.1 协议所支持的新功能,目前被大多数浏览器所支持。
- 内容缓存
将经常用到的内容进行缓存起来,那么客户端就可以直接在内存中获取相应的数据了。
- 压缩
将文本数据进行压缩,减少带宽。
- SSL 加速(SSL Acceleration)
使用 SSL 协议对 HTTP 协议进行加密,在通道内加密并加速。
- TCP 缓冲
通过采用 TCP 缓冲技术,可以提高服务器端响应时间和处理效率,减少由于通信链路问题给服务器造成的连接负担。
九、HTTP 与 TCP 的区别
HTTP 是要基于 TCP 连接基础上的,简单的说,TCP 就是单纯建立连接,不涉及任何请求的数据。而 HTTP 是用来收发数据,即实际应用的。
场景:下个月你就要结婚了,打个电话给老王。
打开通讯录,查找“老王”的电话号码:老王 -> 13987654321 (DNS 解析)
用手机拨打了 13987654321(IP)
手机连接到联通的基站(路由器),联通(自己的网关),联通通过移动的帮助找到了老王的手机 (MAC)
老王的手机开始响铃。“嘟……”(TCP 握手)
“喂?老绿啊!” “哈哈,是我啊,老王!”(连接建立)
“下个月我结婚,你有空吗?”(开始传输数据)“噢,有啊!...”
“那你记一下地址啊,北京市东长安街16号午门太和殿...” “诶,你慢点说” (流量控制)
“北京市”(缩小了滑动窗口)
“嗯,然后呢?”(ACK)
“东长安街16号”“东……16号”(ACK)
“你再说一遍,我没听清!”(传输失败,数据包丢失)
“太和殿”(重传)
“好!记下了”(传输成功)
“那回见啊!”(准备断开连接)
“好嘞!”【通话已结束】(连接断开)
上面的例子中:
对话中说的“汉语”就是 HTTP。
也可以用其他协议传递,比如 “I'm getting married next month”,只要对方能理解协议,那就是同一个意思。
电话线路相当于一个 TCP 连接,TCP 提供了流量控制、数据重传等机制保证了数据可靠顺序传输。