HTTP协议笔记

HTTP协议的特点: 1. 支持客户端/服务器模式 2. 简单快速: 客户端向服务器请求服务时, 只需传送请求方法和路径. 请求方法常用的有GET, HEAD, POST. 每种方法规定了客户端与服务器联系的类型. 由于HTTP协议简单, 使得HTTP服务器的程序规模小, 因而通信速度很快. 3. 灵活: HTTP 允许传输任意类型的数据对象. 正在传输的类型由Content-Type加以标记. 4. 无连接: 限制每次连接只处理一个请求. 服务器处理完客户端的请求, 并收到客户端的应答后, 即断开连接. 采用着用方式可以节省传输时间. 5. 无状态: 无状态是指协议对于事务处理没有记忆能力. 缺少状态意味着如果后续处理需要前面的信息, 则它必须重传, 这样可能导致每次传送的数据量增大. 另一方面, 在服务器不需要先前信息时, 它的应答就较快.

URL

HTTP是一种基于请求与响应模式的, 无状态的, 应用层的协议, 常基于TCP的连接方式, HTTP1.1版本中给出一种持续连接的机制, 绝大多数的web开发, 都是构建在HTTP协议之上的web应用.

HTTP URL(URL是一种特殊类型的URI, 包含了用于查找某个资源的足够的信息)的格式如下: http://host[:port][abs_path]

  • http 表示要通过HTTP协议来定位网络资源
  • host 表示合法的Internet主机域名或者IP地址
  • port 指定端口号, 缺省端口为80
  • abs_path 指定请求资源的URI
  • 若URI 中没有给出abs_path, 那当它作为请求URI时, 必须以"/" 的形式给出, 通常这个工作浏览器会自动完成
请求

HTTP请求由三部分组成: 请求行, 消息报头, 请求正文

请求行

以一个方法符号开头, 以空格分开, 后面跟请求的URI和协议的版本, 格式如下: Method Request-URI HTTP-Version CRLF

请求方法有以下几种 - GET 请求获取Request-URI 所标识的资源 - POST 在Request-URI 表标识的资源后附加新的数据 - HEAD 请求获取由Request-URI 所标识的资源的响应消息报头 - PUT 请求服务器存储一个资源, 并用Request-URI 作为其标识 - DELETE 请求服务器删除Request-URI 所标识的资源 - TRACE 请求服务器会送收到的请求信息, 主要用于测试或诊断 - CONNECT 保留将来使用 - OPTIONS 请求查询服务器的性能, 或查询与资源相关的选项和需求

响应

HTTP响应由三部分组成: 状态行, 消息报头, 响应正文

状态行

格式: HTTP-Version Status-Code Reason-Phrase CRLF

状态码由三位数字组成, 第一个数字定义了响应的类别: - 1xx: 指示信息 – 表示请求已接受, 继续处理 - 2xx: 成功 – 表示请求已被成功接收, 理解, 接受 - 3xx: 重定向 – 要完成请求必须进行更进一步的操作 - 4xx: 客户端错误 – 请求有语法错误或请求无法实现 - 5xx: 服务器端错误 – 服务器未能实现合法的请求

报头

HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成. 请求消息和相应消息都是由开始行(对于请求消息, 开始行就是请求行, 对于响应消息, 开始行就是状态行), 消息报头(可选), 空行(只有CRLF的行), 消息正文(可选) 组成

HTTP 消息报头包括 普通报头, 请求报头, 响应报头, 实体报头 每一个报头域都是由名字 + ":" + 空格 + 值 组成, 消息报头域的名字是大小写无关的.

普通报头

在普通报头中, 有少数报头域用于所有的请求和响应消息, 但并用于被传输的实体, 只用于传输的消息 例: Cache-Control 用于指定缓存指令, 缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现), 且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制), HTTP1.0使用类似的报头域为Pragma. 请求时的缓存指令包括: 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, s-maxage eg: 为了指示IE浏览器(客户端)不要缓存页面, 服务器端的JSP程序可以编写如下: response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache"); 两者作用相同, 在发送的响应消息中设置普通报头域: Cache-Control: no-cache.

请求报头

请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息.

常用的请求报头域: Accept Accept 请求报头域用于指定客户端接收哪些类型的信息. 如: Accept:image/gif, 表明客户端希望接收GIF图像格式的资源; Accept:text/html, 表明客户端希望接受html 文本

Accept-Charset 指定客户端接受的字符集. 如: Accept-Charset:iso-8859-1,GB2312. 如果请求消息中没有设置这个域, 缺省是任何字符集都可以接受.

Accept-Encoding 指定可接受的内容编码. 如Accept-Encoding:gzip.deflate 缺省是任何内容编码都可以接受

Accept-Language 指定一种自然语言. 如 Accept-Language:zh-cn 缺省是任何语言都可以接受

Authorization 用于证明客户端有权查看某个资源. 当浏览器访问一个页面时, 如果收到服务器的响应代码为401, 可以发送一个包含Authorization请求报头域的请求, 要求服务器对其进行验证

Host(发送请求时, 该报头域是必需的) 指定被请求资源的Internet主机和端口号, 通常从HTTP URL中提取出来

User-Agent 允许客户端将它的操作系统, 浏览器和其他属性告诉服务器. 不过这个报头域不是必需的, 如果我们自己写一个浏览器, 不使用User-Agent 请求报头域, 那么服务器端就无法得知我们的信息了.

请求报头示例

GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbigmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Acdept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:Mozilla/4.0(compatible;MSIE6.0,Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)
响应报头

响应报头允许服务器传递不能放在状态行中的附加响应信息, 以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息

Location 重定向接受者到一个新的位置. Location响应报头域常用在更换域名的时候

Server 包含了服务器用来处理请求的软件信息. 与User-Agent 请求报头域是相对应的 例: Server:Apache-Coyote/1.1

WWW-Authenticate WWW-Authenticate 响应报头域必须包含在401响应消息中, 客户端收到401响应消息的时候, 并发送Authorization报头域请求服务器对其进行验证时, 服务端响应报头就包含该报头域 例: WWW-Authenticate:Basic realm="Basic Auth Test!

实体报头

请求和响应消息都可以传送一个实体. 一个实体由实体报头域和实体正文组成, 但并不是实体报头域和实体正文要在一起发送, 可以只发送实体报头域. 实体报头定义了关于实体正文(如: 有无实体正文) 和请求所标识的资源的元信息.

Content-Encoding 被用作媒体类型的修饰符, 它的值指示了已经被应用到实体正文的附加内容的编码, 因而要获得Content-Type 报头域中所引用的媒体类型, 必须采用相应的解码机制.

Content-Language 描述了资源所用的自然语言. 没有设置该域则认为实体内容将提供给所有的语言阅读

Content-Length 指明实体正文的长度, 以字节方式存储的十进制数字来表示

Content-Type 指明发送给接受者的实体正文的媒体类型 例: Content-Type:text/html;charset=ISO-8859-1 Content-Type:text/html;charset=GB2312

Last-Modified 指示资源的最后修改日期和时间

Expires 给出响应国企的日期和时间. 为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时, 直接从缓存中加载, 缩短响应时间和降低服务器负载) 的页面, 我们可以使用Expires 实体报头域指定页面过期的时间. 例: Expires:Thu, 15 Sep 2006 16:23:12 GMT

HTTP1.1 的客户端和缓存必须将其他非法的日期格式(包括0) 看作已经过期 为了让浏览器不要缓存页面, 我们也可以利用Expires 实体报头域设置为0, jsp中程序如下: response.setDateHeader("Expires", "0");

Licensed under CC BY-NC-SA 4.0
Built with Hugo
主题 StackJimmy 设计