超文本传输协议
维基百科,自由的百科全书
| 网络协议 |
| 5. 应用层 |
|
DHCP · DNS · FTP · Gopher · HTTP · IMAP4 · IRC · NNTP · XMPP · POP3 · SIP · SMTP · SNMP · SSH · TELNET · RPC · RTCP · RTSP · TLS · SDP · SOAP · GTP · STUN · NTP · 更多 |
| 4. 传输层 |
| TCP · UDP · DCCP · SCTP · RTP · RSVP · PPTP · 更多 |
| 3. 网络层 |
| IP (IPv4 · IPv6) · ARP · RARP · ICMP · ICMPv6 · IGMP · RIP · OSPF · BGP · IS-IS · IPsec · 更多 |
| 2. 数据链路层 |
| 802.11 · 802.16 · Wi-Fi · WiMAX · ATM · DTM · 令牌环 · 以太网 · FDDI · 帧中继 · GPRS · EVDO · HSPA · HDLC · PPP · L2TP · ISDN · 更多 |
| 1. 物理层 |
| 乙太網物理层 · 调制解调器 · PLC · SONET/SDH · G.709 · 光导纤维 · 同轴电缆 · 双绞线 · 更多 |
超文本传输协议(HTTP,HyperText Transfer Protocol)是網際網路上應用最為廣泛的一种網路協議。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
目录 |
[编辑] 概述
HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,其中最著名的就是RFC 2616。RFC 2616定义了HTTP协议的我们今天普遍使用的一个版本——HTTP 1.1。
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如"HTTP/1.1 200 OK",和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息。
HTTP使用TCP而不是UDP的原因在于(打开一个)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。具体细节请参考『TCP和UDP的不同』(http://en.wikipedia.org/wiki/User_Datagram_Protocol#Difference_between_TCP_and_UDP )。
通过HTTP或者HTTPS协议请求的资源由统一资源定位器(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识。
[编辑] 请求信息(Request Message)
发出的请求信息包括以下几个
- 请求行,例如GET /images/logo.gif HTTP/1.1,表示从/images 目录下请求logo.gif 这个文件。
- (请求)头,例如Accept-Language: en
- 空行
- 可选的消息体
请求行和标题必须以<CR><LF> 作为结尾(也就是,回车然后换行)。空行内必须只有<CR><LF>而无其他空格。在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。
[编辑] 请求方法
HTTP 定义了八种方法来指示确认的资源执行所需的行为。
HEAD
要求与GET请求相应的回复一样的应答,但是没有回应的内容。这对找回写在回应标题中的
meta-infomation有帮助,不需要传输整个内容。
GET
请求某个特殊的资源,是目前网上最通用的方法。不应该用于一些会造成副作用的操作中 (在网络软件中使用是一个常见的错误用法)。参看下个目录的安全方法。
POST
向确定的资源提交需要处理的数据。这些数据包括在请求的内容里。这可以造成新资源的产生和更新已有资源。
PUT
上传特定资源
DELETE
删除特定资源
TRACE
返回接收的请求,客户端可因此察看在请求过程中什么中间服务器被加进来或者有所改变。
OPTIONS
返回服务器支持的HTTP方法,这可以用来检查网络服务器的功能。
CONNECT
将请求连接转换成透明的TCP/IP通道,通常通过非加密的HTTP代理利用SSL-加密通讯(HTTPS)。
[编辑] 安全方法
有些方法(比如HEAD, GET, OPTIONS, and TRACE) 被定义为安全方法,这些方法针对的只是信息的返回,并不会改变服务器的状态(换句话说就是这些方法不会产生副作用)。不安全的方法(例如POST, PUT and DELETE) 应该用特殊的方式向用户展示,通常是按钮而不是链接,这样就可以使用户意识到可能要负的责任(例如一个按钮带来的资金交易。)
[编辑] 幂等方法和网络应用软件
[编辑] 协议版本号
超文本传输协议已经演化出了很多版本,它们中的大部分都是向下兼容的。客户端在请求的开始告诉服务器它采用的协议版本号,而后者则在响应中采用相同或者更早的协议版本。
[编辑] 0.9
已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
[编辑] HTTP/1.0
这是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
[编辑] HTTP/1.1
当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
此版相较于 HTTP/1.0 协议的区别主要体现在:
- 缓存处理
- 带宽及网络连接的管理
- 安全性及完整性
[编辑] 状态行
- 参见:HTTP状态码
所有 HTTP 响应的第一行都是状态行, 依次是当前 HTTP 版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
- 1xx 消息——请求已被服务器接收,继续处理
- 2xx 成功——请求已成功被服务器接收、理解、并接受
- 3xx 重定向——需要后续操作才能完成这一请求
- 4xx 请求错误——请求含有词法错误或者无法被执行
- 5xx 服务器错误——服务器在处理某个正确请求时发生错误
虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是 WEB 开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
[编辑] 持久连接
[编辑] 安全超文本协议
[编辑] 例子
下面是一个HTTP客户端与服务器之间会话的例子,运行于www.google.com,端口80
客户端请求:
GET / HTTP/1.1 Host:www.google.com
(紧跟着一个换行,通过敲入回车实现)
服务器应答:
HTTP/1.1 200 OK Content-Length: 3059 Server: GWS/2.0 Date: Sat, 11 Jan 2003 02:44:04 GMT Content-Type: text/html Cache-control: private Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqy X9j; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Connection: keep-alive
(紧跟着一个空行,并且由HTML格式的文本组成了Google的主页)
在HTTP1.0中,客户端发送一个请求至服务器,服务器发送一个应答至客户端。之后,连接将被释放。另一方面,HTTP1.1支持持久连接。这使得客户端可以发送请求并且接收应答,然后迅速的发送另一个请求和接收另一个应答。因为多个额外的请求,TCP连接并没有被释放,而每个请求中关于TCP的负载相对较少。同时,在得到上一个请求的应答之前发送多个请求(通常是两个)也成为可能。这个技术被称为「流水线」。
[编辑] 参考
[编辑] 外部链接
- 关于HTTP协议的中文资料 http://www.cnpaf.net/class/HTTP
- Tim Berners-Lee's original 1992 Internet-Draft http://www.w3.org/Protocols/HTTP/HTTP2.html
- RFC 2616 - The current HTTP/1.1 specification
- HTTP/1.1 specification errata (http://skrb.org/ietf/HTTP_errata.html)
- HTTP header viewer (http://analyze.forret.com)
- HTTP Header Viewer with Google App Engine

