每天我们都在上网,浏览网页,看新闻等等。我们想浏览某个网页,当然大多数我们都是在浏览器上浏览网页的,浏览器把我们的想法告诉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。