Skip to main content

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 端口。

「点击查看浏览器输入 URL 发生了什么」

二、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 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。

「点击查看 GET 和 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 是用来收发数据,即实际应用的。

TCP/IP 与 HTTP 通俗解释

场景:下个月你就要结婚了,打个电话给老王。

打开通讯录,查找“老王”的电话号码:老王 -> 13987654321 (DNS 解析)

用手机拨打了 13987654321(IP)

手机连接到联通的基站(路由器),联通(自己的网关),联通通过移动的帮助找到了老王的手机 (MAC)

老王的手机开始响铃。“嘟……”(TCP 握手)

“喂?老绿啊!” “哈哈,是我啊,老王!”(连接建立)

“下个月我结婚,你有空吗?”(开始传输数据)“噢,有啊!...”

“那你记一下地址啊,北京市东长安街16号午门太和殿...” “诶,你慢点说” (流量控制)

“北京市”(缩小了滑动窗口)

“嗯,然后呢?”(ACK)

“东长安街16号”“东……16号”(ACK)

“你再说一遍,我没听清!”(传输失败,数据包丢失)

“太和殿”(重传)

“好!记下了”(传输成功)

“那回见啊!”(准备断开连接)

“好嘞!”【通话已结束】(连接断开)

上面的例子中:

对话中说的“汉语”就是 HTTP。

也可以用其他协议传递,比如 “I'm getting married next month”,只要对方能理解协议,那就是同一个意思。

电话线路相当于一个 TCP 连接,TCP 提供了流量控制、数据重传等机制保证了数据可靠顺序传输。