HTTP协议学习(下)

接下来说说响应部分,响应中的状态码也是面试中经常会被问到的。
和请求一样,响应也分为三部分:响应行、响应头、响应体,响应头和响应体之间也有一个空行。

响应行分为三部分:协议版本、状态码、状态描述,以空格分隔。
状态码以及对应描述也是面试中经常会被问到的,这里简单做个总结。
状态码分五种类型,由它们的第一位数字表示: 
1xx:信息,请求收到,继续处理 
2xx:成功,行为被成功地接受、理解和采纳 
3xx:重定向,为了完成请求,必须进一步执行的动作 
4xx:客户端错误,请求包含语法错误或者请求无法实现 
5xx:服务器错误,服务器不能实现一种明显无效的请求

常见的状态码有如下几种:
200 OK 客户端请求成功
301 Moved Permanently 请求永久重定向
302 Moved Temporarily 请求临时重定向
304 Not Modified 文件未修改,可以直接使用缓存的文件。
400 Bad Request 由于客户端请求有语法错误,不能被服务器所理解。
401 Unauthorized 请求未经授权。这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden 服务器收到请求,但是拒绝提供服务。服务器通常会在响应正文中给出不提供服务的原因
404 Not Found 请求的资源不存在,例如,输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误,导致无法完成客户端的请求。
503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。
更详细的参考这里

然后是响应头中的元信息,跟请求头一样,每行一个键值对。我们还是看一下上篇文章中贴出来的响应:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Date: Sat, 29 Oct 2016 10:12:11 GMT
Content-Type: text/html
Content-Length: 14613
Last-Modified: Tue, 18 Oct 2016 06:34:00 GMT
Connection: Keep-Alive
。。。略
Pragma: no-cache
Cache-control: no-cache
Accept-Ranges: bytes

<!DOCTYPE html><!--STATUS OK-->
<html>
。。。。。。略
</html>


其实有一部分键值对是在请求和响应中都会有的,叫做通用头域,它们是:
 1、Cache-Control
Cache- Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如 下: 
  Public指示响应可被任何缓存区缓存。 
  Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 
  no-cache指示请求或响应消息不能缓存 
  no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 
  max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 
  min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 
  max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 
 2、Date头域 
Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
 3、Pragma头域 
  Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。
 4、Connection
表示是否需要持久连接。1.0版的时候,每个TCP连接只能发送一个HTTP请求;HTTP响应返回后,TCP连接就关闭,如果还要请求其他资源,就必须再新建一个连接。但是每次建立TCP连接会导致速度、效率下降,所以当时一些浏览器厂商使用了非标准的Connection字段,在请求时将其值设为 keep-alive来告诉服务器不要关闭TCP连接,以便复用。到了1.1版本,这个字段就成了标准字段了,并且它的默认值就是keep-alive,于是就不用再声明它了。
此时,关闭TCP连接的方式设定一个时间阈值,通信的双方只要有任何一方发现对方在超过这个阈值没有任何活动时,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时,发送Connection: close,明确要求服务器关闭TCP连接。
这个字段有三个值:
  Close:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了。
  Keepalive:告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求。
  Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒),如Keep-Alive:300。

响应中特有的头包括:
1、Age
当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
2、Allow
服务器支持哪些请求方法,这个在上篇文章介绍OPTIONS方法的时候出现了。
3、Content-Encoding
WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象,它对应了请求头中的Accept-Encoding字段。
3、Content-Type
上篇文章中说过,协议第一版的时候,服务器只能回应HTML字符串。这显然无法满足需求,比如我们要欣赏苍老师的作品时,没有图片咋行?于是HTTP1.0增加了这个头字段,并且规定头信息必须是ASCII码,后面的数据可以是任何格式。Content-Type就是用来告诉浏览器响应体的数据是什么格式的,然后浏览器才知道怎么去解读。
这个字段常见的值包括:text/plain、text/html、text/css、image/jpeg、image/png、application/javascript、application/pdf、application/zip、audio/mp4、video/mp4等,学术的讲,这个值叫做MIME type,每个值包括一级类型和二级类型,之间用斜杠分隔。MIME type还可以在尾部使用分号,添加参数:
Content-Type: text/html; charset=utf-8
这表明,发送的是网页,而且编码是UTF-8。它对应了请求头中的Accept字段。
4、Content-Length
WEB服务器告诉浏览器自己响应的对象的长度或尺寸,单位是字节。
为什么要有这么一个东西呢?这跟上面的Connection字段有关。我们已经知道在1.0版本的时候,HTTP不是持久连接,只要断开连接,也就意味着响应结束,所以不需要知道响应长度。所以Content-Length并不是必须的,即使已经制定了出来。
但是到了1.1时代,TCP是可以复用的,上面可能承载了很多HTTP连接,那么这时如何知道一个HTTP数据流的结束呢?或者如何区分两个HTTP数据流呢?所以要用到这个字段。
5、Content-Language
这个头信息表示文档编写所使用的语言。例如,en、en-us、ru 等。
6、Last-Modified
这个头信息指示文档的最后修改时间。然后,客户端可以缓存文件,并在以后的请求中通过 If-Modified-Since 请求头信息提供一个日期。
7、Expires
这个头信息指定内容过期的时间,在这之后内容不再被缓存。
8、Server
 WEB服务器表明自己是什么软件及版本等信息,如上面的Apache-Coyote/1.1,这是一个tomcat充当的服务器。


 最后就是响应体了,没什么好说的,大部分就是HTML文档或者图片等资源。不过,我对这里有点思考:服务器是如何获取到这些资源的呢?或者说,这些内容是如何被安插到一个HTTP响应中的呢?对于静态的HTML文档,应该是服务器从文件系统中读取到数据再写入到响应中。思考这个有啥用呢?因为我在理解动态网页的时候就想,其实不过往响应中写入一堆数据嘛,至于这些数据从哪里来,可以是静态的HTML文档,也可以是代码自动生成的啊,比如java的servlet、jsp。

 嗯,接下来就该讲动态网页了。


参考:

https://hit-alibaba.github.io/interview/basic/network/HTTP.html

http://www.ruanyifeng.com/blog/2016/08/http.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值