1.5 报文
现在我们来快速浏览一下HTTP 请求和响应报文的结构。第3 章会深入研究HTTP
报文。
HTTP 报文是由一行一行的简单字符串组成的。HTTP 报文都是纯文本,不是二进
制代码,所以人们可以很方便地对其进行读写1。图1-7 显示了一个简单事务所使用
的HTTP 报文。
GET /test/hi-there.txt HTTP/1.0
Accept: text/*
Accept-Language: en,fr
HTTP/1.0 200 OK
Content-type: text/plain
Content-length: 19
Hi! I’m a message!
起始行
首部
主体
(a) 请求报文(b) 响应报文
图1-7 由一行行的简单文本结构组成的HTTP 报文
注1: 有些程序员会抱怨HTTP 的语法解析太困难了,这项工作需要很多技巧,而且很容易出错,尤其是在
设计高速软件的时候更是如此。二进制格式或更严格的文本格式可能更容易处理,但大多数HTTP 程
序员都很欣赏HTTP 的可扩展性以及可调试性。
9
12 | 第1 章
从Web 客户端发往Web 服务器的HTTP 报文称为请求报文(request message)。从
服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的
HTTP 报文。HTTP 请求和响应报文的格式很类似。
HTTP 报文包括以下三个部分。
• 起始行
报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说
明出现了什么情况。
• 首部字段
起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为
了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首
部字段和添加新行一样简单。
• 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括
了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起
始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意
的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含
文本。
简单的报文实例
图1-8 显示了可能会作为某个简单事务的一部分发送的HTTP 报文。浏览器请求资
源http://www.joes-hardware.com/tools.html。
在图1-8 中,浏览器发送了一条HTTP 请求报文。这条请求的起始行中有一个GET
命令,且本地资源为/tools.html。这条请求说明它使用的是1.0 版的HTTP 协议。请
求报文没有主体,因为从服务器上GET 一个简单的文档不需要请求数据。
服务器会回送一条HTTP 响应报文。这条响应中包含了HTTP 的版本号(HTTP/1.0)、
一个成功状态码(200)、一个描述性的原因短语(OK), 以及一块响应首部字
段,在所有这些内容之后跟着包含了所请求文档的响应主体。Content-Length
首部说明了响应主体的长度,Content-Type 首部说明了文档的MIME 类型。
10
HTTP概述 | 13
GET /tools.html HTTP/1.0
User-agent: Mozilla/4.75 [en] (Win98; U)
Host: www.joes-hardware.com
Accept: text/html, image/gif, image/jpeg
Accept-language: en
HTTP/1.0 200 OK
Date: Sun, o1 Oct 2000 23:25:17 GMT
Server: Apache/1.3.11 BSafe-SSL/1.38 (Unix)
Last-modified: Tue, 04 Jul 2000 09:46:21 GMT
Content-length: 403
Content-type: text/html
<HTML>
<HEAD><TITLE>Joe’s Tools</TITLE></HEAD>
<BODY>
<H1>Tools Page</H1>
<H2>Hammers</H2>
<P>Joe’s Hardware Online has the largest selection of
hammers on the earth.</P>
<H2><A NAME=drills></A>Drills</H2>
<P>Joe’s Hardware has a complete line of cordless
and corded drills, as well as the latest in
plutonium-powered atomic drills, for those big
around the house jobs.</P>...
</BODY>
</HTML>
客户端www.joes-hardware.com
(a)请求报文
(b)响应报文
请求起始行(命令)
请求首部
没有请求主体
响应起始行
(状态)
响应首部
响应主体
图1-8 http://www.joes-hardware.com/tools.html 的GET 事务实例
1.6 连接
概要介绍了HTTP 报文的构成之后,我们来讨论一下报文是如何通过传输控制协议
(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去的。
1.6.1 TCP/IP
HTTP 是个应用层协议。HTTP 无需操心网络通信的具体细节;它把联网的细节都
交给了通用、可靠的因特网传输协议TCP/IP。
TCP 提供了:
11
14 | 第1 章
• 无差错的数据传输;
• 按序传输(数据总是会按照发送的顺序到达);
• 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
因特网自身就是基于TCP/IP 的,TCP/IP 是全世界的计算机和网络设备常用的层次
化分组交换网络协议集。TCP/IP 隐藏了各种网络和硬件的特点及弱点,使各种类型
的计算机和网络都能够进行可靠地通信。
只要建立了TCP 连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,
也不会在接收时出现错序了。
用网络术语来说,HTTP 协议位于TCP 的上层。HTTP 使用TCP 来传输其报文数
据。与之类似,TCP 则位于IP 的上层(参见图1-9)。
HTTP 应用层
TCP 传输层
IP 网络层
网络特有的链路接口 数据链路层
物理网络硬件物理层
图1-9 HTTP 网络协议栈
1.6.2 连接、IP地址及端口号
在HTTP 客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)
地址和端口号在客户端和服务器之间建立一条TCP/IP 连接。
建立一条TCP 连接的过程与给公司办公室的某个人打电话的过程类似。首先,要拨
打公司的电话号码。这样就能进入正确的机构了。其次,拨打要联系的那个人的分
机号。
在TCP 中,你需要知道服务器的IP 地址,以及与服务器上运行的特定软件相关的
TCP 端口号。
这就行了,但最初怎么获得HTTP 服务器的IP 地址和端口号呢?当然是通过URL
了!我们前面曾提到过,URL 就是资源的地址,所以自然能够为我们提供存储资源
的机器的IP 地址。我们来看几个URL:
12
HTTP概述 | 15
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
第一个URL 使用了机器的IP 地址,207.200.83.29 以及端口号80。
第二个URL 没有使用数字形式的IP 地址,它使用的是文本形式的域名,或者称为
主机名(www.netscape.com)。主机名就是IP 地址比较人性化的别称。可以通过一
种称为域名服务(Domain Name Service,DNS)的机制方便地将主机名转换为IP
地址,这样所有问题就都解决了。第2 章会介绍更多有关DNS 和URL 的内容。
最后一个URL 没有端口号。HTTP 的URL 中没有端口号时,可以假设默认端口号是80。
有了IP 地址和端口号,客户端就可以很方便地通过TCP/IP 进行通信了。图1-10 显
示了浏览器是怎样通过HTTP 显示位于远端服务器中的某个简单HTML 资源的。
(d)连接到161.58.228.45的端口80
(e)发送一条HTTP GET请求
(f)从服务器读取HTTP响应
客户端服务器
客户端服务器
客户端服务器
因特网
因特网
因特网
客户端服务器
因特网
(g)关闭连接
Screen shot needed
用户输入URL
http://www.joes-hardware.com:80/tools.html
(c)获取端口号(80)
www.joes-hardware.com
(a)获取主机名
(b)DNS
浏览器显示页面
图1-10 基本的浏览器连接处理
13
现在我们来快速浏览一下HTTP 请求和响应报文的结构。第3 章会深入研究HTTP
报文。
HTTP 报文是由一行一行的简单字符串组成的。HTTP 报文都是纯文本,不是二进
制代码,所以人们可以很方便地对其进行读写1。图1-7 显示了一个简单事务所使用
的HTTP 报文。
GET /test/hi-there.txt HTTP/1.0
Accept: text/*
Accept-Language: en,fr
HTTP/1.0 200 OK
Content-type: text/plain
Content-length: 19
Hi! I’m a message!
起始行
首部
主体
(a) 请求报文(b) 响应报文
图1-7 由一行行的简单文本结构组成的HTTP 报文
注1: 有些程序员会抱怨HTTP 的语法解析太困难了,这项工作需要很多技巧,而且很容易出错,尤其是在
设计高速软件的时候更是如此。二进制格式或更严格的文本格式可能更容易处理,但大多数HTTP 程
序员都很欣赏HTTP 的可扩展性以及可调试性。
9
12 | 第1 章
从Web 客户端发往Web 服务器的HTTP 报文称为请求报文(request message)。从
服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的
HTTP 报文。HTTP 请求和响应报文的格式很类似。
HTTP 报文包括以下三个部分。
• 起始行
报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说
明出现了什么情况。
• 首部字段
起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为
了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首
部字段和添加新行一样简单。
• 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括
了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起
始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意
的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含
文本。
简单的报文实例
图1-8 显示了可能会作为某个简单事务的一部分发送的HTTP 报文。浏览器请求资
源http://www.joes-hardware.com/tools.html。
在图1-8 中,浏览器发送了一条HTTP 请求报文。这条请求的起始行中有一个GET
命令,且本地资源为/tools.html。这条请求说明它使用的是1.0 版的HTTP 协议。请
求报文没有主体,因为从服务器上GET 一个简单的文档不需要请求数据。
服务器会回送一条HTTP 响应报文。这条响应中包含了HTTP 的版本号(HTTP/1.0)、
一个成功状态码(200)、一个描述性的原因短语(OK), 以及一块响应首部字
段,在所有这些内容之后跟着包含了所请求文档的响应主体。Content-Length
首部说明了响应主体的长度,Content-Type 首部说明了文档的MIME 类型。
10
HTTP概述 | 13
GET /tools.html HTTP/1.0
User-agent: Mozilla/4.75 [en] (Win98; U)
Host: www.joes-hardware.com
Accept: text/html, image/gif, image/jpeg
Accept-language: en
HTTP/1.0 200 OK
Date: Sun, o1 Oct 2000 23:25:17 GMT
Server: Apache/1.3.11 BSafe-SSL/1.38 (Unix)
Last-modified: Tue, 04 Jul 2000 09:46:21 GMT
Content-length: 403
Content-type: text/html
<HTML>
<HEAD><TITLE>Joe’s Tools</TITLE></HEAD>
<BODY>
<H1>Tools Page</H1>
<H2>Hammers</H2>
<P>Joe’s Hardware Online has the largest selection of
hammers on the earth.</P>
<H2><A NAME=drills></A>Drills</H2>
<P>Joe’s Hardware has a complete line of cordless
and corded drills, as well as the latest in
plutonium-powered atomic drills, for those big
around the house jobs.</P>...
</BODY>
</HTML>
客户端www.joes-hardware.com
(a)请求报文
(b)响应报文
请求起始行(命令)
请求首部
没有请求主体
响应起始行
(状态)
响应首部
响应主体
图1-8 http://www.joes-hardware.com/tools.html 的GET 事务实例
1.6 连接
概要介绍了HTTP 报文的构成之后,我们来讨论一下报文是如何通过传输控制协议
(Transmission Control Protocol,TCP)连接从一个地方搬移到另一个地方去的。
1.6.1 TCP/IP
HTTP 是个应用层协议。HTTP 无需操心网络通信的具体细节;它把联网的细节都
交给了通用、可靠的因特网传输协议TCP/IP。
TCP 提供了:
11
14 | 第1 章
• 无差错的数据传输;
• 按序传输(数据总是会按照发送的顺序到达);
• 未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)。
因特网自身就是基于TCP/IP 的,TCP/IP 是全世界的计算机和网络设备常用的层次
化分组交换网络协议集。TCP/IP 隐藏了各种网络和硬件的特点及弱点,使各种类型
的计算机和网络都能够进行可靠地通信。
只要建立了TCP 连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,
也不会在接收时出现错序了。
用网络术语来说,HTTP 协议位于TCP 的上层。HTTP 使用TCP 来传输其报文数
据。与之类似,TCP 则位于IP 的上层(参见图1-9)。
HTTP 应用层
TCP 传输层
IP 网络层
网络特有的链路接口 数据链路层
物理网络硬件物理层
图1-9 HTTP 网络协议栈
1.6.2 连接、IP地址及端口号
在HTTP 客户端向服务器发送报文之前,需要用网际协议(Internet Protocol,IP)
地址和端口号在客户端和服务器之间建立一条TCP/IP 连接。
建立一条TCP 连接的过程与给公司办公室的某个人打电话的过程类似。首先,要拨
打公司的电话号码。这样就能进入正确的机构了。其次,拨打要联系的那个人的分
机号。
在TCP 中,你需要知道服务器的IP 地址,以及与服务器上运行的特定软件相关的
TCP 端口号。
这就行了,但最初怎么获得HTTP 服务器的IP 地址和端口号呢?当然是通过URL
了!我们前面曾提到过,URL 就是资源的地址,所以自然能够为我们提供存储资源
的机器的IP 地址。我们来看几个URL:
12
HTTP概述 | 15
http://207.200.83.29:80/index.html
http://www.netscape.com:80/index.html
http://www.netscape.com/index.html
第一个URL 使用了机器的IP 地址,207.200.83.29 以及端口号80。
第二个URL 没有使用数字形式的IP 地址,它使用的是文本形式的域名,或者称为
主机名(www.netscape.com)。主机名就是IP 地址比较人性化的别称。可以通过一
种称为域名服务(Domain Name Service,DNS)的机制方便地将主机名转换为IP
地址,这样所有问题就都解决了。第2 章会介绍更多有关DNS 和URL 的内容。
最后一个URL 没有端口号。HTTP 的URL 中没有端口号时,可以假设默认端口号是80。
有了IP 地址和端口号,客户端就可以很方便地通过TCP/IP 进行通信了。图1-10 显
示了浏览器是怎样通过HTTP 显示位于远端服务器中的某个简单HTML 资源的。
(d)连接到161.58.228.45的端口80
(e)发送一条HTTP GET请求
(f)从服务器读取HTTP响应
客户端服务器
客户端服务器
客户端服务器
因特网
因特网
因特网
客户端服务器
因特网
(g)关闭连接
Screen shot needed
用户输入URL
http://www.joes-hardware.com:80/tools.html
(c)获取端口号(80)
www.joes-hardware.com
(a)获取主机名
(b)DNS
浏览器显示页面
图1-10 基本的浏览器连接处理
13