详解HTTP

    xiaoxiao2022-07-02  115

           HTTP协议,是B/S网络架构中的核心组成部分,全称是Hyper Text Transfer Protocol(超文本传输协议),用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。关于超文本的历史:

           1963年,德特·纳尔逊(Ted Nelson)创造了术语“超文本”。1981年,德特在他的著作中使用术语“超文本”描述了这一想法:创建一个全球化的大文档,文档的各个部分分布在不同的服务器中。通过激活称为链接的超文本项目,例如研究论文里的参考书目,就可以跳转到引用的论文。

           HTTP是一个基于传输层TCP/IP协议的应用层协议,一个HTTP请求由三部分组成,即请求行,请求头,以及请求体,一个HTTP响应。

    请求行包括了:方法字段、URL字段和HTTP协议版本,如:GET /index.html HTTP/1.1。请求体则包括了请求数据。要理解HTTP,最重要的就是要熟悉HTTP中的HTTP Header(请求头以及响应头),HTTP Header控制着互联网成千上万的用户的数据的传输,最重要的是,它控制着用户浏览器的渲染行为和服务器的执行逻辑。例如:当服务器没有用户请求的数据时,就会返回一个404状态码。

           常见的HTTP请求头和响应头

           

    常见的HTTP请求头             请求头                                                   说明Accept-Charset用于指定客户端接受的字符集Accept-Encoding用于指定可接受的内容编码,如Accept-Encoding:gzip.deflateAccept-Language用于指定一种自然语言,如Accpet-Language:zh-cnHost用于指定被请求资源的Internet主机和端口号,如Host:www.baidu.comUser-Agent客户端将它的操作系统,浏览器和其他属性告诉服务器Connection当前连接是否保持,如Connection:Keep-Alive

     

    常见的HTTP响应头 响应头说明Server使用的服务器名称,如Server:Apache/1.3.6Content-Type用来指明发送给接收者的实体正文的媒体类型,如Content-Type:text/html;chatset=GBKContent-Encoding与请求头Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码Content-Language描述了资源所用的自然语言,与Accept-Language对应Content-Length指明实体正文的长度,用以字节方式存储的十进制数字来表示Keep-Alive保持连接的时间,如Keep-Alive:timeout=5,max=120

     

    常见的HTTP状态码         状态码                                             说明200客户端请求成功302临时跳转,跳转的地址通过Location指定400客户端请求有语法错误,不能被服务器识别403服务器收到请求,但是拒绝提供服务404请求的资源不存在500服务器发生不可预期的错误

    浏览器缓存

           当我们请求一个页面的时候,可能会发现一些异常,比如请求www.qq.com,可能会发生不同的时间段请求,获得的是相同的内容这种情况,这时候我们一般的做法是按Ctrl+F5组合键重新请求一次这个页面,重新请求的页面一定是最新的页面。这是因为当我们使用Ctrl+F5组合键刷新一个页面时,浏览器会直接请求目标URL而不会使用浏览器缓存的数据,并且会在HTTP请求头中会加入一些请求头,它告诉服务端我们要获取最新的数据而不是缓存。

           1.Cache-Control/Pragma

           这个HTTP Head字段用于指定所有缓存机制在整个请求请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP相关的缓存或代理服务器。HTTP Head字段有一些可选值,如下表所示:

    Cache-Control可选值 可选值说明Public所有内容都将被缓存Private内容只缓存到私有缓存中,在响应头中设置no-cache所有内容都不会被缓存,在请求头和响应头中设置no-store所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置must-revalidation/proxy-revalidation如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置max-age=xxx缓存的内容在XXX秒后失效,这个选项只在HTTP1.1中可用,和Last-Modified一起使用时优先级较高,在响应头中设置

           Cache-Control的优先级比较高,当它和别的字段一同出现时,它会覆盖其他字段的作用,如Expires。Pragma字段的作用和Cache-Control有点类似,它也是在HTTP头中包含一个特殊的指令,使相关的服务器遵守改指令,最常用的就是Pragma:no-cache,它和Cache-Control:no-cache的作用是一样的。

           2.Expires

           Expires的格式是:Fri,24 May 2019 11:35:15 GMT,后面是一个日期和时间,超过这个时间点后,缓存的内容就会失效。浏览器在发送请求之前会检查这个值,如果超过了,就不会使用缓存,直接请求服务器。 

           3.Last-Modified/Etag

           Last-Modified 字段一般用于表示一个服务器上的资源的最后修改时间,静态内容自动加上Last-Modified字段,动态内容如Servlet提供了一个getLastModified方法用于检查某个动态内容是否已经更新。通过这个最后修改时间可以判断当前请求的资源是否是最新的。

           一般服务器在响应头中返回一个Last-Modified字段,告诉浏览器这个页面的最后修改时间,如Last-Modified:Fri,24 May 2019 11:35:15 GMT,浏览器再次请求时在请求头中增加一个If-Modified-Since:Fri,24 May 2019 11:35:15 GMT字段,询问当前缓存的页面是否是最新的,如果是最新的就返回304状态码,告诉浏览器是最新的,服务器也不会传输新的数据。

           Etag字段的功能跟Last-Modified差不多,这个字段的作用是让服务端给每个页面分配一个唯一的编号,然后通过这个编号来区分当前这个页面是否是最新的。这种方式比Last-Modified更加灵活,但是在后端的Web服务器有多台时比较难处理,因为每个Web服务器都要记住网站的所有资源,否则浏览器返回这个编号就没有意义了。

    最新回复(0)