HTTP 协议和服务

目录

一、概述

二、HTTP 协议的基本过程

请求

响应

无状态特性

内部过程

向服务器发出请求的方法

HTTP 1.1 持久连接

使用 Cookies 的状态管理

三、HTTP 报文

四、返回结果的 HTTP 状态码

五、Web 服务器

六、HTTP 首部

HTTP 首部字段

HTTP/1.1 通用首部字段

请求首部字段

响应首部字段

实体首部字段

为 Cookie 服务的首部字段

七、HTTPS

HTTP 的缺点

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

八、其他

HTML

动态 HTML

Web 应用

XML


一、概述

1.应用层 HTTP 协议是 Web 的核心。

2.Web 页面(web page)是客户端和服务器交流的基本内容,有多个对象构成,对象是可由 URL 进行寻址(存放于 Web 服务器)的文件,例如 HTML 文件、JPG 图像、GIF 图像等。

3.Web 页面大多数由一个基本 HTML 文件和很多 HTML 文件中所引用的对象构成。这个基本的 HTML 文件使用文件中的内置 URL 来引用本页面所使用的其他对象。

4.一个 URL(Union Resource Locator,统一资源定位符)由两部分构成:

  • 存放该对象的服务器主机名
  • 该对象的路径名

例如 https://www.nowcoder.com/activity/oj 中,www.nowcoder.com是一个主机名,/activity/oj是一个路径名。

二、HTTP 协议的基本过程

请求

一个客户端与服务器建立连接后,发送一个请求给服务器,请求报文是由 请求方法、 请求 URI、 协议版本、 可选的请求首部字段( MIME 信息,包括请求修饰符、客户端信息等)和内容实体构成的。

  • 起始行开头的GET表示请求访问服务器的类型, 称为方法(method) 。
  • 随后的字符串 /index.htm 指明了请求访问的资源对象,也叫做请求 URI(request-URI) 。
  • 最后的 HTTP/1.1, 即 HTTP 的版本号, 用来提示客户端使用的 HTTP 协议功能。

响应

服务器接到客户端的请求后,向客户端发送相应的响应信息

响应报文基本上由 协议版本、状态码(表示请求成功或失败的数字代码) 、用以解释状态码的原因短语、可选的响应首部字段(MIME 信息,包括服务器信息)以及实体主体构成。

  • HTTP/1.1 表示服务器对应的 HTTP 版本。
  • 200 OK 表示请求的处理结果的状态码(status code) 和原因短语(reason-phrase) 。 下一行显示了创建响应的日期时间, 是首部字段(header field) 内的一个属性。
  • 接着以一空行分隔, 之后的内容称为资源实体的主体(entitybody) 。

无状态特性

HTTP 协议中,每当有新的请求发送时,就会有对应的新响应产生。协议本身不保留之前的一切请求和响应的报文的信息,这是为了更快地处理大量的事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。

但是随着 Web 的不断发展,这种无状态的特性带来了许多问题。比如用户在一家网站上不同的页面跳转,但是要时刻保持记录用户的登录状态,网站为了能够掌握是谁发送出了请求,就需要保存用户的状态。

HTTP/1.1 虽然是无状态协议, 但为了实现期望的保持状态功能, 于是引入了 Cookie 技术。 有了 Cookie 再用 HTTP 协议通信, 就可以管理状态了。

内部过程

(1)建立连接:连接的建立是通过申请套接字(Socket)实现的。客户端打开一个套接字并把它绑定在一个端口上,如果成功,就相当于建立了一个虚拟文件。

(2)发送请求信息:打开一个连接后,客户端把请求消息发送到服务器的停留端口上。 常用的请求方法有 GET、HEAD 和 POST。

(3)发送响应信息:服务器在处理完客户的请求之后,向客户端响应。

(4)关闭连接:客户端与服务器双方都可以通过关闭套接字来结束 TCP/IP 对话。

向服务器发出请求的方法

GET:获取资源

GET 方法用来请求访问已被 URI 识别的资源。 指定的资源经服务器端解析后返回响应内容。 也就是说, 如果请求的资源是文本, 那就保持原样返回; 如果是像 CGI(Common Gateway Interface, 通用网关接口) 那样的程序, 则返回经过执行后的输出结果。

HEAD: 获得报文首部

HEAD 方法和 GET 方法一样, 只是不返回报文主体部分。 用于确认URI 的有效性及资源更新的日期时间等

POST: 传输实体主体

用于传输信息给服务器,用 GET 方法也可以传输实体的主体, 但一般不用 GET 方法进行传输, 目前几乎所有的提交操作都是靠 POST 完成。

简述HTTP中GET和POST的区别 —— 见笔记

PUT: 传输文件

PUT 方法用来传输文件给服务器。 就像 FTP 协议的文件上传一样, 要求在请求报文的主体中包含文件内容, 然后保存到请求 URI 指定的位置。鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制, 任何人都可以上传文件 , 存在安全性问题, 因此一般的 Web 网站不使用该方法。

DELETE: 删除文件

DELETE 方法请求删除服务器上的文件, 是与 PUT 相反的方法,无验证机制。 DELETE 方法按请求 URI 删除指定的资源。

CONNECT: 要求用隧道协议连接代理

CONNECT 方法要求在与代理服务器通信时建立隧道, 实现用隧道协议进行 TCP 通信。 主要使用 SSL(Secure Sockets Layer, 安全套接层) 和 TLS(Transport Layer Security, 传输层安全) 协议把通信内容加密后经网络隧道传输。    格式如下:CONNECT 代理服务器名:端口号 HTTP版本

HTTP 1.1 持久连接

  • HTTP 初始版本中,每进行一次通信就要建立和断开一次 TCP 连接,增加通信量的开销。HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
  • HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求(管线化,可同时并行发送多个请求),但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果。
  • 持久连接的特点是只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

使用 Cookies 的状态管理

  • 通过在请求和响应报文中写入 Cookies 信息来控制客户端的状态。
  • 首次发送请求时,Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息, 通知客户端保存 Cookie
  • 当下次客户端再往该服务器发送请求时, 客户端会自动在请求报文中加入 Cookie 值后发送出去,以实现被服务器识别。

三、HTTP 报文

HTTP 报文大致可分为 报文首部 和 报文主体(可选)两部分。有 请求 和 响应 报文两种。

  1. 请求行    包含用于请求的方法, 请求 URI 和 HTTP 版本。
  2. 状态行    包含表明响应结果的状态码, 原因短语和 HTTP 版本。
  3. 首部字段    包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部, 分别是: 通用首部、 请求首部、 响应首部和实体首部。
  4. 其他    可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等) 。

四、返回结果的 HTTP 状态码

表示客户端请求的返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。

状态码由以 3 位数字和原因短语组成。第一位 指定了 响应类别

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

常见状态代码、状态描述、说明:

  • 200 OK //客户端请求成功
  • 204 No Content //不返回任何实体的主体,即客户端不更新
  • 206 Partial Content //对部分请求的响应
  • 301 //永久重定向,请求的资源已被分配了新的 URI
  • 302 //临时重定向,已移动的资源对应的URI 将来还有可能发生改变
  • 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域(质询用户信息)一起使用
  • 403 Forbidden //服务器收到请求,但是拒绝提供服务,未获得文件系统的访问授权
  • 404 Not Found //请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error //服务器发生不可预期的错误,可能是Web应用存在的 bug 或某些临时的故障
  • 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常,表明服务器暂时处于超负载或正在进行停机维护

状态码和状况的不一致

不少返回的状态码响应都是错误的, 但是用户可能察觉不到这点。比如 Web 应用程序内部发生错误, 状态码依然返回 200 OK, 这种情况也经常遇到。

五、Web 服务器

一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。

虚拟服务器:可利用单台虚拟服务器实现多个域名。域名通过 DNS 服务映射到 IP 地址(域名解析) 之后访问目标网站。 可见, 当请求发送到服务器时, 已经是以 IP 地址形式访问了,所以当服务器收到请求时就需要弄清楚究竟要访问哪个域名(由请求报文首部可知)。

通信数据转发程序:

  • 代理:利用缓存技术 减少网络带宽的流量, 组织内部针对特定网站的访问控制
  • 网关:实现不同协议网络之间的通信,比如, 网关可以连接数据库, 使用SQL语句查询数据
  • 隧道:使用 SSL等加密手段,确保客户端能与服务器进行安全的通信

缓存:

  • 代理服务器客户端本地磁盘内保存的资源副本,利用缓存可减少对源服务器的访问, 因此也就节省了通信流量和通信时间
  • 有效期,因客户端的要求、 缓存的有效期等因素, 向源服务器确认资源的有效性。 若判断缓存失效, 缓存服务器将会再次从源服务器上获取“新”资源。

六、HTTP 首部

HTTP 请求报文:在请求中, HTTP 报文由方法、 URI、 HTTP 版本、 HTTP 首部字段等部分构成。

HTTP 响应报文:在响应中, HTTP 报文由 HTTP 版本、 状态码(数字和原因短语) 、HTTP 首部字段 3 部分构成。

HTTP 首部字段

HTTP 首部字段是由 首部字段名 和 字段值 构成的, 中间用冒号“:” 分隔。

  1. 通用首部字段(General Header Fields):缓存控制行为、创建报文时间、代理服务器 等
  2. 请求首部字段(Request Header Fields):  请求资源所在的服务器、客户端信息、 响应内容相关优先级 
  3. 响应首部字段(Response Header Fields):资源匹配信息、令客户端重定向信息、认证信息 等
  4. 实体首部字段(Entity Header Fields): 实体主体大小、资源内容更新时间与实体有关的信息。

HTTP/1.1 通用首部字段

  • Cache-Control:能够控制缓存的行为,例如:Cache-Control: private, max-age=0, no-cache。指令的参数是可选的, 多个指令之间通过“,”分隔。 首部字段 CacheControl 的指令可用于请求及响应时。
  • Connection:控制不再转发给代理的首部字段(代理将特定字段删除后再转发);管理持久连接(HTTP/1.1 版本的默认连接都是持久连接, 当服务器端想明确断开连接时, 则指定Connection 首部字段的值为 Close。)
  • Pragma: no-cache 只用在客户端发送的请求中,表示要求所有的中间服务器不接受返回缓存的资源。
  • Upgrade:用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信, 其参数值可以用来指定一个完全不同的通信协议。
  • Via :追踪客户端与服务器之间的请求和响应报文的经过代理或网关路径,不仅用于追踪报文的转发, 还可避免请求回环的发生。
  • Warning:告知用户一些与缓存相关的问题的警告。

请求首部字段

  • Accept:通知服务器, 用户代理能够处理的媒体类型(text / html 等)及媒体类型的相对优先级。
  • Authorization:用户代理的认证信息(证书值)。通常, 想要通过服务器认证的用户代理会在接收到返回的401 状态码响应后, 把首部字段 Authorization 加入请求中。
  • Host:虚拟主机运行在同一个 IP 上, 因此使用首部字段 Host 加以区分。
  • If-Modified-Since:在 If-Modified-Since 字段指定的日期时间后, 资源发生了更新, 服务器会接受请求,若没有更新,则返回304。
  • Max-Forwards:指定报文转发的最大跳数。

响应首部字段

  • Age:告知客户端, 源服务器在多久前创建了响应。 字段值的单位为秒。
  • ETag:告知客户端实体标识。 它是一种可将资源以字符串形式做唯一性标识的方式。
  • Location:将响应接收方引导至重定向的 URI 位置

实体首部字段

  • Allow:通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法
  • Expires:将资源失效的日期告知客户端,提醒缓存服务器更新
  • Last-Modified:资源最终修改的时间

为 Cookie 服务的首部字段

  • Set-Cookie:当服务器准备开始管理客户端的状态时, 会事先告知各种信息。
  • Cookie:告知服务器, 当客户端想获得 HTTP 状态管理支持时, 就会在请求中包含从服务器接收到的 Cookie。

七、HTTPS

HTTP 的缺点

  1. 通信使用明文(不加密) , 内容可能会被窃听
  2. 不验证通信方的身份, 因此有可能遭遇伪装
  3. 无法证明报文的完整性, 所以有可能已遭篡改

加密:

HTTP 协议中没有加密机制, 但可以通过和 SSL(Secure Socket Layer, 安全套接层)或 TLS(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。用 SSL建立安全通信线路之后, 就可以在这条线路上进行 HTTP通信了。 与 SSL组合使用的 HTTP 被称为HTTPS(HTTPSecure,超文本传输安全协议)。

防伪装:

SSL不仅提供加密处理, 而且还使用了一种被称为证书的手段,可用以证明服务器和客户端都是所期望的和实际存在的。

防篡改:

常用的是 MD5 和 SHA-1 等散列值校验的方法,以及用来确认文件的数字签名方法。
不论使用哪一种方法, 都需要操纵客户端的用户本人亲自检查验证下载的文件是否就是原来服务器上的文件。浏览器无法自动帮用户检查。

HTTP + 加密 + 认证 + 完整性保护 = HTTPS

HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用SSL(Secure Socket Layer) 和 TLS(Transport Layer Security) 协议代替而已。
通常, HTTP 直接和 TCP 通信。 当使用 SSL时, 则演变成先和 SSL通信, 再由 SSL和 TCP 通信了。

SSL采用一种叫做公开密钥加密(Public-key cryptography) 的加密处理方式

  • 每个用户都使用一对非对称的密钥。 一把叫做私有密钥(private key) , 另一把叫做公开密钥(public key) 。 顾名思义, 私有密钥不能让其他任何人知道, 而公开密钥则可以随意发布, 任何人都可以获得。
  • 送密文的一方使用对方的公开密钥进行加密处理, 对方收到被加密的信息后, 再使用自己的私有密钥进行解密。 利用这种方式, 不需要发送用来解密的私有密钥, 也不必担心密钥被攻击者窃听而盗走。
  • 要想根据密文和公开密钥, 恢复到信息原文是异常困难的, 因为解密过程就是在对离散对数进行求值, 这并非轻而易举
    就能办到。

八、其他

HTML

  • 超文本标记语言 是为了发送Web 上的超文本(Hypertext) 而开发的标记语言。
  • 超文本是一种文档系统, 可将文档中任意位置的信息与其他信息(文本或图片等) 建立关联, 即超链接文本
  • 标记语言是指通过在文档的某部分穿插特别的字符串标签, 用来修饰文档的语言。 我们把出现在 HTML文档内的这种特殊字符串叫做 HTML标签(Tag <>)。

动态 HTML

  • 动态 HTML技术是通过调用客户端脚本语言 JavaScript, 实现对HTML的 Web 页面的动态改造。 利用 DOM(Document Object Model, 文档对象模型) 可指定欲发生动态变化的 HTML元素。
  • DOM 是用以操作 HTML文档和 XML文档的 API(ApplicationProgramming Interface, 应用编程接口) 。 使用 DOM 可以将 HTML内的元素当作对象操作, 如取出元素内的字符串、 改变那个 CSS 的属性等, 使页面的设计发生改变。
  • 通过调用 JavaScript 等脚本语言对 DOM 的操作, 可以以更为简单的方式控制 HTML的改变。

Web 应用

  • 通过 Web 功能提供的应用程序,如购物网站、 网上银行、 SNS、 BBS、 搜索引擎和 e-learning 等
  • CGI(Common Gateway Interface, 通用网关接口) 是指 Web 服务器在接收到客户端发送过来的请求后转发给程序的一组机制。 在 CGI 的作用下, 程序会对请求内容做出相应的动作, 比如创建 HTML等动态内容。
  • 使用 CGI 的程序叫做 CGI 程序, 通常是用 Perl、 PHP、 Ruby 和 C 等编程语言编写而成。

XML

  • XML(eXtensible Markup Language, 可扩展标记语言) 是一种可按应用目标进行扩展的通用标记语言。 旨在通过使用 XML, 使互联网数据共享变得更容易。
  • 使用标签构成树形结构, 并且可自定义扩展标签。与 HTML相比, 它对数据的记录方式做了特殊处理,避免了 HTML 样式一旦改变,会造成读取困难的缺点。
  • 由于 XML的结构基本上都是用标签分割而成的树形结构,因此通过语法分析器(Parser) 的解析功能解析 XML结构并取出数据元素, 可更容易地对数据进行读取。
  • 更容易地复用数据使得 XML在互联网上被广泛接受。 比如, 可用在2 个不同的应用之间的交换数据格式化。
     

猜你喜欢

转载自blog.csdn.net/SimonxxSun/article/details/89973900