抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

报文和实体的差别

关于第三章中报文和实体的差别,书中讲得太简洁。

报文要么是一个请求报文,要么就是一个响应报文。

一次传输中,在应用层来看,就是一个传输的单位(客户端请求服务器,是发送一个“请求报文”,服务器响应客户端,则发送“响应报文”),即为书中说的:

报文是HTTP通信中的基本单位,通过HTTP通信传输 实体其实是报文的一部分,存在于报文主体内 如一个GET请求报文中,就没有报文主体。
那么这种情况下,也就不存在实体 实体是作为请求或响应的有效载荷数据被传输 那么在如响应报文中有:

1
2
3
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 5 1234

那么1234就是实体。 实体的内容由实体首部和实体主体组成: 实体头部不一定会有。如上面“1234”这部分内容,就只有实体主体,没有实体头部。
实体主体也确实等同于报文主体:在没有实体头部的时候就是这样 需要实体头部的场合,则是“传输中需要进行编码操作”的时候,如传输表单内容:

1
2
3
4
5
6
7
8
9
10
POST /upload HTTP/1.1 
Host: example.com
Content-Length: xxx
Content-Type: multipart/form-data; boundary=AaBbCcDd
--AaBbCcDd
Content-Disposition: form-data; name="username" RuphiLau
--AaBbCcDd
Content-Disposition: form-data; name="file"; filename="picture.jpg"
Content-Type: image/jpeg ...(picture.jpg的数据)...
--AaBbCcDd--

这个报文里有多个实体 实体里,也有实体头部、实体主体,同样是通过CR+LF分割。 在现在的http协议下,传输编码只有一种:Transfer-Encoding: chunked 在其他任何情况下,实体=实体主体
而这就刚好对应了上文的:编码提升效率 也就是说,当实体(像图片,文本这种数据的载体)不进行编码时,传输数据按照原貌直接传输,报文主体和实体主体是同一样东西.但是为了提高传输效率,要对实体进行编码 比如说:一个图片按原文传输需要5个字节,编码以后传输就是3个字节了,相当于主体内容已经改变了,但是报文主体是不变的,已经发生了变化



HSTS

HTTP Strict Transport Security(HSTS)告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP

配置:

1
2
3
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload

简介

一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com 或者直接 foo.com。

这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求

处理步骤

你的网站第一次通过HTTPS请求,服务器响应Strict-Transport-Security 头,浏览器记录下这些信息,然后后面尝试访问这个网站的请求都会自动把HTTP替换为HTTPS。

当HSTS头设置的过期时间到了,后面通过HTTP的访问恢复到正常模式,不会再自动跳转到HTTPS。

每次浏览器接收到Strict-Transport-Security头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。

Chrome、Firefox等浏览器里,当您尝试访问该域名下的内容时,会产生一个307 Internal Redirect(内部跳转),自动跳转到HTTPS请求

评论