HTTP的全称是Hypertext Transfer Protocol,翻译成中文是超文本输送协议,主要是用来输送超文本(Hypertext)的。

那什么是超文本,维基百科上关于超文本的解释很长,但是说白了也挺简单的。Hyper这个词在英文中是指“超过”或者“多于”的意思,按照这个方式来解释,所谓超文本,其实就是“不只是文本”的意思,也就是文本里面包含链接,或者图片和表格的文本。我们日常所见到的网页,就是一个超文本的具体例子。

网页的内容使用HTML(Hypertext Markup Language)语言,那作为超文本输送协议, HTTP最初被发明的目主要是用来输送HTML了。

一些术语上解释。有些字典会把HTTP翻译成超文本传输协议。但是传输这个字,也可以用来翻译transport这个英文单词。在英文中,有三个意思接近的词:transporttransfer、以及transmissiontransport侧重输送的过程,transfer表示把东西从一个地方挪到另一地,而transmission强调把东西发出去的过程。为了以示区分,本文把transport翻译成传输,把transfer翻译成输送,把transmission翻译成传送

既然只是为了把超文本从一个地方输送到另一个地方,HTTP一开始的设计十分简单,只包含两个报文(message),分别是请求(request)和应答(response)。这两个报文表示两个动作,但是光有动作还不够,要构成一个系统,还要增加一些名词。首先,动作是谁发起和接收的?这边要引入两个名词,那就是客户端(client)和服务端(server)。客户端发起请求,服务端接受请求并返回应答。客户端和服务端这两个名词都是抽象的概念,不一定是常见的浏览器和网页服务器,凡是可以发起HTTP请求的程序都可以是客户端,凡是可以返回应答的程序都可以是服务端。另外还需要一个谓语,来表示请求和应答的对象。HTTP选择的名词是资源(resource)。也就是说HTTP输送的是资源,而HTML页面是其中的一种资源形式。

有了以上的术语为基础,现在可以来给一个总结。什么是HTTP?HTTP是从客户端到服务端的资源请求和应答协议。好,现在来一个具体的例子。如果服务器根目录下有一个hello.html文件,客户端应该怎么获取。

首先客户端要发一条request报文,内容如下:

GET /hello.html HTTP/1.1

GET是请求的方法(method),/hello.html是请求的资源在服务器上的路径(下面简称urlPath),HTTP/1.1是所用HTTP协议的版本,1.1是目前最流行的版本。上面的request报文翻译成人话,就是说“把根目录下的hello.html给我发过来”。

服务端接收到这个request之后,如果检查一切正常,就会返回一条response报文,内容如下:

HTTP/1.1 200 OK
Content-Length: 41
Content-Type: text/html

<html>
	<body>
		Hello!
	</body>
</html>

同样,repsonse返回HTTP的协议版本HTTP/1.1200是HTTP的状态码,表示一切正常。OK是对200这个状态吗的解释。从第二行开始的是HTTP的头部,包含若干个字段,用来描述内容本身,或者增加一些控制信息。本例中,HTTP头部为:

Content-Length: 41
Content-Type: text/html

Content-Length用来描述内容的长度,Content-Type用来描述内容的类型,本例中的类型为text/html

内容和头部用一个空行隔开:

<html>
	<body>
		Hello!
	</body>
</html>

上面就是一个完整的HTTP的请求和应答的例子。

小结

HTTP发展到现在已经超过20年了,其作用越来越重要,功能也越来越复杂。这是因为HTTP所要输送的超文本也越来越复杂。但是回到一切开始的地方,HTTP在诞生之初,只是简单的请求和应答而已,这是HTTP的基本形式,即便在最新的HTTP2版本里面,也遵循这个基本的形式。

(完)