HTTP的秘密(1)协议本质 | 8月更文挑战

426 阅读5分钟

HTTP协议(Hyper Text Transfer Protocol)超文本传输协议。HTTP是应用层的传输协议,设计初衷是为了发送和接收HTML页面。

我们在输入网址时的http:// 就是在告诉浏览器使用的通信协议类型。

那么HTTP协议是如何工作的呢? 比如要展示一个网页:

  1. 浏览器首先向目标网站,发送HTTP请求来获取页面的HTML文档
  2. 再解析文档中的资源信息,向其路径发送其他HTTP请求
  3. 获取JS脚本或CSS样式来进行页面渲染,以及其它一些页面资源(图片和视频等)
  4. 最后浏览器将这些资源整合到一起,展现出一个完整的网页。

HTTP协议栈

image.png

可以看到,HTTP位于应用层,HTTP报文(message)主要通过传输层的TCP连接来发送。HTTP协议传输的不是TCP里被切分的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。这里的数据包括:图片、音频、视频、甚至是压缩包。

上图中的TLS部分,是HTTPS协议新加的内容,作用是身份认证和加密,我会在HTTPS文章中详细介绍。

我再贴一张图,显示互联网各个通信层不同的数据格式:

image.png

HTTP协议的本质

研究问题要看本质,HTTP的本质有如下5点:

  1. HTTP采用基于“客户端/服务器的请求--应答”模式(request–response in the client–server computing model), 这就说明了HTTP 协议是一个“双向协议”。

    • 客户端:HTTP中统称为user-agent,是任何能够为用户发起HTTP请求行为的程序。这个角色通常都是浏览器。
    • 服务器:Server,这里的服务器不一定是一台机器,也可以是一组服务器组成的计算机集群,也可能是安装在一台计算机上的众多Servers。
  2. HTTP协议不是端到端END-END,而是hop by hop。这就意味着HTTP允许中介网元去提升或发起客户端与服务器间的通信。这增强了HTTP协议的扩展性和灵活性。 image.png

  • 客户端到服务器的数据传输过程中可以存在任意多个“中间人”,而这些中间人也都遵从 HTTP 协议,只要不打扰基本的数据传输,就可以添加任意的额外功能,例如安全认证、数据压缩、编码转换等 等,优化整个传输过程。
    • 比如CDN这种网络缓存服务,它代替源站服务器响应客户端的资源请求,扮演着透明代理和反向代理的角色。
    • HTTP代理服务器在私有网络中可以帮助没有公网IP的客户端通信,通过中继从外部服务器中继消息。充当网络信息"中转站"的角色。
  • 但事情都有两面性,中间人也导致了HTTP的安全性受到很大威胁,会有中间人攻击,篡改,窃听等问题出现,这就引出了HTTPS协议的诞生。我在之后文章会谈到。
  1. HTTP是无连接,这句话有两层意思:

    • 第一层是HTTP协议并不会建立起两个网元的连接,这是TCP要做的事情,在应用层,客户端和服务器是无连接的。

    • 第二层是,HTTP/1.0会限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接,并不会一直保持,如果有新的请求就需要重建连接,这就是“短链接”的概念。采用这种方式可以节省传输时间。

    • HTTP协议产生于互联网,网络内容访问的特点是突发性强,间歇性大,访问量大,并发性强,连续性不强,并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,因此HTTP被设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。

    • 从HTTP/1.1起,默认都开启了“长连接”特性,Keep-Alive,保持连接特性,当完成一个HTTP请求后,客户端和服务器之间用于传输的TCP连接不会立即释放,如果客户端再次访问这个服务器上的资源,会继续使用这一条已经建立的TCP连接,但Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器中设定这个时间。

  2. 通过HTTP协议发送的多媒体资源是不受格式限制的,意思是,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。

    • 同时,为了提高沟通效率,HTTP协议支持MIME-type内容类型。
  3. HTTP是无状态的:无状态是指协议对于事务处理没有记忆能力。

    • 如上文提到的,web内容的访问连续性低,间歇性大,突发性强,两个请求之间的关联性弱。这意味着大部分HTTP请求都是独立的。所以HTTP协议在设计时利用这个特点。

    • 优势是:降低对带宽的需求,减少信令开销,节约网络和服务器处理资源。

    • 劣势是:如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

    • 解决方案是,应用缓存Cookies。把Cookies添加到HTTP消息中,创建一个会话session,让每次请求都能共享相同的上下文信息,达成相同的状态。使用Cookies可以创建有状态的会话。

好了,看透了HTTP协议的本质,我们在下一篇继续了解HTTP协议不同版本的特性。




感谢阅读,如有不准确或错误请留言指正,我会及时修正

总结不易,请勿私自转载,否则别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616

参考资料:

MDN HTTP developer.mozilla.org/

TCP/IP 各层的数据格式 静水流深blog.csdn.net/Hongwei_199…

HTTP教程 菜鸟教程 www.runoob.com/http/http-t…