HTTP的请求报文结构和响应报文结构
HTTP请求报文主要由请求行、请求头、空行、请求正文(Get请求没有请求正文)4部分组成。
1、请求行
- 由三部分组成,分别为:请求方法、URL以及协议版本,之间由空格分隔;
- 请求方法包括GET、HEAD、PUT、POET、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,出于安全性的考虑也是不同的;
- 协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1;
2、请求头
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。
常见请求头如下:
3、空行
请求头的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。
4、请求正文
可选部分,比如GET请求就没有请求正文。
HTTP响应报文主要由状态行、响应头、空行、响应正文4部分组成。
1、状态行
由3部分组成,分别为:协议版本、状态码、状态码描述,之间由空格分隔;
2、响应头
与请求头类似,为响应报文添加一些附加信息。
常见响应头如下:
3、空行
4、响应正文
常见HTTP首部字段
A、通用首部字段(请求报文与响应报文都会使用的首部字段)
- Date:创建报文时间
- Connection:连接的管理
- Cache-Control:缓存的控制
- Transfer-Encoding:报文主体的传输编码方式,如Transfer-Encoding: chunked。
B、请求首部字段(请求报文会使用的首部字段)
- Host:请求资源所在服务器
- Accept:可处理的媒体类型
- Accept-Charset:可接收的字符集
- Accept-Encoding:可接受的内容编码
- Accept-Language:可接受的自然语言
C、响应首部字段(响应报文会使用的首部字段)
- Accept-Ranges:可接受的字节范围
- Location:另客户端重新定向到的URI
- Server:HTTP服务器的安装信息
D、实体首部字段(请求报文与响应报文的实体部分使用的首部字段)
- Allow:资源可支持的HTTP方法
- Content-Type:实体主类的类型
- Content-Encoding:实体主体适用的编码方式
- Content-Language:实体主体的自然语言
- Content-Length:实体主体的字节数
- Content-Range:实体主体的位置范围
HTTP状态码含义
-
200 OK 服务器已成功处理了请求并提供了请求的网页。
-
202 Accepted 已经接受请求,但处理尚未完成。
-
204 No Content 没有新文档,浏览器应该继续显示原来的文档。
-
206 Partial Content 客户但进行了范围请求。响应报文中由Content-Range指定实体内容的范围。实现断点续传。
-
301 Moved Permanently 永久性重定向。请求的网页已永久移动到新位置。
-
302(或307) Moved Temporatily 临时性重定向。请求的网页临时移动到新位置。
-
304 Not Modified 未修改。自从上次请求后,请求的内容未修改过。
-
401 Unauthorized 客户试图未经授权访问受密码保护的页面
-
403 Forbidden 服务器拒绝请求。
-
404 Not Found 服务器上不存在客户机所请求的资源。
-
500 Internal Server Error 服务器遇到一个错误,使其无法为请求提供服务。
HTTP中有关缓存的首部字段有哪些?HTTP的浏览器缓存机制?
Last-Modified和ETags如何帮助提高性能?
聪明的开发者会把Last-Modified和ETags请求的HTTP报头一起使用,这样可利用客户端的缓存。因为服务器首先产生Last-Modified/ETags标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其缓存。
扩展2:既然有了Last-Modified,为什么还要用ETags字段呢?
- 某些文件修改非常频繁,比如在秒以下的时间内进行修改,If-Modified-Since能检查到的粒度是秒级的,这种修改无法体现。
- 一些文件也许会周期性的更改,但是它的内容并不改变(仅仅改变修改的时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
- 某些服务器不能精确的得到文件的最后修改时间。
- 因此,HTTP/1.1利用Entity Tag 头提供了更加严密的验证。Last-Modified与ETag一起使用时,服务器会优先验证ETag的值。
3、Expires/Cache-Control(优先使用)
用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到服务器取数据。
当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:
第一种是Expires,比如:Expires: Sun, 16 Oct 2016 05:43:02 GMT
不过Expires有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存的失效可能并不能精确地按服务器的预期进行。
第二种是Cache-Control,比如:Cache-Control: max-age=315360000
这里声明的是一个相对的秒数,表示从现在起,315360000秒内缓存都是有效的,这样就避免了服务端和客户端时间不一致的问题。
但是Cache-Control是HTTP1.1才有的,不适用于HTTP1.0,而Expires既适用于HTTP1.0,也适用于HTTP1.1,所以说在大多数情况下,同时发送这两个头回是一个更好的选择,当用户端两种头都能解析的时候,会优先使用Cache-Control。
HTTP1.1和HTTP1.0的区别。(HTTP1.1版本的4个特性)
1、默认持久连接和流水线
HTTP/1.1默认使用持久连接,只要客户端服务端任意一端没有明确提出断开TCP连接,就一直保持连接,在同一个TCP连接下,可以发送多次HTTP请求。同时,默认采用流水线的方式发送请求,即客户端每遇到一个对象引用就立即发出一个请求,而不必等到收到前一个响应之后才能发出下一个请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送相应结果,以保证客户端能够区分出每次请求的相应内容,这样也显著地减少了整个下载过程所需要的时间。
HTTP/1.0默认使用短连接,要建立长连接,可以在请求消息中包含Connection: Keep-Alive头域,如果服务器愿意维持这条连接,在响应消息中也会包含一个Connection: Keep-Alive的头域。Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次清秋节过后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。
2、分块传输数据
HTTP/1.0可用来指定实体长度的唯一机制是通过Content-Length字段。静态资源的长度可以很容易的确定,但是对于动态生成的响应来说,为获取它的真是长度,只能等它完全生成之后,才能正确地填写Content-Length的值,这便要求缓存整个响应,在服务器端占用大量的缓存,从而延长了响应用户的时间。
3、状态码 100 Continue
HTTP/1.1加入了一个新的状态码 100 Continue,用于客户端在发送POST数据给服务器前,征询服务器的情况,看服务器是否处理POST数据。
4、Host域
HTTP1.1在Request消息头里多了一个Host域,HTTP1.0则没有这个域。在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,这个IP地址上只有一个主机。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。
常用的HTTP方法有哪些?
注意:只有POST和PUT方法才有请求内容。
- GET:用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器。
- POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
- PUT:传输文件,报文主体中包含文件内容,保存到对应URI位置。
- HEAD:获得报文首部,与GET方法类似,只是不返回报文主体。
- DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
- OPTIONS:查询相应URL支持的HTTP方法。
注意:并非所有的服务器都实现了这几个方法。有的服务器还实现了自己持有的HTTP方法,称为扩展方法。
GET: GET可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据返回给客户端。GET请求中,永远不会包含呈现数据。
HEAD: HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常用GET,但这里用HEAD则意义更加明确。
PUT:这个方法比较少见。本质上来讲,PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST没有,POST的数据存放位置由服务器自己决定。
DELETE:删除某一个资源。
POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。
OPTIONS:这个方法很有趣,但极少使用。它用于获取当前URL所支持的方法。
TRACE:请求服务器回送收到的请求信息,主要用于测试和判断,所以是安全的。
HTTP的请求方式get和post的区别?
GET一般用于获取或者查询资源信息,这就意味着它是幂等的(对于同一个URL的多个请求返回同样的结果)和安全的(没有修改资源的状态),而POST一般用于更新资源信息,POST既不是安全的,也不是幂等的。
为什么HTTP是无状态的?如何保持状态(会话跟踪技术、状态管理)?
**HTTP无状态:**无状态是指协议对于事务处理没有记忆能力,不能保存每次客户端提交的信息,即当服务器返回应答之后,这次事务的所有信息就都丢掉了。如果用户发来一个新的请求,服务器也无法知道它是否与上次的请求有联系。
**优点:**服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。
**缺点:**缺少状态意味着如果后续处理需要前面的信息,则客户端必须重传,这样可能导致每次连接每次连接传送的数据量增大。
针对这些缺点,可以采用会话跟踪技术来解决这个问题。把状态保存在服务器中,只发送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在服务器上的状态信息了。
有四种会话跟踪技术:
- COOKIE;
- Session;
- URL 重写;
- 作为隐藏域嵌入HTML表单中(隐藏表单域);
在浏览器和服务器之间来回传递一个标识符,这就是所谓的会话(session)跟踪。来自浏览器的所有包含同一个标识符(这里是SESSIONID)的请求同属于一个会话。
HTTP断点续传的原理
要实现断点续传下载文件,首先要了解断点续传的原理。**断点续传其实就是在上一次下载断开的位置开始继续下载。**HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。在以前版本中HTTP协议是不支持断点的,HTTP/1.1开始就支持了,一般断点下载时才用到Range和Content-Range实体头。