HTTP协议简介

前言:

现有web请求中大都基于HTTP协议。了解HTTP协议需要具备计算机网络基础知识,笔者参考网上评价最高的《图解HTTP》这本书对HTTP协议进行系统的学习。主要介绍HTTP协议、状态码、代理、网络安全HTTPS。

计算机基础

  1. 网络分层主要分为三种:
  • tcp/ip四层
  • 五层协议
  • OSI七层

其中常用的时tcp/ip四层分层的方式,其他两种用的比较少。三种分层方法如下图1所示:

图1 网络的三种分层方式

网络互联时需要一些中间设备包括网关、路由器、网桥、转发器等,各个中间设备与各个层次之间的对应关系如下图2(参考《计算机网络(谢希仁)P115》)所示:

图2 中间设备

  1. TCP与UDP

传输层最主要的两个协议TCP与UDP,这里不做展开。首先介绍着两个协议包含的应用层协议簇:

TCP: HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传送协议)、TELENT(远程终端协议)等

UDP: DNS、TFTP、RIP、DHCP、SNMP、NFS、IGMP等。

  1. HTTP协议数据传输过程

HTTP是基于TCP/IP协议的,虽然TCP是面向连接的可靠地传输层协议, 但是HTTP协议本身是无状态,且无连接的(HTTP交换报文之前不需要先建立HTTP连接)。数据在各个层次之间传输时,发送端每经过一层都需要进行封装,添加相应的首部。原始HTTP报文经过传输层添加TCP报文首部,经过网络层添加IP首部经过链路层时添加以太网首部。反之接收端在解析报文时,首先从链路层取出包含以太网首部的帧数据,然后经过网络层去掉以太网首部,经过传输层去掉IP首部,到应用层去掉TCP首部最后只留下HTTP报文。如图3 所示:

图3 HTTP协议通讯

实例分析:在浏览器中请求一个网页,利用wireshark抓包软件对HTTP报文进行抓包分析。抓包结果如图4所示,可以看到有两个HTTP协议的连接,查看source、destination可发现这是一次客户端到服务器的请求以及服务器到客户端的一次响应。

图4 wireshark抓包结果

点看其中一个HTTP请求,链路层每一帧的数据结构如图5所示,从左到右从上到下分别是以太网(Ethernet II)头部、IP头部、TCP头部、HTTP报文。

图 5 HTTP请求报文结构

  1. IP、TCP、DNS与HTTP
  • IP协议中比较重要的ARP(Address Resoletion Protocol)协议,负责解析IP地址与机器MAC地址之间的关系。链路层只认MAC地址,网络层ARP协议中,规定了IP地址与MAC之间的映射关系,由于每台机器的MAC地址是唯一的,通过IP地址可以找到对应MAC地址的机器。

TCP协议通过三次握手建立端到端的连接,并将大数据分割成一个个数据包进行传输。

DNS域名系统负责IP地址与域名之间的解析。机器与机器之间交流时可以互相识别IP地址,但这对于人来说很不友好,比如访问百度时直接输入:www.baidu.com ,而不是www.IPXXXX.com 。 为方便人对各个地址的访问,DNS建立了IP与域名之间的映射关系。这样就可以方便的访问你想要浏览的网站。

浏览某个网页的网站时,首先通过DNS服务器获取网站域名对应的IP地址;然后通过HTTP协议生成相对应的HTTP报文;经过传输层封装成TCP报文并将大数据报文切割成报文段,通过三次握手建立客户端到服务器的连接;在网络层通过IP协议簇找到IP地址对应的MAC地址,通过路由器找到最终的服务器MAC地址。至此点击某个浏览器所产生的HTTP请求报文已被封装成帧的形式从客户端发送到服务器端。服务器端从链路层到应用层逐渐解析拆分,将帧转换成HTTP报文,请求成功。

HTTP状态码

  • 2XX 正常处理完毕
    • 200 ok
    • 204 no content
    • 206 partial content
  • 3XX 重定向
    • 301 moved permanent
    • 302 fond 资源暂时移走,临时重定向
    • 303 see other 资源暂时移走,临时重定向 以GET方法请求
    • 304 not modified 资源找到,但不符合条件请求
    • 307 temporary redirect 临时重定向
  • 4XX 客户端错误

    • 401 unauthorized 未授权
    • 403 forbidden 禁止访问
    • 404 not found 服务器没有请求的资源
    • 405 请求方式不正确
  • 5XX 服务器错误
    • 500 internal error 内部资源错误
    • 503 service unavailable 服务器超载或者停机维护

代理proxy

所谓代理人,就是将将某件事情托付给某人,让此人代理你干某件事。在客户端访问服务端时有两种代理模式:正向代理、反向代理。如图6 所示,Proxy1是正向代理服务器,Proxy2是反向代理服务器。

  • 正向代理:有一台代理服务器代理客户端去请求服务端,对于服务端而言客户端不可见。
  • 反向代理:代理服务器位于服务端,对于客户端而言服务端不可见。

1557646200768

图 6 正向代理与反向代理

举个生活中的例子,买菜场景,三个对象:消费者(客户端)、菜场小贩(代理)、蔬菜大棚(服务器)。

买菜时,消费者只知道菜场小贩(代理服务器),但不知道是哪个蔬菜大棚(服务端)生产的菜。此时消费者是客户端,蔬菜大棚是服务端。对于消费者(客户端)来说蔬菜大棚(服务端)不可见。菜场小贩是反向代理服务器

当菜场小贩去大棚进菜时,蔬菜大棚并不清楚具体是哪个消费者要吃哪个菜,将菜直接批发给小贩。此时对于蔬菜大棚(服务端)来说,消费者(客户端)不可见,菜场小贩是正向代理服务器

网络安全

HTTP协议简单无状态、无连接,但是简单随之而来的是安全问题。HTTP协议面临的安全问题主要包含三类:

  • 通信采用明文,通信内容可能被截取。
  • 可能遭遇伪装,无法验证通信双方的身份
  • 通信内容遭到篡改导致内容不完整

针对以上问题在HTTP基础之上,诞生出HTTPS协议。即HTTPS = HTTP + 加密 + 认证 + 完整性保护。在TCP与HTTP 之间添加一层SSL协议,TCP首先与SSL协议通讯,之后SSL协议再和HTTP通信。

  1. 首先大家想第一个问题,如何给通信内容加密?

你可能会说利用密钥给通讯内容上锁,双方同时保存密钥。这就是加密方法之一的对称加密算法,双方持有相同的密钥,并且对通讯内容进行加密解密时用同一把密钥。这种方式最大的缺点在于,任何人只要能获取密钥,就可以对通讯内容进行解密。使用对称加密的方式难点在于如何把密钥共享给双方而不被其他人窃取到?

此时密码学中另外一种加密方式派上用场:非对称加密算法。即有一对密钥,一个公钥,一个私钥。利用公钥对明文加密,利用私钥对密文解密。如果没有私钥,暴力很难解开密文。我们可以粗略认为:公钥加密过的密文只有与其配对的私钥才能解开。此时我们可以采取这种方式,服务端将公钥发送给任意客户端,客户端拿到公钥后,对请求的内容做加密处理,只有持有私钥的服务端才能解开密文,因此可解决对称加密方式中的密钥共享问题。

但是非对称加密方式也不是绝对可靠的,如果有人伪装成服务端,将一个假的公钥发送给客户端,客户端无法确认对方身份,将内容按照假公钥进行加密,此时内容就会被别人破解。

  1. 所以第二个问题,如何证明公钥与发送公钥机构是配对的?

此时证书认证的作用就来了。证书一般由一个可信赖的机构颁发,确认某个公钥与某个机构的对应关系。就像工商局办法的营业执照一样,A饭店的营业执照就是A,别人在网上能查到真伪,拥有B执照的饭店无法伪装成A饭店。拥有证书的服务端在发布自己的公钥时,会将自己的公钥与数字认证的证书编号一起发送出去,客户端收到公钥与证书编号后会确认证书的真伪,从而判断公钥的有效性。

  1. 最后一步验证报文的完成性,常用的由MD5散列值校验法、确认文件的数字签名方法。

HTTPS采用的是混合加密制,虽然非对称加密方式解决了对称加密方式共享密钥的困境,但是其处理速度较慢,如果每次通信都采用非对称加密速度会很慢。故HTTPS采用以下方式:

  • 利用非对称加密方式将对称加密的密钥进行加密传输

  • 获取对称加密的密钥后,双方采用对称加密方式进行加密传输

参考

《图解HTTP》

《计算机网络通讯协议》