重要概念

理解HTTP:网络通信的支柱

10 分钟阅读
Feb 18, 2025

HTTP(超文本传输协议)是万维网数据通信的基础。作为OTT(超越顶层)和RTC(实时通信)技术中的关键组成部分,理解HTTP对从事这些领域的开发者和工程师至关重要。本文将深入探讨HTTP的复杂性、其结构以及在HLS(HTTP直播流)等流媒体技术中的应用。

什么是HTTP?

HTTP是建立在TCP之上的应用层协议。它是互联网上最广泛使用的协议,促进超文本文档、图像、视频和其他多媒体内容的传输。HTTPS(安全超文本传输协议)是HTTP的安全版本,使用SSL/TLS加密进行数据传输。

HTTP URL结构

HTTP资源通过统一资源定位符(URL)进行标识。典型的HTTP URL具有以下结构:

http://host[:port]/[path/]filename[?param1=value1&param2=value2][#fragment]
  • http://: 表示使用HTTP协议(或https://表示使用HTTPS)
  • host: 服务器的域名或IP地址
  • port: 端口号(HTTP的默认端口为80,HTTPS的默认端口为443)
  • path: 服务器上资源的路径
  • filename: 资源的名称
  • param, value: 查询参数
  • fragment: 资源的特定部分,通常称为锚点

HTTP通信

HTTP通信涉及来自客户端(用户代理)的请求和来自服务器(源服务器)的响应。在客户端和服务器之间可能存在代理服务器、网关或隧道等中介。

HTTP请求结构

一个HTTP请求由三部分组成:

  1. 请求行
  2. 消息头
  3. 请求体

HTTP请求示例:

POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml, application/xml; q=0.9,*/*; q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length: 26
Content-Type: application/x-www-form-urlencoded

username=abc&password=1234

HTTP响应结构

一个HTTP响应也由三部分组成:

  1. 状态行
  2. 消息头
  3. 响应体

HTTP响应示例:

HTTP/1.1 200 OK
Date: Sun, 17 Mar 2013 08:12:54 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: keep-alive
Content-Type: text/html; charset=utf-8

<html>
<head>
<title>HTTP响应示例</title>
</head>
<body>
Hello HTTP!
</body>
</html>

HTTP状态码

HTTP状态码是服务器在响应客户端请求时返回的三位数字。它们分为五类:

状态码描述含义
1XX信息性请求已接收,正在继续处理
2XX成功操作成功接收、理解并接受
3XX重定向需要进一步操作以完成请求
4XX客户端错误请求包含错误语法或无法满足
5XX服务器错误服务器未能满足明显有效的请求

以下是一些常见的状态码:

状态码文本描述
200OK请求成功
206部分内容传递部分内容
301永久移动请求的URL已被永久移动
302找到临时URL重定向
304未修改自上次请求以来资源未修改
400错误请求服务器无法处理由于客户端错误
403禁止服务器拒绝授权请求
404未找到请求的资源无法找到
500内部服务器错误服务器失败时的一般错误信息
502错误网关服务器从上游服务器收到无效响应
503服务不可用服务器暂时无法处理请求

更多信息,请参考

流媒体中的HTTP:HLS(HTTP直播流)

HLS是苹果开发的一种流媒体协议,使用HTTP进行媒体传输。它通过将整体流分成一系列小的基于HTTP的文件下载来工作。

HLS工作流程

HTTP Request and Response Flow in Streaming Media (HLS)

  1. 客户端首先检索主播放列表文件(M3U8)。
  2. M3U8文件包含媒体段文件(TS文件)的URL。
  3. 客户端随后通过HTTP下载这些TS文件。
  4. 对于直播流,客户端不断更新M3U8文件以获取新的TS文件URL。

M3U8文件结构

M3U8文件是基于文本的,由一系列标签组成。以下是一个示例:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10,
http://media.example.com/segment0.ts
#EXTINF:10,
http://media.example.com/segment1.ts
#EXTINF:10,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST

以下是常见的M3U8标签表:

标签含义
#EXTM3U必须是每个M3U8文件的第一行
#EXTINF指定TS文件的持续时间
#EXT-X-TARGETDURATION指定任何TS文件的最大持续时间
#EXT-X-MEDIA-SEQUENCE指定第一个TS文件的序列号
#EXT-X-KEY指定TS文件的加密方法
#EXT-X-PROGRAM-DATE-TIME指定TS文件中第一个样本的日期/时间
#EXT-X-ALLOW-CACHE指定客户端是否可以缓存下载的媒体文件
#EXT-X-PLAYLIST-TYPE提供有关播放列表类型的信息(事件或视频点播)
#EXT-X-ENDLIST指示M3U8文件的结束

HTTP动态直播流(HDL)

HTTP动态直播流(HDL),更常见的是HTTP-FLV,是由Adobe开发的流媒体协议。它利用HTTP进行FLV(Flash视频)文件的在线传输,使其成为网络流媒体领域的重要技术。

HDL的工作原理与HLS(HTTP直播流)相似。两种协议都使用HTTP来检索相关文件,然后获取相应的音频和视频流数据。然而,HLS使用M3U8和TS文件,而HDL则使用SWF(Shockwave Flash)和FLV文件。这些文件格式由Adobe设计,传统上需要Flash技术支持,这限制了它们在HTML5环境中的直接使用。(在支持MSE的浏览器中,可以使用像flv.js这样的库来启用支持,但需考虑兼容性问题。)

SWF(Shockwave Flash)是一种由Macromedia(后被Adobe收购)开发的专有格式,用于其Flash动画设计软件。它在网页设计和动画制作中得到了广泛使用。SWF文件的结构如下:

HTTP Live Streaming (HLS): Structure and Workflow
在Header之后,有多个带标签的数据块。标签格式与FLV封装一致。在在线播放过程中,通常只需检索一个SWF文件。

HDL播放过程遵循以下步骤:

  1. 通过HTTP检索SWF文件
  2. 使用SWF文件获取FLV文件
  3. 解封装、解码并显示FLV文件内容
  4. 持续获取和处理FLV文件数据,解码并显示直到达到SWF文件的EndTag

这个过程展示了HDL如何利用HTTP不仅用于初始文件检索,还用于整个流媒体过程,使其成为协议功能的一个重要部分。

有关SWF文件的详细信息,请参考Adobe开发者中心:http://www.adobe.com/devnet/swf.html

结论

HTTP构成了网络通信的基础,并在现代流媒体技术如HLS中发挥着至关重要的作用。理解其结构、状态码及其在流媒体协议中的应用对于从事OTT和RTC领域的开发者至关重要。随着网络的不断发展,HTTP仍然是一项基础技术,适应着不断变化的数字通信需求和用例。