前言-2-HTTP

前言-2-HTTP

HTTP

HTTP协议使得Web服务器与浏览器之间可以通过互联网或内网进行数据交互。万维网联盟(W3C), 作为一个制定标准的国际社区,负责和维护HTTP协议。HTTP第一个版本是HTTP0.9,之后是HTTP 1.0,当前最新版本是HTTP 1.1HTTP 1.1版本的RFC编号是2616,下载地址为http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf。按计划,HTTP的下一个版本是HTTP/2

Web服务器7×24小时不间断运行,并等待HTTP客户端(通常是Web浏览器)来连接并请求资源。通常, 由客户端发起一个连接,服务端不会主动连接客户端。

注意
2011年,标准化组织IETF发布了WebSocket协议,即RFC 6455规范。该协议允许一个HTTP连接升级为WebSocket连接,支持双向通信,这就使得服务端可以通过WebSocket协议主动发起同客户端的会话通信。

互联网用户需要通过点击一个链接或者在地址栏之中输入一个URL地址来访问一个资源,如下为两个示例:

1
2
http://google.com/index.html
http://facebook.com/index.html

URL的第一个部分是http,代表所采用的协议。除 HTTP协议外,URL还可以采用其他类型,下面为两个示例:

1
protocol://[host.]domain[:port][/context][/resource][?query string]

或者

1
protocol://IP address[:port][/context][/resource][?query string]

中括号中的内容是可选的,因此一个最简的URL http://yahoo.ca 或者http://192.168.1.9
需要说明的是,除了输入http://google.com,你还可以用http://209.85.143.99来访问谷歌。可以用ping命令来获取域名所对应的IP地址:

1
ping google.com

由于IP地址不容易记忆,实践中更倾向于使用域名。一台计算机可以托管不止一个域名,因此不同的域名可能指向同一个IP。另外,example.com或者 example.org无法被注册,因为它们被保留作为各类文档手册举例使用。
URL中的Host部分用来表示在互联网或内网中一个唯一的地址,例如:http://yahoo.com(没有host)所访问的地址完全不同于http://mail.yahoo.com (有host)。 多年以来,作为最受欢迎的主机名,www是默认的主机名,通常,http://www.domainName 会被映射到http://domainName

HTTP的默认端口是80端口。因此,对于采用80端口的Web服务器,可以无须输入端口号。但有时候, Web服务器并未运行在80端口上,此时必须输入相应的端口号。例如:**Tomcat服务器的默认端口号是8080**, 为了能正确访问,必须提供输入端口号:

1
http://localhost:8080

localhost作为一个保留关键字,用于指向本机
URL中的context部分用来代表应用名称,该部分也是可选的。一台Web服务器可以运行多个上下文(应用),其中一个可以配置为默认上下文,对于访问默认上下文中的资源,可以跳过context部分。

最后,一个context可以有一个或多个默认资源(通常为index.htmlindex.htm或者default.htm)。一个没有带资源名称的URL通常指向默认资源。当存在多个默认资源时,其中最高优先级的资源将被返回给客户端。

在资源名之后可以有一个或多个查询语句或者路径参数。查询语句是一个Key/Value组,多个查询语句间用“&”分隔。路径参数类似于查询语句,但只有 value部分,多个value部分用“/”符号分隔。

HTTP请求

一个HTTP请求包含三部分内容:

  • 方法-URI-协议/版本
  • 请求头信息
  • 请求正文如下为一个具体示例:
1
2
3
4
5
6
7
8
9
10
POST /examples/default.jsp HTTP/1.1 
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive Host:localhost
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKi t/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36
Content-Length: 30
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

lastName=Blanks&firstName=Mike

请求的第一行即是:方法-URI-协议/版本

1
POST /examples/default.jsp HTTP/1.1

请求方法为POSTURI/examples/default.jsp,而协议/版本为HTTP/1.1

HTTP 1.1规范定义了7种类型的方法,包括GETPOSTHEADOPTIONSPUTDELETE以及 TRACE,其中GETPOST广泛应用于互联网应用。

URI定义了一个互联网资源,通常解析为服务器根目录的相对路径。因此,通常用/符号打头。另外**URLURI的一个具体类型**。(详见 http://www.ietf.org/rfc/rfc2396.txt。)

HTTP请求所包含的请求头信息包含关于客户端环境以及实体内容等非常有用的信息。例如,浏览器所设置的语言实体内容长度等。每个header用回车/换行(即 CRLF)分隔
**HTTP请求头信息和请求正文``用一行空行分隔**, HTTP服务器据此判断请求正文的起始位置。因此在一些关于互联网的书籍中,CRLF作为HTTP`请求的第四种组件。 在此前所举的例子中,请求正文如下行:

1
lastName=Blanks&firstName=Mike

在正常的HTTP请求中,请求正文的内容不止如此。

HTTP响应

HTTP请求一样,HTTP响应包含三部分:

  • 协议—状态码—描述
  • 响应头信息
  • 响应正文

如下是一个HTTP响应实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Date: Thu, 8 Jan 2015 13:13:33 GMT
Content-Type: text/html
Last-Modified: Wed, 7 Jan 2015 13:13:12 GMT
Content-Length: 112

<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome to Brainy Software
</body>
</html>

类似于HTTP请求报文,HTTP响应报文第一行:

1
HTTP/1.1 200 OK

说明 了HTTP协议的版本是1.1,并且请求结果是成功的(状态代码200为响应成功)。

HTTP请求报文头信息一样,HTTP响应报文的响应头信息也包含了大量有用的信息。
HTTP响应报文的响应正文HTML文档。**HTTP响应报文的响应头信息和响应正文之间也是用\r\n(CRLF)分隔的**。

状态代码200表示Web服务器能正确响应所请求的资源。若一个请求的资源不能被找到或者理解,则Web 服务器将返回不同的状态代码。例如:访问未授权的资 源将返回401而使用被禁用的请求方法将返回405。完 整的HTTP响应状态代码列表详见如下网址:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html