应用层——HTTP 协议

1. 概述

超文本传送协议 HTTP 是一个应用层协议,HTTP 使用了面向连接的 TCP 作为运输层协议,保证了数据的可靠传输。 HTTP 不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP 协议本身是无连接的。这就是说,虽然 HTTP 使用了 TCP 连接,但通信的双方在交换 HTTP 报文之前不需要先建立 HTTP 连接。

HTTP 协议是无状态的。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。 HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求。

请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间 RTT (一个 RTT 用于连接 TCP 连接,另一个 RTT 用于请求和接收万维网文档 )。HTTP/1.1 协议使用了持续连接,万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求报文和响应报文。

HTTP/1.1 协议的持续连接有两种工作方式,即非流水线方式(without pipelining)和流水线方式(with pipelining) 。非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在 TCP 连接已建立后,客户每访问一次对象都要用去一个往返时间 RTT。流水线方式的特点,是客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。

2. HTTP 的报文结构

2.1 请求报文

在这里插入图片描述
CRLF 表示回车换行,回车表示光标回到本行开始,换行表示到达下一行。

举例:
在这里插入图片描述
请求行:由 Method、URL、Version 三个字段组成,每个字段之间都有一个空格,为了便于解析。

请求报文中常用的几种方法:

  • GET,用于请求服务器发送某个资源。
  • HEAD,请求读取资源的首部。使用 HEAD 可以在不获取资源的情况下了解资源的情况;通过查看响应中的状态码,看看某个对象是否存在;通过查看首部,测试资源是否被修改(web 缓存服务器中常用)。
  • PUT,向服务器上传资源。
  • POST,向服务器发送数据。通常用在 HTML 的表单提交。
  • TRACE,用来进行环回测试的请求报文。TRACE 请求会在目的服务器端发起一个“环回”诊断。行程最后一站的服务器会弹回一条 TRACE 响应,并在目的响应主体中携带它收到的请求报文。这样客户端就可以查看在所有中间 HTTP 应用程序组成的请求/响应链上,原始报文是否,以及如何被损坏或修改。
  • DELETE,删除指明的 URL 所标志的资源。
  • OPTIONS,请求 Web 服务器告知其支持的各种功能。询问服务器支持哪些方法,或者对某些特殊资源支持哪些方法。

多个首部字段构成如下:

  • Accept:指定客户端能够接收的内容格式类型
  • Accept-Language :指定客户端能够接受的语言类型
  • Accept-Ecoding :指定客户端能够接受的编码类型
  • User-Agent :用户代理,向服务器说明自己的操作系统、浏览器等信息
  • Connection:是否开启持久连接(keepalive)。
  • Host :服务器域名

2.2 响应报文

在这里插入图片描述
举例:
在这里插入图片描述
状态行:用来说明服务器做了什么,是否正确响应了。

响应首部字段:

  • Server:服务器软件名,Apache/Nginx
  • Date:服务器发出响应报文的时间
  • Last-Modified :请求资源的最后的修改时间
  • Content-Type :文件类型信息

常见状态码:
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

  • 1xx:指示信息——表示请求已接收,继续处理
  • 2xx:成功——表示请求已被成功接收、理解、接受
  • 3xx:重定向——要完成请求必须进行更进一步的操作
  • 4xx:客户端错误——请求有语法错误或请求无法实现
  • 5xx:服务器端错误——服务器未能实现合法的请求

200 OK :客户端请求成功

301 Moved Permanently:永久重定向,该状态码表示请求的资源已被分配了新的URL, 以后应使用资源现在所指的 URL。 也就是说, 如果已经把资源对应的 URL 保存为书签了, 这时应该按 Location 首部字段提示的 URL 重新保存。

302 Found:临时性重定向,该状态码表示请求的资源已被分配了新的URL, 希望用户(本次) 能使用新的URL访问。和 301 Moved Permanently 状态码相似, 但302状态码代表的资源不是被永久移动, 只是临时性质的。 换句话说, 已移动的资源对应的URL将来还有可能发生改变。 比如, 用户把URL保存成书签, 但不会像301状态码出现时那样去更新书签, 而是仍旧保留返回302状态码的页面对应的URL。

400 Bad Request :客户端请求有语法错误,不能被服务器所理解

401 Unauthorized :请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden :服务器收到请求,但是拒绝提供服务

404 Not Found :请求资源不存在,eg:输入了错误的 URL

500 Internal Server Error :服务器发生不可预期的错误

503 Server Unavailable :服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

3. cookie 和 session

Session是另一种记录客户状态的机制。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

由于 HTTP 是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。Cookie 实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认用户状态。服务器还可以根据需要修改 Cookie 的内容。

cookie 技术有四个组件:

  • 在 HTTP 响应报文中的一个cookie 首部行;
  • 在 HTTP 请求报文中的一个cookie 首部行;
  • 在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理;
  • 位于Web 站点的一个后端数据库。

cookie 是实现 session 机制的一种方式。

4. HTTP 各版本特点以及 HTTPS

  • HTTP/0.9:HTTP 协议的最初版本,功能简陋,仅支持请求方式 GET,并且仅能请求访问HTML格式的资源。
  • HTTP/1.0:在0.9版本上做了进步,增加了请求方式 POST 和 HEAD;不再局限于0.9版本的 HTML 格式,根据 Content-Type 可以支持多种数据格式,即 MIME 多用途互联网邮件扩展,例如text/html、image/jpeg等;同时也开始支持 cache,就是当客户端在规定时间内访问统一网站,直接访问 cache 即可。但是1.0版本的工作方式是每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive,这里注意和http1.1比较。
  • HTTP/1.1的特点:支持持续连接:持久连接称为 http-keepalive 功能,只有任意一方没有提出断开连接,那么这条连接就保持,只要任意一端没有明确提出断开TCP连接,就一直保持连接,可以发送多次HTTP请求 。支持流水线方式:客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。
  • HTTPS:http 都是使用明文通信的,非常不安全,HTTPS就是安全的HTTP,在http与传输层之间加上了一个SSL。HTTPS = HTTP+ 加密 + 认证 + 完整性保护。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章