🔥博客简介:开了几个专栏,针对 Linux 和 rtos 系统,嵌入式开发和音视频开发,结合多年工作经验,跟大家分享交流嵌入式软硬件技术、音视频技术的干货。
✍️系列专栏:C/C++、Linux、rtos、嵌入式开发、流媒体、数据结构、网络协议、开源库、CMake、Makefile、架构设计模式等。
《HTTP总结与全梳理》系列,主要是针对HTTP协议知识点进行全面的梳理总结。此篇文章主要对HTTP协议进行详解,并列举一个简单的示例demo,该系列后续文章包括HTTP 开发调试方法抓包方法、HTTP数据上传,HTTP数据下载等文章。
嵌入式开发工作中我们常用到一些网络协议,本章我们总结http协议,后续文章我们会陆续总结https等网络协议。在总结http协议之前,我们先熟悉一下什么是超文本。
超文本的概念最早由Ted Nelson在1960年代提出,并在1990年代因万维网(World Wide Web)的发展而广为人知。
超文本(Hypertext)是一种通过HTML(超文本标记语言)组织和呈现信息的方式。允许读者通过点击或选择文本中的链接来跳转到相关的信息或内容,这种链接通常称为“超链接”(Hyperlinks)。
在超文本中,内容可以包含文本、图像、视频等多种媒体形式,并且这些内容之间可以通过超链接进行连接和跳转。这种非线性的信息组织方式使得用户能够灵活地浏览和查找信息,而不是按照传统的线性文本顺序进行阅读。
例如,在一个网页中,您会发现许多链接,当您点击一个链接时,它会带您到另一个相关的页面或内容,这就是典型的超文本应用。
1. HTTP 发展历程

HTTP的发展可以追溯到1990年代初期。它经历了几个主要版本的演变,每个版本都带来了显著的改进和优化。以下是HTTP历次发展的详细历程:
1. HTTP/0.9(1991年)
HTTP的第一个版本是在1991年由WWW之父蒂姆·伯纳斯-李(Tim Berners-Lee)提出的。这是一个极其简陋的协议,只有一个GET方法,用于请求服务器上的HTML文档。它没有HTTP头部,因此无法传输元数据,所有的响应都被视为纯文本。该版本缺少如下现代HTTP特性:
方法: 只有一个GET,没有POST、PUT等。
协议头: 没有请求和响应头。
状态码: 没有标准化的状态码。
2. HTTP/1.0(1996年)
HTTP/1.0是第一个广泛使用的版本,并在1996年通过RFC 1945标准化。它引入了以下显著改进:
更多的方法: 除了GET,新增了POST和HEAD方法。
协议头: 引入了HTTP头部信息,使请求和响应更加灵活与可扩展。
状态码: 标准化了状态码,如200 OK、404 Not Found等。
多媒体支持: 支持图片、文件下载等多种媒体类型的传输。
3. HTTP/1.1(1997年)
HTTP/1.1首次在RFC 2068中定义,并在随后通过RFC 2616进行了修订和完善。它成为了至今最为广泛应用的HTTP版本,带来了多个关键特性和性能改进:
持久连接:默认保持连接,允许多个请求和响应复用同一个TCP连接,减少了连接建立和关闭的开销。
分块传输编码: 支持服务器在文档生成的同时发送响应,从而实现动态内容的高效传输。
增强的缓存机制: 引入了强缓存控制(如Cache-Control头)和条件请求(如If-Modified-Since头)。
Host头: 支持在一个服务器上托管多个域名,从而实现虚拟主机功能。
管道化: 允许在同一连接上并行发送多个请求,而不用等待前一个请求的响应,但这个特性在实践中未得到广泛使用。
4. HTTP/2.0(2015年)
HTTP/2由IETF在2015年发布(RFC 7540),其设计目标是改善HTTP/1.x的性能瓶颈,主要通过以下技术实现:
二进制分帧: 使用二进制协议替代文本协议,提升了解析速度和传输效率。
多路复用: 在同一个TCP连接上并发地传输多个请求和响应,减少了延迟并提高了网络利用率。
头部压缩: 采用HPACK算法压缩HTTP头部,减少头部信息的传输开销。
服务器推送: 允许服务器主动向客户端推送资源,以提前加载页面所需资源,提升响应速度。
5. HTTP/3(2022 还在完善中)
HTTP/3是最新一代的HTTP协议,目前正处在标准化过程当中,部分草案已经由IETF发布。HTTP/3的关键区别在于它基于QUIC(Quick UDP Internet Connections)协议,而不是传统的TCP。QUIC是Google开发的一种基于UDP的协议,旨在解决TCP的延迟和连接可靠性问题。HTTP/3的主要特点包括:
基于UDP的QUIC协议:通过使用UDP来替代TCP,减少了连接建立时间和抗网络抖动的能力。
快速重连: 在网络改变或中断时,实现快速重连而不需要重新建立连接。
改进的流控制:在HTTP/3中,多个流之间完全独立,减少了拥塞和阻塞问题。
未来的发展
HTTP仍在不断演进中,以适应日益增长的互联网需求和新兴的网络技术。每个新版本的发布都致力于解决前一个版本中的缺陷和优化网络性能。
2. HTTP 简述
HTTP全称为 Hypertext Transfer Protocol,中文含义为“超文本传输协议”。 HTTP协议是一个基于请求/响应模式的应用层协议。
HTTP往往是基于TCP/IP协议传输数据,但也有HTTP是基于UDP协议来传输数据。通过上面讲述的HTTP发展历程可知,HTTP1.0、HTTP1.1、HTTP2.0均是基于TCP实现,而HTTP3则是基于UDP实现。
HTTP协议定义了客户端与服务器之间的通信规范,以实现对各种资源(如文本、图像、音频、视频等)的传输和访问。通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。
OSI参考模型和TCP/IP分层模型示意图为:

无状态
HTTP是无状态协议,这意味着每个请求都是独立的,服务器不保留任何有关之前请求的信息。这种设计使得HTTP具有很高的灵活性和可扩展性,但也带来了会话管理的挑战,通常通过Cookies、Session等机制实现。
无连接
HTTP的“无连接”特性指的是每次HTTP请求与响应之间并不要求客户端和服务器之间保持长时间的通信连接。具体来说,客户端在发送请求并接收到服务器的响应后,连接就会被立即关闭,这样的设计使得每个请求/响应对都独立于其他请求/响应对。
虽然HTTP协议本身是无连接的,但其具体实现上有所不同:
短连接
短连接(短链接)是HTTP/1.0协议默认使用的一种连接方式。特性如下:
- 每个请求/响应对结束后立刻关闭连接: 在HTTP/1.0中,客户端和服务器的每次请求/响应对都会建立一个新的TCP连接,并在请求完成后关闭连接。
- 高连接开销: 由于每次请求都要重新建立和关闭连接,短连接会导致较高的连接开销。
- 适用于低频率的请求: 短连接适用于那些不频繁发送请求的情况,但当请求频繁时,会带来额外的负载和延时。
长连接
长连接(长链接)是HTTP/1.1及以上版本默认支持和推荐的连接方式。长连接并不是一直保持连接不断开,而是在一定的时间范围内保持连接,以便可以复用已有的连接来处理多个请求和响应。特性如下: