Wave Spread...

Linux 运维手册之 HTTP 服务

分类:Linux 评论: 0

HTTPHyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTPWWWWorld Wide Web,全球广域网)万维网的数据通信基础。

HTTP 协议简介

发展历程

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由URIUniform Resource Identifiers,统一资源标识符)来标识。

HTTP的发展是由 Tim Berners-Lee(蒂姆·伯纳斯-李)1989年在CERNEuropean Organization for Nuclear Research,欧洲核子研究组织)所发起。HTTP的标准制定由W3CWorld Wide Web Consortium,万维网协会)和IETFInternet Engineering Task Force,互联网工程任务组)进行协调,最终发布了一系列的RFC,其中最著名的是1999 年 6 月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1

201412月,互联网工程任务组的Hypertext Transfer Protocol Bis(httpbis)工作小组将HTTP/2标准提议递交至IESG进行讨论,于2015217日被批准。HTTP/2标准于20155月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。

协议概述

HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

尽管TCP/IP协议是互联网上最流行的应用,但是在HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。但是实际上HTTP其下层协议必须提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。也就是在TCP/IP协议族使用TCP作为其传输层。

通常,由客户端发起一个请求,创建一个到服务器指定端口的TCP连接。服务端则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

请求方法

HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法

HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

PUT
向指定资源位置上传其最新内容。

DELETE
请求服务器删除Request-URI所标识的资源。

TRACE
回显服务器收到的请求,主要用于测试或诊断。

OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405 (Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501 (Not Implemented)

HTTP服务器至少应该实现GETHEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如:PATCH(由 RFC 5789 指定的方法)用于将局部修改应用到资源。

版本演进

超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。在 RFC 2145 中描述了HTTP版本号的用法。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。

HTTP/0.9

已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。

HTTP/1.0

这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。

HTTP/1.1

持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性

HTTP/2

HTTP/2 相比 HTTP/1.1 的修改并不会破坏现有程序的工作,但是新的程序可以借由新特性得到更好的速度。

HTTP/2 保留了 HTTP/1.1 的大部分语义,例如请求方法、状态码乃至URI和绝大多数HTTP头部字段一致。而 HTTP/2 采用了新的方法来编码、传输客户端——服务器间的数据。

当前版本,于2015年5月作为互联网标准正式发布。

HTTP 状态码

因篇幅有限,此处省略:点击查看详情


常用 HTTP 服务

常用网页服务

市场占有率

Developer June 2018 Percent July 2018 Percent Change
Apache 76,721,597 35.23% 76,312,577 34.60% -0.63
Microsoft 56,030,491 25.73% 57,395,894 26.02% 0.29
NGINX 50,860,718 23.35% 50,246,244 22.78% -0.57
Google 1,909,658 0.88% 1,948,858 0.88% 0.01

表格数据来源

更多阅读

回复