计算机网络知识之 HTTP 和 HTTPS
HTTP
概述
HTTP(HyperText Transfer Protocol)即超文本传输协议,一般情况下,由 HTTP 客户端发起一个请求,创建一个到服务器指定端口(默认是 80 端口)的 TCP 连接。HTTP 服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如 “HTTP/1.1 200 OK”,以及返回的内容,如请求的文件、错误消息、或者其它信息。HTTP 是万维网的数据通信的基础。
HTTP 协议是基于 TCP 协议位于应用层(五层结构)的通信协议,TCP是位于传输层提供面向连接的可靠的数据传输服务。与 HTTP 协议位于相同层级的还有 FTP、SMTP、TELNET 等协议。
七层结构中,应用层可再划分为
应用层、表示层、会话层
,HTTP协议位于表示层
因为 HTTP 是基于 TCP 协议之上的协议,因此它具有 TCP 的许多特性,例如面向连接、可靠等。
- 面向连接指的是程序在使用 TCP 协议前,需要先建立连接。
- 可靠性指的是,通过 TCP 协议传输的数据,具有无差错、不丢失、不重复、按序到达等特点。
握手过程
建立连接
HTTP 握手的过程实际上是建立 TCP 连接完成,开始传输数据的过程。TCP 连接的建立采用 C/S 结构。由客户端(client)发起,服务端(server)响应。
- 初始阶段 C 和 S 都处于
CLOSED
(关闭)状态; - S 的 TCP 服务器进程准备接收客户进程的 TCP 请求,此时 S 的状态是
LISTEN
(监听); - C 主动发起 TCP 连接请求,向 S 发送报文,此时 C 的状态是
SYN-SENT
(同步发送); - S 接收到 C 发起的请求后,如允许连接,向 C 发送确认报文,此时 S 的状态会变为
SYN-RCVD
(同步接收); - C 接收到 S 发送出的回调后,还需向 S 发送确认收到报文,此时 TCP 连接建立完成,C 的状态变为
ESTABLISHED
(已建立连接); - S 接收到 C 的确认收到信息后,状态也变为
ESTABLISHED
,整个握手过程结束,下一步进入数据传输过程。
以上过程是 三报文握手
关闭连接
与建立连接一样,关闭连接也是由 C 端主动发起的。
- C 和 S 都处于
ESTABLISHED
(已建立连接)状态; - C 向 S 发送连接释放报文段,并停止发送数据,此时 C 到 S 方向的 TCP 连接断开,进入
FIN-WAIT-1
(终止等待1)状态; - S 收到信号后立即发送确认,进入
CLOSE-WAIT
(关闭等待) 状态:此时的 TCP 连接处于半关闭状态,C 没有数据发送给 S,但能接收来自 S 的数据; - C 接收到 S 的确认后,进入
FIN-WAIT-2
(终止等待2)状态,等待 S 发出的连接释放报文段; - 如果 S 已经没有要向 C 发送的数据,此时 S 向 C 发送释放报文段,进入
LAST-ACK
(最后确认)状态; - C 收到 S 的最终确认后,还需要对此确认,发送报文后,进入
TIME-WAIT
(时间等待)状态; - S 接收到 C 的确认报文后,进入
CLOSE
状态; - C 在发送完确认报文后,需再经过时间等待计时器设置的 2MSL 时间才会进入
CLOSE
状态,为了保证在这个时间段内确认报文已到达 S 端,也
以上过程是 四报文握手
请求方法
HTTP/1.1协议中共定义了八种方法(Method)来以不同方式操作指定的资源,它们分别是 GET
HEAD
POST
PUT
DELETE
以及 TRACE
OPTIONS
CONNECT
,其中常用的方法是前五种。
GET
:用来读取数据;HEAD
:功能和GET
类似,不同之处在于使用HEAD
方法时,服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据);POST
:用来提交数据,请求服务器进行处理(例如提交表单或者上传文件)。这个请求可能会创建新的资源或修改现有资源,或二者皆有;PUT
:用来更新数据;DELETE
:用来删除资源或数据;TRACE
:回显服务器收到的请求,主要用于测试或诊断。OPTIONS
:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*‘来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。CONNECT
:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
状态码
状态代码的第一个数字代表当前响应的类型:
- 1xx消息:请求已被服务器接收,继续处理
- 2xx成功:请求已成功被服务器接收、理解、并接受
- 3xx重定向:需要后续操作才能完成这一请求
- 4xx请求错误:请求含有词法错误或者无法被执行
- 5xx服务器错误:服务器在处理某个正确请求时发生错误
持久链接
在HTTP 0.9和1.0中,TCP连线在每一次请求/回应对之后关闭。在HTTP 1.1中,引入了保持连线的机制,一个连接可以重复在多个请求/回应使用。持续连线的方式可以大大减少等待时间,因为在发出第一个请求后,双方不需要重新运行TCP握手程序。
下图展示了使用多个连接和使用持久链接的对比:
HTTPS
概念
HTTPS(HyperText Transfer Protocol Secure)即超文本传输安全协议,是一种通过计算机网络进行安全通信的传输协议。它的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。
简单的说,HTTPS 比 HTTP 多了一层 SSL/TLS 加密,传输的内容经过了对称加密,使之能比 HTTP 传输更加安全。
SSL/TLS 是应用层的安全协议,所有运行在应用层的传输协议都可以用它(们)来进行加密。
与HTTP的差异
- HTTP 的 UR L是由 http:// 起始与默认使用端口 80,而 HTTPS 的 URL 则是由 “https://” 起始与默认使用端口 443;
- HTTP 不是安全的,而且攻击者可以通过监听和中间人攻击等手段,获取网站帐户和敏感信息等。HTTPS 的设计可以防止前述攻击,在正确配置时是安全的。
SSL/TLS 建立安全会话的简要过程
假设客户端 A 要访问服务器 B 的资源:
- 协商加密算法:A 向 B 发送 SSL/TLS 版本号和一些可选的加密算法;B 收到后选择一种支持的算法(假设是
RSA
),并告知 A; - 服务器鉴别:B 向 A 发送包含其
RSA 公钥
的数字证书
,A 使用CA
公开发布的RSA
公钥对证书进行验证; - 会话密钥计算:由 A 生成随机数,使用 B 的
RSA 公钥
加密后发送给 B,双方根据协商的算法产生共享的对称会话密钥; - 安全数据传输:双方使用共享的对称会话密钥加密传输、解密读取数据,以及验证数据的完整性。
以上步骤2又称作数字签名,是非对称加密的反向使用,发送端使用自身私钥加密,接收端通过公钥解密后验证,用于接收端验证发送端是预想的发送端,避免访问到其他不安全的内容
整个过程用图示如下:
隐患
HTTPS 是安全的,但不是绝对安全的。在某些情形中,被加密资源的URL可仅通过截获请求和响应的大小推得,这就可使攻击者同时知道明文(公开的静态内容)和密文(被加密过的明文),从而使选择密文攻击成为可能。