您的位置:首页 > 理论基础 > 计算机网络

HTTP报文

2015-01-31 22:56 183 查看
每天我们都在上网,浏览网页,看新闻等等。我们想浏览某个网页,当然大多数我们都是在浏览器上浏览网页的,浏览器把我们的想法告诉Web服务器,然后服务器把网页返回给浏览器,浏览器把网页展示出来,我们就可以看到了。

浏览器(下称“客户端”)发送请求报文给Web服务器(下称“服务端”),服务端返回响应报文给客户端,由于“请求-响应“的通讯过程是使用HTTP协议的,所以称通讯过程是发送了HTTP报文。HTTP是web浏览器与web服务器之间通信的标准协议,HTTP连接是使用TCP/IP协议传输数据,HTTP协议是建立在TCP协议之上的一种应用。

一、报文的组成

报文是由三部分组成的,格式:

对报文起先描述的起始行(start line)
包含属性的首部(header)
<空行>
包含数据的主体(body)


HTTP报文分为请求报文(request message)和响应报文(response message),报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

1、请求报文格式:

<method方法> <request-URL> <version协议版本>
<headers首部>

<entity-body主体>


不管是客户端还是服务端,请求都是以两个回车/换行对(在java用语是\r\n\r\n)结束。

2、响应报文格式:

<version> <status> <reason-phrase原因短语>
<headers>

<entity-body>     


注:不管是请求报文,还是响应报文,首部都要以空行结尾,即<headers>下的空行。

HTTP 1.1 最大的改进是连接重用。HTTP1.0为每个请求都打开一个新的连接。实际上,在一个典型的web会话中,打开和关闭所有连接耗费的时间要超过传输数据耗费的时间,尤其是有很多小文档的会话。HTTP1.1允许浏览器通过一个连接发送多个不同的请求;连接将在显式关闭前保持打开状态。请求和响应都是异步的。浏览器不需要在发送第二个或第三个请求之前,等待第一个请求的响应。但是,客户端先请求,服务器再响应这个基本模式是不变的。

HTTP1.1还有很多其他的小改进。服务器和浏览器可以交换压缩文件和文档的某一部分内容,这些都能减少网络流量。

二、请求报文的步骤

HTTP请求的步骤:

1、浏览器从URL中解析出服务器的主机名;

2、浏览器将服务器的主机名转换成服务器的IP地址;

3、浏览器将端口号(如果有的话)从URL中解析出来;

4、浏览器建立一条与Web服务器的TCP连接;

5、浏览器向服务器发送一条HTTP请求报文;

6、服务器向浏览器回送一条HTTP响应报文;

7、关闭连接,浏览器显示文档。

三、请求报文的例子

例如,访问baidu的报文

请求报文:

GET / HTTP/1.0
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
 

其中第1行是起始行,在请求报文中称作请求行,方法是GET,协议是HTTP/1.0,本地资源URL是/,所以请求资源URL是http://www.baidu.com/

第2行开始就是首部(headers),由于是GET方法,所以没有实体(entity-body)。

常用的请求方法(method)有:

方法描述是否包含主体
GET从服务器获取一份文档
HEAD只从服务器获取文档的首部(header)
POST向服务器发送需要处理的数据
PUT将请求的主体部分存储在服务器上
TRACE对可能经过代理服务器传送到服务器上去的服文进行追踪
OPTIONS决定可以在服务器上执行哪些方法
DELETE从服务器上删除一份文档
在首部中,Host表示服务器的主机名和端口,如果没有端口,则是默认端口80,User-Agent表示请求的客户端是什么(Win7系统下的火狐浏览器35.0版),Accept表示客户端告知服务器它会接收什么媒体类型,可以是文体,图片,音频等等 ,Accept-Language表示客户端告知服务器可以接收哪些语言,Accept-Encoding表示告知服务器可以接收哪些编码方式。

请求步骤:

1、通过URL解析出主机名是www.baidu.com;

2、通过域名服务(DNS)的机制将主机名转换成IP地址;

3、由于URL中没有端口信息,所以就是默认端口,默认端口80;

4、通过IP、端口,浏览器建立了与Web服务器的TCP连接5;

5、浏览器将上述请求报文发送给Web服务器;

6、服务器向浏览器返回响应服文;

7、关闭连接,浏览器显示文档。

响应报文:

HTTP/1.0 200 OK
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Sat, 31 Jan 2015 15:58:33 GMT
Expires: Sat, 31 Jan 2015 15:57:33 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=0; path=/; domain=.baidu.com
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: HPHP

<HTML>
...
</HTML>

其中第1行是起始行,在响应报文中称作响应行,协议是HTTP/1.0,状态是200,"OK"解释说明这个请求的状态码(200)是响应成功的意思。

第2行到空行就是首部(headers),从<HTML>开始是实体<entity-body>。

在首部中,Content-Encoding表示对响应的主体进行哪些编码方式,Content-Type表示数据主体是哪些媒体类型,Server表示服务器应用程序软件的名称和版本(BWS/1.1可能是Baidu的Web服务器1.1版,仅仅是猜测。),

注:如果报文的首部有Connection:Keep-Alive属性,当然如果有的话,必须是请求报文和响应报文都必须这个属性,那表示这个请求连接是长连接。

四、GET和POST方法

HTTP协议没有限制GET方法的URL的长度,但不同的浏览器可能对URL的长度有限制,如IE限制URL长度为2083字节(2K+35),HTTP协议也没有限制POST方法的实体(body)大小,但有些服务器可能对实体有限制大小,如Apache,IIS。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: