请求报文/相应报文
请求报文的格式:
请求方法 URL HTTP协议的版本\r\n
若干个首部对
\r\n /* 这一个是不可少的,指示首部对结束 */
[实体]
-
请求方法,可以是 GET,POST,等等,该字段是大小写敏感的.
HTTP协议的版本,HTTP/主版本号.次版本号,如 HTTP/1.1,HTTP/1.0
响应报文的格式
HTTP协议的版本 状态码 状态码的字符串描述\r\n
若干个首部对
\r\n/* 不可少,指示首部对的结束 */
[实体]
首部对
首部对,每一个首部对的格式为 NAME:VALUE\r\n;在 VALUE 之前可以有任意个空格;其中
NAME,大小写无关,
VALUE,一般情况下,VALUE 只是简单的一个字符串;但是在某些情况下,VALUE可以看作由若干个 element 组成,element 之间使用','隔开;每一个 element 按照';'又可以分为几个部分,除第一个部分之外,其他部分可以看作这个 element 的属性,如下:
If-Modified-Since:"Mon, 01 Dec 2014 12:20:07 GMT" /* 此时 VALUE 就是一串普通的字符串 */
Accept-Language:"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"
/* 此时 VALUE 可以分为 4 个 element;如下,分别是:
zh-cn
zh;q=0.8 第一部分:zh,第2部分:q=0.8,可以看作这个 element 的属性
en-us;q=0.5
en;q=0.3 */
实体
与实体有关的首部:Content-Length,Content-Type,Content-Encoding,如下详细叙述:
Content-Length,实体的字节长度.
Content-Type,实体的类型,如: Content-Type:"text/html",表明此时实体的内容是 html 文本.
Content-Encoding,实体的编码方法,对实体进行编码可以减少实体的大小,该首部的工作流程:
客户端在发送的 HTTP 请求中,使用 Accept-Encoding 首部来表明客户端支持的编码方法.如 Accept-Encoding:"gzip, deflate"
服务器在收到请求之后,生成原始响应,此时有原始的 Content-Length,以及 Content-Type;
服务器为了减少实体的大小,将使用客户端支持的编码方法对实体进行编码得到新的实体,编码后,Content-Length 被更改为新实体的字节大小,并且服务器将在 HTTP 响应报文中添加首部 Content-Encoding 来表明其使用的编码方法.
客户端在收到 HTTP 响应之后,利用 Content-Encoding 中包含的信息对收到的实体进行解码,得到原始响应.
Cookie
会话Cookie,存放在内存中,当用户退出浏览器时,会话Cookie将会被清除.
持久Cookie,存放在硬盘中,当用户退出浏览器,或者计算机重启之后,持久Cookie都不会被清除.
Cookie的组成
Cookie的组成:NAME=VALUE;属性1=值;属性2=值;...
若 NAME(或VALUE)未被双引号包含,则 NAME(或VALUE)中不能出现逗号,分号,等号,空格.
domain属性
当浏览器发送一个 HTTP 请求时,将根据 Cookie 的 domain 属性来决定是否发送该Cookie,以下将用一个例子来说明:
若某次 HTTP 响应中有首部(见下),则表示 test1=wangwei 将发送给域 wangwei 下的所有主机,包括名为 wangwei 的主机(参见 DNS 域名结构来理解);而 test2=wangwei 仅发送给主机 wangwei.
Set-Cookie: test1=wangwei;domain=.wangwei.hfut.edu.cn /* 注意 wangwei 前面有一个点 */
Set-Cookie: test2=wangwei;domain=wangwei.hfut.edu.cn
若 Set-Cookie 首部中,未指定 domain 的值,则默认为产生 Set-Cookie 响应的服务器的主机名,如下:
// 向主机 210.45.240.29 发送 HTTP 请求,收到的响应有
Set-Cookie:rxnd=2011; path=/
// 则 Cookie(rxnd) 的 domain 取值为 210.45.240.29
// 向主机 tkkc.hfut.edu.cn 发送 HTTP 请求,收到的响应有
Set-Cookie:JSESSIONID=FC1154C9D221BB12B6F3BB3998CF6A34.tomcat2; Path=/
// 则 Cookie(JSESSIONID) 的 domain 取值为 tkkc.hfut.edu.cn
path属性
仅当 HTTP 请求的 URL 以 path 属性的值为前缀时,才会发送该 Cookie,如下
有 Cookie:
test1=wangwei;Path=/;domain=tkkc.hfut.edu.cn
test2=wangwei;Path=/student/;domain=tkkc.hfut.edu.cn
-
服务器 tkkc.hfut.edu.cn 的文件结构:
-
则当 http://tkkc.hfut.edu.cn/student/exam/ManageExam.do 时会发送 Cookie(test1),Cookie(test2);因为此时 URL 为 /student/exam/ManageExam.do 是以'/'和'/student/'为前缀的.
则当 http://tkkc.hfut.edu.cn/image/login_bg.png 时只会发送 Cookie(test1),因为此时 URL=/image/login_bg.png 只以 '/' 为前缀.
若为 PATH 属性指定值,则其值为产生 Set-Cookie 响应的 URL 路径.如下:
//向 localhost:9503/test/s.html 发送 GET 请求,在生成的 HTTP 响应中有:
Set-Cookie:"test1=wangwei
// 则 Cookie(test1) 的 PATH 属性的取值是 /test/
//向 localhost:9503/s.html 发送 GET 请求,在生成的 HTTP 响应中有:
Set-Cookie:"test1=wangwei
// 则 Cookie(test1) 的 PATH 属性的取值是 /
expires属性
expires 属性指定了 Cookie 的过期时间,格式:星期几,日-月-年 时:分:秒 GMT.如: expires=Sun, 01-Dec-2015 12:16:27 GMT
若未指定 expires 属性的值,则该 Cookie 为会话 Cookie.
传输编码
传输编码,改变了实体在网络中的传输方式.目前仅有一种传输编码,即分块编码(chunked).
- 浏览器,也可以使用分块编码来发送 HTTP 请求,只不过此时服务器可能不支持.
TE/Transfer-Encoding
TE,浏览器通过 TE 首部来指出其支持的传输编码,如:
TE: chunked
TE: trailers,chunked /* 此时表明浏览器支持块之后的托挂 */
Transfer-Encoding,HTTP 响应中的 Transfer-Encoding 首部表明了当前响应采用的传输编码.如 Transfer-Encoding:chunked
分块编码
分块编码,把实体分割为若干个大小已知的块,块之间是紧挨着发送的.这样服务器就可以边生成,边发送.
每一个块的格式:
块包含实体数据的字节长度(16进制)\r\n
块包含的实体数据
\r\n
-
最后一个块的格式为:
30\r\n /* 30,即 0x30.即'0' */
\r\n
拖挂,拖挂中存放的是若干个首部对,位于最后一个块后面;拖挂中的首部需要实现在 Trailer 首部中说明.除 Transfer-Encoding,Trailer,Content-Length 首部之外,其他 HTTP 首部都可以作为拖挂发送.