网络流媒体协议之——HTTP初探

终于写到HTTP协议了,内容实在太多,摘了写最最基础的内容来写一下,后面工作还会用到,用到的部分再深入写吧。

HTTP(Hyper Text Transfer Protocol),即超文本传输协议,于1990年问世,最早的版本是HTTP/0.9。最早作为标准正式公布的HTTP版本是HTTP/1.0,公布于1996年5月,相应的协议为RFC1945。1997年公布的HTTP/1.1是目前主流的HTTP协议版本,最初的标准文档是RFC2068,之后修订版的RFC2616为当前的版本。在2015年的5月,HTTP/2发布,相应的协议版本为RFC7540。目前,Chrome,Opera,Firefox,Internet Explorer 11,Safari等主流的浏览器都已加入对HTTP/2的支持。本篇我们仅针对成熟的HTTP/1.1做一些介绍。

HTTP是在因特网协议套件(Internet protocol suite)框架下的一个应用层协议。一般建立在TCP传输协议之上,能够提供控制、按序传输和错误纠正等一系列功能。然而,HTTP也可以适应不可靠传输协议,如UDP(HTTPU)和简单服务发现协议(Simple Service Discovery Protocol,SSDP),本篇暂不涉及。

HTTP协议在客户端-服务器之间的以请求-响应的方式工作,即客户端发出请求,服务器做出相应的响应,会话顺序是一个个简单的请求-响应序列。例如,我们常用的网页浏览器可以是一个客户端,而托管某个网站的一个主机应用程序可以是一个服务器。客户端向服务器提交一个request message,服务器会返回一个response message给客户端,response message中包含相应request的状态信息,在message body中,也可能包含客户请求的内容。

相对于其他网络传输协议,HTTP有如下几个特点:
(1) 简单快速:客户端向服务器发送请求时,只需传送请求方法与资源路径,常用请求方法有GET、POST和HEAD。由于HTTP协议较简单,使得服务应用程序规模较小,从而通信速度较快;
(2) 灵活性:HTTP允许传输任意类型的数据对象,由Content-Type加以标记;
(3) 无状态:这是区别于RTMP协议的一个重要特点。无状态是指协议不去记录事务处理的状态。无状态意味着如果对事务的后续处理需要使用之前的信息,则必须重传,从而增加了每次连接需要传输的数据量,但另一方面,在服务器不需要先前信息时,其应答就会很快。

(4) 支持B/S(Browser/Server)和C/S(Client/Server)模式。

下面我们分几个方面来介绍下HTTP中的基本内容。

1.  HTTP中的URL

在HTTP中,客户端向服务器发送报文之前,要在客户端和服务器之间建立一条TCP/IP连接,这就需要知道服务器的IP地址以及在服务器上运行特定软件的TCP端口号。客户端通过向服务器上的特定端口(通常是端口80,偶尔也可能是端口8080)建立TCP连接来发起一个请求;而服务器会在该端口上侦听客户端发来的请求消息。那么,怎么获得HTTP服务器的IP地址和端口号呢?当然是通过URL(Uniform Resource Locator)了。我们知道,URL就是资源的地址,自然能够提供存储资源的IP地址和端口号。来看几个URL:

a) http://207.200.83.29:80/index.html
b) http://www.netscape.com:80/index.html
c) http://www.netscape.com/index.html

a)中的URL使用了机器的IP地址207.200.83.29及端口号80;b)中的URL没有使用数字形式的IP地址,而是文本形式的域名或主机名(www.netscape.com),可通过DNS(Domain Name Service)将主机名转换为IP地址。该URL也指明了端口号80。c)中的URL只有域名没有端口号,在这种情况下,我们可以默认端口号是80。下图显示了浏览器获取某个远端服务器中的一个简单HTML资源的过程(图片来自HTTP权威指南):


2. HTTP报文

HTTP协议交互的消息称为HTTP报文。客户端的请求消息称为请求报文,服务器端的响应消息称为响应报文。HTTP报文是由多行+CRLF换行符构成的字符串文本。

HTTP报文可分为报文首部(Header)和报文主体(Body)两部分,两者由第一次出现的空行CRLF划分。Header部分含有服务器端或客户端需要处理的请求或响应的内容及属性;Body部分是应被发送的数据,报文不一定含有主体。请求报文和响应报文的基本格式如下:


例如,访问ffmpeg.org时,请求和响应消息如下:

将GET请求及其响应的报文展开如下:

3. 握手

HTTP协议进行通信时,在正式的请求-响应消息交互之前,首先需要建立TCP连接,也就是TCP连接建立的“三次握手”(图片来自《图解HTTP》):


例如,使用chrome浏览器访问ffmpeg.org时,握手过程如下:


4. 请求方法

连接建立后,就是客户端与服务器之间的请求和响应过程了。HTTP协议中提供了多种请求方法,在HTTP/1.1中包含如下几种:

GET —— 请求获取Request-URI所标识的资源;
HEAD —— 与GET方法类似,但只请求获取报文首部,不需要返回报文主体部分,用于确认URI的有效性及资源更新的日期时间等等。
POST —— 请求服务器在Request-URI所标识的资源后附加请求中包含的新数据,被post的数据有可能是某些资源的声明或注释,公告栏消息、邮件列表或跟帖评论,向某个数据处理程序提交网络表单的结果,或者向数据库新添加的数据项等。
PUT —— 请求服务器存储一个资源,并用Request-URI作为其标识。若该URI已经指向了某已存在的资源,则更新该资源;否则,创建一个新的资源并用该URI标识。
DELETE —— 请求服务器删除Request-URI所标识的资源。
TRACE —— 请求服务器回送收到的请求信息,主要用于测试或诊断中间服务器对资源所做的更改或添加。
CONNECT —— CONNECT方法将请求的连接转换为一个透明的TCP/IP通道,通常是用来帮助SSL加密的通信通过未加密的HTTP代理。
OPTIONS —— 用来查询服务器对指定的URL支持的HTTP方法,通过用“*”代替特定的URL来检查网络服务器支持的功能。
PATCH —— 请求对资源进行部分修改。

以上方法中,所有的通用服务器都需要至少支持GET和HEAD方法,其他所有方法都可以设置为可选。

5. 状态码

在第2部分我们讲到,响应报文的第一行为状态行,包含协议版本+状态码+描述短语。HTTP响应报文中的状态码有5类,1XX ~ 5XX,具体如下:


下面列举了几个常见的状态码信息:


以上就是HTTP中最最基础的内容了。主要参考资料有:

维基百科: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

《HTTP权威指南》

《图解HTTP》

猜你喜欢

转载自blog.csdn.net/DeliaPu/article/details/79363467