HTTP协议

请求报文/相应报文

  • 请求报文的格式:

请求方法 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,实体的编码方法,对实体进行编码可以减少实体的大小,该首部的工作流程:

  1. 客户端在发送的 HTTP 请求中,使用 Accept-Encoding 首部来表明客户端支持的编码方法.如 Accept-Encoding:"gzip, deflate"

  2. 服务器在收到请求之后,生成原始响应,此时有原始的 Content-Length,以及 Content-Type;

  3. 服务器为了减少实体的大小,将使用客户端支持的编码方法对实体进行编码得到新的实体,编码后,Content-Length 被更改为新实体的字节大小,并且服务器将在 HTTP 响应报文中添加首部 Content-Encoding 来表明其使用的编码方法.

  4. 客户端在收到 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 的文件结构:

232353_DXLL_1383479.png

    • 则当 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 首部都可以作为拖挂发送.

001423_QLuX_1383479.png




转载于:https://my.oschina.net/u/1383479/blog/351246

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值