HTTP(超文本传输协议)是万维网上数据通信的基础。作为OTT(超越顶层)和RTC(实时通信)技术中的一个关键组成部分,理解HTTP对于在这些领域工作的开发人员和工程师至关重要。本文将深入探讨HTTP的复杂性、其结构及其在流媒体技术如HLS(HTTP实时流媒体)中的应用。
什么是HTTP?
HTTP是一种构建在TCP之上的应用层协议。它是互联网上使用最广泛的协议,促进超文本文档、图像、视频和其他多媒体内容的传输。HTTPS(安全HTTP)是HTTP的安全版本,使用SSL/TLS加密进行数据传输。
HTTP URL结构
HTTP资源通过统一资源定位符(URL)进行标识。一个典型的HTTP URL具有以下结构:
http://host[:port]/[path/]filename[?param1=value1¶m2=value2][#fragment]
http:
//
: 表示使用HTTP协议(或https:
//
表示使用HTTPS)host
: 服务器的域名或IP地址port
: 端口号(HTTP的默认端口为80,HTTPS为443)path
: 服务器上资源的路径filename
: 资源的名称param
,value
: 查询参数fragment
: 资源的特定部分,通常称为锚点
HTTP通信
HTTP通信涉及来自客户端(用户代理)的请求和来自服务器(源服务器)的响应。客户端与服务器之间可能存在代理服务器、网关或隧道等中介。
HTTP请求结构
一个HTTP请求由三个部分组成:
- 请求行
- 消息头
- 请求体
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响应也由三个部分组成:
- 状态行
- 消息头
- 响应体
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>
你好,HTTP!
</body>
</html>
HTTP状态码
HTTP状态码是服务器在响应客户端请求时返回的三位数字。它们分为五个类别:
状态码 | 描述 | 含义 |
1XX | 信息性 | 请求已接收,继续处理 |
2XX | 成功 | 操作已成功接收、理解并接受 |
3XX | 重定向 | 需要进一步采取行动以完成请求 |
4XX | 客户端错误 | 请求包含错误语法或无法满足 |
5XX | 服务器错误 | 服务器未能满足明显有效的请求 |
以下是一些常见状态码:
状态码 | 文本 | 描述 |
200 | 成功 | 请求成功 |
206 | 部分内容 | 部分内容已交付 |
301 | 永久移动 | 请求的URL已永久移动 |
302 | 找到 | 临时URL重定向 |
304 | 未修改 | 自上次请求以来资源未修改 |
400 | 错误请求 | 服务器无法处理由于客户端错误的请求 |
403 | 禁止 | 服务器拒绝授权请求 |
404 | 未找到 | 请求的资源找不到 |
500 | 内部服务器错误 | 当服务器失败时的通用错误消息 |
502 | 错误网关 | 服务器从上游服务器收到无效响应 |
503 | 服务不可用 | 服务器暂时无法处理请求 |
有关更多信息,请参考
HTTP在流媒体中的应用:HLS(HTTP实时流媒体)
HLS是一种由苹果公司开发的流媒体协议,它利用HTTP进行媒体传输。其工作原理是将整体流分解为一系列小的基于HTTP的文件下载。
HLS工作流程
- 客户端首先检索主播放列表文件(M3U8)。
- M3U8文件包含媒体段文件(TS文件)的URL。
- 客户端随后通过HTTP下载这些TS文件。
- 对于实时流媒体,客户端持续更新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文件的结构如下:
在头部之后,有多个标记数据块。标签格式与FLV封装一致。在在线播放过程中,通常只需要检索一个SWF文件。
HDL播放过程遵循以下步骤:
- 通过HTTP检索SWF文件
- 使用SWF文件获取FLV文件
- 解包、解码并显示FLV文件内容
- 持续获取和处理FLV文件数据,解码并显示直到达到SWF文件的EndTag
此过程演示了HDL如何利用HTTP不仅用于初始文件检索,还用于整个流媒体过程,使其成为协议功能的重要组成部分。
有关SWF文件的更多详细信息,请参阅Adobe开发者中心。
结论
HTTP构成了网络通信的基础,并在现代流媒体技术如HLS中发挥着至关重要的作用。理解其结构、状态码及其在流媒体协议中的应用对在OTT和RTC领域工作的开发人员至关重要。随着网络的不断发展,HTTP仍然是一项基础技术,适应数字通信不断变化的需求和用例。