HTTP的全称是Hypertext Transfer Protocol,翻译成中文是超文本输送协议
,主要是用来输送超文本(Hypertext)的。
那什么是超文本,维基百科上关于超文本的解释很长,但是说白了也挺简单的。Hyper这个词在英文中是指“超过”或者“多于”的意思,按照这个方式来解释,所谓超文本,其实就是“不只是文本”的意思,也就是文本里面包含链接,或者图片和表格的文本。我们日常所见到的网页,就是一个超文本的具体例子。
网页的内容使用HTML(Hypertext Markup Language)语言,那作为超文本输送协议
, HTTP最初被发明的目主要是用来输送HTML了。
一些术语上解释。有些字典会把HTTP翻译成
超文本传输协议
。但是传输
这个字,也可以用来翻译transport
这个英文单词。在英文中,有三个意思接近的词:transport
、transfer
、以及transmission
。transport
侧重输送的过程,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.1
。200
是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版本里面,也遵循这个基本的形式。
(完)