HTTP 协议

March 22, 2016

计算机网络

HTTP :Hyper Text Transfer Protocol , 超文本传输协议。这是一个应用非常广泛的网络协议,大量的应用促进了发展,同时也阻碍了发展,每一个版本的制定变成了一件非常谨慎小心的事情。

可靠

HTTP 是一个应用层协议,协议中定义 HTTP 建立在一个可靠的协议之上,虽然一般这个可靠的协议就是传输层的 TCP,但不等于只能是 TCP。TLS 和 SSL 都是建立在 TCP 之上,他们也是可靠的协议,并且他们属于应用层。基于 TLS 或者 SSL 的 HTTP 被称为 HTTPS。

一个可靠的底层协议,保证了 HTTP 协议也是一个可靠的协议,所以一个 HTTP 请求肯定可以收到服务器的响应,否则就是请求失败。

无状态 

HTTP 是一个无状态协议,在两次请求之间,服务器不会保留任何状态信息的。也就是相当于每次请求都是新的,陌生的。这个无状态是相对与有状态来说的,想我之前做过的一个 RTSP 的中间层,那个 RTSP 就是有状态的。播放器和服务器建立一个连接后,服务器保留这播放器的状态,当播放器的状态发生变化的时候,比如 PAUSE,START 等状态码告诉服务器,服务器会根据当前的状态码和刚收到的状态码来做出响应。

在 HTTP 1.0 制定的时候,人们的网上生活并没有那么丰富,所以无状态是一个很好的选择。随着后来技术的发展,网上的应用越来越丰富,人们通过 cookie,session 等技术来实现有状态的沟通,但是,HTTP 本身还是无状态的,及时是 HTTP 2.0。

HTTP 1.0 & HTTP 1.1 & HTTP 2.0

HTTP 经过了三个版本的更新,已经发生了很大的变化,但是主要的结构还是没有变化的。目前 2.0 还没有大规模使用,1.0 因为历史原因,还有很多服务器在使用,并且可能长期使用。而 1.1 是目前最流行的版本,而且一般 1.1 的服务器同时支持 1.0 。所以,在未来的一段时间内,三个版本还是会长期共存的。

HTTP 1.1 产生的大背景是因为 HTTP 1.0 中,每个请求都需要一次完整的 TCP 三次握手,建立连接,发送数据,接受数据,然后四次握手断开连接。这样带来一个问题就是已经建立的连接用完就被抛弃掉了,像现在主流的网站,一个网页需要发送的请求是很多的,假设一个网页里包含了 100 张图片,那么浏览器需要向服务器发送 100 个图片请求,如果浏览器直接发送100个请求,可能会造成短时间内网络堵塞,请求失败,也可能因为短时间内的大量访问,导致服务器的连接数量太大,处理不过来。一般浏览器为了避免这种情况的发生,会做一个请求队列,避免短时间内发送太多的请求,但这就导致网页打开变慢。

HTTP 1.1 加入了连接复用的概念,还是假设 100 个图片请求,浏览器第一次发送 10 个图片请求,服务器也只接收到 10 个请求,服务器响应结束后,并不会马上关闭连接,而是等待浏览器再次请求,这样可以大大降低连接建立的个数和服务器维护连接数的成本。

现在网页元素是非常丰富的,打开一个网页需要请求上百个请求是很常见的事情,一些大的新闻网站可能会高达几百个请求。及时是 HTTP 1.1 的复用也满足不了需求,而 2.0 还姗姗来迟,在这个过度阶段,人们想出了多域名来解决问题。一般浏览器会限制同一时刻往一个域发送请求的个数,而如果把这些请求分散到不同的域,那么就可以提高浏览器请求的并发数了。而剩下的事情就是搭建更多的主机了。这些主机会被设计为用来负责不同的事务,比如主站用来处理业务逻辑,分站处理一些静态文件的请求,比如图片、网页样式、网页脚本等等。

在此之上,还有更加高级的 CDN,这里就不讨论了。(我也不会啊~~)

随着网络的发展,网络安全越加重要了,因为在网络上传输的已经不仅仅是一些简单的文档,网页了,而可能是一些涉及个人隐私的信息,还有一些跟金钱有关的信息,这个时候,HTTPS 就产生了。HTTPS 在保证安全的同时,牺牲的是效率,一般 HTTPS 的网页打开的速度要比 HTTP 慢很多,因为 HTTPS 不是直接使用的 TCP 而是建立在 TSL 或者 SSL 协议之上的,这降导致一次完整的请求比普通的 HTTP 请求要多了很多次客户端和服务器端的交互。

HTTP 2.0 增加了一个多路复用请求的概念,建立起一次连接后,可以同时发送不同的请求,还是假设 100 张图片,可能只需要建立起一个连接,然后浏览器把 100 个图片的请求同时发送到服务器端,服务器处理后,还是使用这个连接,把 100 个图片的响应交付给浏览器,在这中间,加了一个帧的概念,之前一个独立的请求,在这里变成一个帧。
当然,HTTP 2.0 增加的远远不止这些。

HTTP 状态码

1xx 请求收到,继续处理

  • 100 客户必须继续发出请求
  • 101 客户端要求服务器根据请求转换 HTTP 版本

2xx 操作成功

  • 200 成功
  • 201 提示知道新的URL
  • 204 请求收到,但返回信息为空
  • 206 服务器已经完成了部分 GET 请求

3xx 请求完成,但需进一步处理

  • 300 请求的资源可在多出得到
  • 301
  • 304 文件没有变化

4xx 错误

  • 403 禁止访问
  • 404 文件不存在

5xx 服务器错误

  • 500 服务器内部错误
  • 502 网关错误

--- EOF ---

添加新评论