返回

应用层协议——HTTP

HTTP协议概述

概况

Web的应用层协议是超文本传输协议(HTTP)。HTTP协议由两个程序实现:一个客户程序和一个服务器程序,通过交换HTTP报文进行会话。

HTTP定义了Web页面的方式,以及服务器向客户传送Web页面的方式。并 使用TCP作为它的支撑运输协议 。HTTP客户首先发起一个与服务器的TCP链接。连接建立,彼此之间就可以通过 套接字接口 访问TCP。从而利用套接字接口接受和发送HTTP报文。通信过程如下图所示

由于TCP为HTTP提供可靠数据传输服务,因此每个报文都能完整地到达服务器或客户,HTTP协议不关心TCP从网络种如何处理报文的各种问题,也不用担心数据丢失。但又由于服务器只为客户服务,并不存储任何关于客户的状态信息,因此HTTP协议是一个 无状态协议 ,如果需要保存客户的登录信息,则 需要引入相关技术来记录状态,如Cookie

持续和非持续连接

在实际情况中,客户可能会发出一系列请求并且服务器会对每个请求进行响应。而这种客户-服务器的交互是经过TCP进行的,因此这些请求是经过单独的TCP连接还是经过相同的TCP连接就是这种交互方式的关键问题。也因此诞生了持续和非持续的HTTP连接。

非持续连接: 使用非持续连接,每个TCP连接在服务器 发送一个对象后就关闭 (对象即HTML文件以及网页图像等),每个TCP连接只传输一个请求报文和一个响应报文。

非持续连接有以下缺点:

  • 必须为每个请求的对象建立和维护一个全新的连接。对于这样的连接要分配TCP缓冲区和保持TCP变量。造成服务器负担。
  • 每个对象经受两倍的RTT交付时间,即一个RTT用于创建,一个RTT用于请求和接受.

持续连接: 服务器在发送响应后保持该TCP连接打开。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送,而如果一条连接经过一定时间间隔(配置好的超时间隔)仍未被使用,HTTP服务器就应该关闭这个连接。

HTTP连接流程

(1)、 客户端连接到Web服务器。 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80端口),建立一个TCP套接字连接。

(2)、 发送HTTP请求。 通过TCP套接字,客户端向HTTP服务器发送一个文本的请求报文。

(3)、 服务器接受请求并返回HTTP响应。 Web服务器解析请求,定位请求资源。服务器将资源副本写到TCP套接字,由客户端读取。

(4)、 释放TCP连接。 若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭TCP连接并释放。反之若为keepalive,则TCP连接会保持一段时间,在这段时间内可以继续接受请求和响应。

(5)、 客户端浏览器解析HTML内容。 客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取相应的HTML,根据HTML语法对其进行格式化,并在浏览器窗口显示。

HTTP报文

HTTP请求报文

请求报文格式如下图。其中第一行称为 请求行 ,其后继的行称为 首部行

请求行有三个字段:方法字段、URL字段和HTTP版本字段。方法字段可以区包括GET、POST、HEAD、PUT和DELETE。这些请求方法将会在下文讲述。

首部行则会包含Host字段,Connection字段以及User-agent字段等。分别指明了对象所在的主机、是否使用持续连接以及用户代理(发送请求的浏览器类型)。其中Host首部行则是Web代理高速缓存所要求的。

HTTP响应报文

响应报文的格式如下图。分为 状态行首部行 以及 实体体 三个部分。实体体为报文的主要部分,为所请求的对象本身。同样在首部行会包含一些字段。例如:Date:指示发送该报文的日期和时间;Server:指示发送的服务器;Last-Modified:最后修改的日期和时间等。

HTTP状态码

由上述HTTP响应报文可以得出,在状态行中包含状态码字段,这个字段将指示请求的结果。可以将状态码分为以下几类:

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

常见的状态码如下:

  • 200 OK:请求成功,信息在返回的响应报文中。
  • 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL
  • 400 Bad Request:一个通用的差错代码,指示该请求不能被服务器理解。
  • 404 Not Found:被请求的文档不在服务器上。
  • 505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。

更多的状态码及其对应短语可以参考此网址

HTTP请求方法

HTTP1.0定义了三种请求方法:GET、POST和HEAD。

HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法

每种方法的特点如下:

  • GET。 请求指定的页面信息,并返回实体主体。
  • HEAD。 类似于GET请求,只不过返回的响应中没有主体内容,用于获取报头。
  • POST。 向指定资源提交提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT。 从客户端向服务器传送的数据取代指定的文档的内容。
  • DELETE。 请求服务器删除指定的页面。
  • CONNECT。 HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
  • OPTIONS。 允许客户端查看服务器的性能。
  • TRACE。 回显服务器收到的请求,主要用于测试或诊断。

GET和POST请求的区别

(1)、 GET提交: 请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。 POST提交: 把提交的数据放置在是HTTP包的包体中。

也即 GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

(2)、传输数据的大小:首先 HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制

而在实际的开发中:

GET: 特定浏览器和服务器对URL长度有限制,例如:IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。因此对于GET提交时,传输数据就会受到URL长度的限制。

POST: 由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对POST提交数据大小进行限制,Apache、IIS6都有各自的配置。

(3)、安全性

POST的安全性要比GET的安全性高。比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为登录页面有可能被浏览器缓存;其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击

HTTPS

HTTP的不足

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

HTTPS介绍

HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer, 安全套接层 )或TLS(Transport Layer Security, 安全传输协议 )的组合使用,加密HTTP通信内容。属于通信加密,即在整个通信线路中加密。如图

HTTPS采用 共享密钥加密(对称)公开密钥加密(非对称) 两者并用的混合加密机制,若密钥能够实现安全交换,那么有可能仅考虑使用公开密钥来加密通信。但是公开密钥加密相对于共享密钥加密处理速度较慢。因此可以在交换密钥阶段使用 公开密钥 加密方式,之后建立通信交换报文阶段则使用 共享密钥 加密方式。

HTTPS握手流程简单描述如下:

(1)、浏览器将自己支持的一套加密规则发送给网站 (服务器获得浏览器公钥)

(2)、网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥等信息 (浏览器获得服务器公钥)

(3)、获得网站证书后浏览器需要进行以下操作

(a)、验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

(b)、如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码(接下来通信的密钥),并用证书中提供的公钥加密(共享密钥加密)。

(c)、使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。

(4)、网站接受浏览器发来的数据之后要做以下的操作:

(a)、使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。

(b)、使用密码加密一段握手消息,发送给浏览器。

你要相信流星划过会带给我们幸运,就像现实告诉你我要心存感激
Built with Hugo
Theme Stack designed by Jimmy