记录一下HTTP的学习笔记。
概述
HTTP协议,全称为HyperText Transfer Protocol,即为超文本传输协议,是Web的应用层协议。Web 浏览器实现了HTTP客户端,Web 服务器实现了HTTP的服务器端。HTTP 使用 TCP 作为运输层协议,HTTP 客户发起与服务器的 TCP 连接,之后就可以通过套接字互相通信。HTTP 的默认端口号是80。HTTP 客户向套接字接口发送请求报文,接收响应报文;HTTP 服务器从它的套接字接收请求报文,发送响应报文。HTTP 是无状态协议,即不保存客户状态信息。虽然HTTP是无状态协议,但是可以用 Cookie 技术做到识别用户。
HTTP报文格式
HTTP报文分为请求报文和响应报文,二者的通用格式如下如所示。
下面给出两类HTTP报文的报文头示例,以便于更好得理解。
请求报文的首部行有方法、URL和版本共三个字段。方法字段可以有以下几种:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
- GET:GET方法最为常用,当用户请求一个对象时使用GET方法,使用GET方法时实体体为空。
- POST:当用户提交表单时常用,使用POST方法时使用实体体,存放用户在表单字段的输入值。当然,用表单生成请求报文时也可以用GET方法,此时在所请求的URL中存放用户输入。
- HEAD:HEAD方法类似GET,不过不返回对象,应用程序开发者常用该方法进行调试跟踪。
- PUT:常与Web发行工具联合使用,运行用户上传对象到指定的Web服务器上的指定路径。该方法也被那些需要向Web服务器上传对象的应用程序使用。
- DELETE:该方法允许用户或者应用程序删除Web服务器上的对象。
- OPTIONS:用来查询针对请求URL指定的资源支持的方法。
- TRACE:让 Web 服务器端将之前的请求通信环回给客户端,这个方法不常用。
- CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。
请求报文中的URL字段即为请求对象,版本字段即为HTTP版本,上述实例表明浏览器实现的HTTP版本为HTTP/1.1。
响应报文的状态行也有三个字段,分别为版本、状态码和短语。与请求报文中的版本字段的含义相同,这里的版本字段指示服务器使用的HTTP版本,实例中为HTTP/1.1。状态码和短语指示请求的结果。状态码分为五大类,常见的状态码及对应短语如下。
1XX:信息性状态码,表示接收的请求正在处理
2XX:成功状态码,表示请求正常处理完毕
- 200 OK:请求成功,信息在返回的响应报文中。
- 204 No Content:请求成功,但返回的响应报文不包含实体的主体部分。
- 206 Partial Content :表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求,响应报文包含由 Content-Range 指定范围的实体内容。
3XX:重定向状态码,表示需要进行附加操作以完成请求
- 301 Moved Permanently:表示永久重定向,请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
- 302 Found表示临时重定向,和上一条相似,请求的资源被指定了新的URL,应用新的URL来访问。差别在于此处资源的转移并不是永久的。
- 303 See Other: 请求的资源存在另一个URL,应使用GET方法定向获取资源的请求。这里明确指出使用GET方法。
- 304 Not Modified: 客户端发送附带条件的请求时,服务器端运行访问资源,但未满足条件。
- 307 Temporary Redirect: 临时重定向。含义和302相同。但该状态码严格禁止请求方法由POST变成GET。
4XX:客户端错误状态码,表示服务器无法处理请求
- 400 Bad Request :请求报文中存在语法错误,服务器不能理解。
- 401 Unauthorized :表示用户发送的请求需要有HTTP认证信息(BASIC 认证、DIGEST 认证)。若之前已进行过一次请求,则表示用户认证失败。
- 403 Forbidden :服务器拒绝客户对请求资源的访问。
- 404 Not Found:请求的资源不在服务器上。
5XX:服务器错误状态码,表示服务器处理请求出错
- 500 Internal Server Error :服务器在执行请求时发生错误。
- 503 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
请求报文和响应报文的首部行都负责补充一些信息。首部字段也分几大类,每类也有好几种,这里结合上文实例记录几个常见的。
1.通用首部字段,即请求和响应通用
Cache-Control:用于控制缓存的行为
上文实例中的Cache-Control: private
表示仅向特定用户返回响应。
Connection字段控制不再转发给代理的首部字段,以及管理持久连接。
上文实例中的Connection: keep-alive
表示维持持续连接。
Data:创建报文的日期和时间。
如上述实例中text/html
表示媒体类型为文本文件且子类型为HTML文本。
2.请求首部字段
Host:请求资源所在的服务器
如上述实例中Host: www.baidu.com
指定了服务器的域名为www.baidu.com,就是访问百度。
Accept:通知服务器用户代理能处理的媒体类型及媒体类型的相对优先级,可使用type/subtype形式指定多种媒体类型。
上述实例中text/html
表示媒体类型为文本文件且子类型为HTML文本。
Accept-Encoding:告知服务器用户代理支持的内容编码及内容编码的优先级顺序,可一次性指定多种。
上述实例中指定了gzip, deflate, br
三种内容编码。
Accept-Language:告知服务器用户代理能够处理的自然语言集及对应的优先级。
User-Agent:用于传达浏览器的种类。
3.响应首部字段
Server:告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。
4.实体首部字段,包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
Content-Encoding:告知客户端服务器对实体的主体部分选用的内容编码方式。
上述实例中指定了Content-Encoding: gzip
意为实体主体部分的编码方式为gzip。
(哭了,太多了不写了,乱糟糟的,之后不懂就面向搜索引擎学习吧)
此外首部字段中还有为Cookie技术服务的首部字段:Cookie
和Set-Cookie
。Cookie技术在后面记录。
非持续性连接与持续性连接
顾名思义,非持续性连接就是连接好传完请求对象后就断开了,而持续性连接是在服务器发送响应后仍然保持客户服务器之间的连接。
非持续性连接有一定的缺点,首先是必须为每一个请求的对象建立和维护一个全新的连接,如此则大量的请求会给服务器带来较大的负担。另外由于每一次的TCP连接都涉及“三次握手”的过程,前两次握手纯粹是用来创建连接,并没有传递客户请求和服务器响应,因此如果采用非持续性连接,响应完就断开,就会浪费时间。采用持续连接,相同的客户与服务器之间就能使用原先创建的连接进行通信,如此则不会给Web服务器带去过大的负担,而且后续的通信也省去了创建连接所花的时间。一般而言,当一条连接长时间不用,服务器也会关闭此连接。
Cookie
HTTP无状态的特点可以减少服务器CPU和内存的消耗,但也产生一定的麻烦,Web服务器无法根据客户之前的状态对客户的新请求进行处理。为此,HTTP使用 Cookie 技术帮助 Web 站点管理用户状态。
当用户访问 Web 站点时,Web服务器会在发给用户的响应报文中写入Cookie信息,即在首部行中用Set-Cookie字段说明信息,通知客户端保存Cookie信息。当客户再次访问Web站点时,客户会在请求报文中加入Cookie信息。Web服务器通过发来的 Cookie 信息识别用户,对比服务器中的记录,得到之前的状态信息。
观察上述实例,可以在首部行中找到用于实现 Cookie 技术的Cookie和Set-Cookie字段。这里在请求报文中已经有Cookie了,因为我在之前已经访问过 baidu 了。
Cookie技术的一个使用案例是记录用户的登录状态。当用户在某个网站上登录了一次后,下次进去发现该网站直接就是已经登录了的。实现方法就是把用户信息保存在Cookie中,下次访问该网站时直接验证了Cookie中的用户信息,因此就不需要用户再次手动登录了。
参考资料
[1]《计算机网络自顶向下方法》
[2]《图解HTTP》