您的位置:首页 > 理论基础 > 计算机网络

计算机网络:HTTP相关知识

2018-11-30 01:00 288 查看

http

  • https通信流程
  • 参考资料
  • 我是一个菜鸟,有讲的不对的地方还望各位指出。Thanks~
  • http请求过程分析

    当在浏览器上输入一个url,比如www.zzccjj.com,大致会经历以下过程。

    1. DNS域名解析

    我们知道http底层的传输层使用的是TCP协议,网络层是使用的IP协议,因此,http报文发送的目的地,应该是由IP地址+端口号确定的。而上述输入网址,并不是IP地址+端口号的形式,上述的网址,被称为域名
    需要将域名解析成为IP地址形式,才可以正确方法请求。
    DNS域名解析步骤如下:

    1. 检查浏览器缓存中有无该域名对应的IP地址,如果有,解析过程结束。
    2. 如果浏览器中没有对应的缓存,那么浏览器会查找操作系统缓存中是否有该域名的解析结果。如果有,解析过程结束。
      ps:操作系统也会有一个域名解析的过程,Windows系统中可以通过C:\Windows\System32\drives\etc\hosts文件来设置。
    3. 前两个步骤都是在本机完成的,如果本机未找到对应的IP地址,那么操作系统会把域名发送给设置的LDNS(本地区的域名服务器),这是专用于域名解析的服务器,性能很好,如果你连接的是学校的网,那么这个LDNS肯定是在学校里,如果你在一个小区里联网,那么你的LDNS应该是由运营商提供(比如电信、联通…)。
      ps:如果是windos系统,可以在cmd里输入ipconfig /all查看DNS Servers信息。
      大部分情况下LDNS里会存着你所需要的域名解析信息,如果查询到相应信息,将信息发送给你的电脑,解析结束。
    4. 如果LDNS中也没查询到信息,那么LDNS会向Root DNS Server请求帮助解析域名,Root DNS Server的数量在全球范围内是非常少的,保存这绝大部分的域名信息。
    5. Root DNS Server会返回给LDNS一个所查询域的主域名服务器(gTLD)地址,告诉LDNS,你想要的域名信息在这台gTLD里面有,你去找它要去。
    6. LDNS向相应的gTLD发送域名解析请求。
    7. gTLD会返回给LDNS它所查询的域名所对应的Name Server域名服务器,那个Name Server通常就是该域名注册时的服务器。
    8. Namer Server向LDNS返回域名所对应的IP信息,并返回一个TTL(缓存时间由TTL控制)。
    9. LDNS会根据TTL对该域名解析的信息进行缓存。
    10. 把解析结果返回给用户,用户也根据TTL对该域名进行缓存。
      如下图所示

      有同学可能会问这里只获取到了IP地址,并没有获取到端口号:
      默认情况下,http请求的端口号是80。
    1. 发送端应用层

    按照http协议,生成相应的http请求报文。
    请求报文格式如下:
    [method] [request-url] [version] (request line)
    [header 1]:[value 1]
    [header 2]: [value 2]

    [header n]:[value n]
    [black line]
    [entity body](GET请求方法时为空,如POST一些表单信息,那么表单信息就放在这个位置)

    1. 发送端传输层

    按照TCP协议,生成TCP报文,传递给网络层

    TCP数据包中的数据包含着http报文

    1. 发送端网络层

    使用IP协议,生成IP报文,使用IP地址指定目的主机位置,传递给数据链路层。

    1. 数据链路层

    IP地址会指示数据要到达的最终目的地,但不会指定具体的路径。
    具体的路径使用Mac地址指示,Mac地址是物理地址,每一个网卡都会有专属于自己的一个Mac地址,在数据链路层的数据包中,每次都会有下一步需要到达的Mac地址,直到找到对应的主机后结束。

    1. 接收端网络层

    从数据链路层中将IP数据包解析出来。

    1. 接收端传输层

    从IP数据包中把TCP数据包解析出来,并且按照TCP数据首部的序列号将数据进行重组,保证数据的顺序。

    1. 接收端应用层

    从TCP数据包中将http报文解析出来,对http请求进行回应。
    响应报文格式如下:
    [ version ] [ state code ] [ state discript ] (状态行)
    [ header 1 ] :[ value 1 ]
    [ header 2 ] :[ value 2 ]

    [ header n ]:[ value n ]
    [ black line ]
    [ entity body ]

    流程图如下

    http状态码

    类别 原因短语
    1XX Information(信息状态码) 接受的请求正在处理
    2XX Success(成功状态码) 请求正常处理完毕
    3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
    4XX Client Error(客户端错误状态码) 服务器无法处理请求
    5XX Server Error(服务器错误状态码) 服务器处理请求出错

    200 OK
    请求被正常处理了

    204 No Content
    请求成功处理,但返回的相应报文中不含实体部分。

    206 Partial Content
    客户端进行了范围性请求。相应报文中使用Content-Range指定范围的实体内容太。

    301 Moved Permanently
    永久性重定向。资源被永久性的移动,浏览器会自动定向到新的URI。今后任何新的请求都应使用新的URI代替。
    302 Found
    临时性重定向。客户端访问应接着使用原来的URI。
    303 See Other
    与302类似,但明确表示客户端应该使用GET方式获取资源。

    400 Bad Request
    请求报文中有语法错误。
    401 Unauthorized
    未认证成功。比如服务器使用了token方式验证客户身份,而客户身份不对时会报出这个错误。
    403 Fobidden
    服务器拒绝了这次请求。
    404 Not Found
    无法找到请求的资源。

    500 Internal Server Error
    服务器端处理请求时发生了错误。可能是web应用存在bug。
    503 Service Unavailable
    表示服务器现在无法处理请求,可能处于超负载或正在停机维护。

    HTTPs

    http的缺点:
    1.使用明文的方式进行通信,数据可能会被窃取。
    2.不验证通信方的身份,因此可能遭遇伪装。
    于是,将http与SSL协议相结合,出现了https协议,可以安全的在网络上传输数据。

    https的加密方式

    https使用对称性加密和非对称性加密的方式结合的方式来保证数据传输的安全性。

    非对称加密

    首先来理解一下什么是非对称加密。
    现在,假设有A、B两个终端,A、B两终端可以通过网络进行交流。
    A和B都有一把属于自己的锁和解锁的钥匙,分别叫做锁A、钥匙A和锁B、钥匙B。锁A只能用钥匙A解锁,锁B只能用钥匙B解锁。
    现在两方开始进行非对称加密通信,B要从A端获取一个Data。

    1. 首先A端使用锁A将Data进行加锁,得到一个加上锁A后的Data,我们把它称作DataA。
    2. A端将DataA通过网络传输到B端。由于锁A只能用钥匙A解锁,因此Data不会被网络上的它方盗取。
    3. B端收到DataA后,由于没有钥匙A,也解不开锁A,于是B端对DataA用锁B进行加锁,得到DataAB。
    4. B端将DataAB通过网络传输给A端,同样,网络上的第三方也窃取不到Data。
    5. A端收到DataAB后,用钥匙A对DataAB进行解锁,于是DataAB上的锁被消除,变成了DataB。
    6. A端将DataB通过网络传输给B端,Data上还留着B锁,不会被他人窃取。
    7. B端收到DataB后,使用B钥匙进行解密,于是就可以得到Data了。非对称加密的一次通信就此结束。

    对称加密

    接下来,看看什么是对称性加密。对称加密指的是加密和解密使用相同密钥。
    对称性加密会比非对称加密简单很多,A端和B端都有着两把锁,分别是锁A和锁B,而且A端已经有了锁B的钥匙——钥匙B,B端也有了锁A的钥匙——钥匙A。
    还是以B要从A端获取一个Data为例。

    1. 首先A端对Data加上锁A,得到DataA。
    2. 将A端通过网络将DataA发送给B端。
    3. B端收到DataA后,使用钥匙A对它进行解锁,获取到Data,传输完毕。
      从B端发送数据到A端也是用同样的方法。

    https通信流程

    通过对比,可以很明显看出使用非对称加密需要很多步骤,多步骤就意味着需要消耗更多的时间。因此使用对称性加密进行通信效率会高很多。
    但是出现了一个问题,网络中的两端如何才能拥有对端对数据进行加锁后的解锁钥匙呢?
    这就是为什么https要使用非对称加密和对称加密相结合的原因。
    https流程图如下所示(图片来源

    1. 首先客户端会向服务器发送一个类似hello的打招呼请求,服务器接收到该请求后,会“礼貌”地回应一下客户端hello,把服务器公钥传输给客户端(公钥的意思是可以放到网络上,让所有人都看到的意思,而私钥只能自己拥有。这里,服务器公钥就相当于非对称加密中的锁A),并且把自己的服务器证书也传输给客户端。这个证书是CA证书,是一个全球认可的第三方机构,用户可以向这个机构申请CA证书,表示我(用户服务器)是一个值的信赖的服务器,你(客户端)可以安安心心的跟我进行https交流。CA证书会被保存在浏览器中。
    2. 浏览器查自己的CA证书表,判断该服务器是否是一个可靠的服务器。
    3. 在确认服务器可靠后,客户端生成自己的公钥(也就是非对称加密中的锁B),当然客户端肯定知道这个公钥的解锁方法(也就是拥有钥匙B)。然后还会生成一个客户端会话密钥(相当于对称加密中的钥匙B`)。
    4. 使用服务器的公钥(锁A)将客户端公钥(锁B)以及客户端会话密钥(钥匙B`)进行加锁,发送给服务器。
    5. 服务器接收到该数据后,用服务器私钥(钥匙A)进行解密操作,能够得到客户端公钥(锁B)和客户端会话密钥(钥匙B`)。服务器会将客户端会话密钥保存下来。然后会生成自己的服务器会话密钥(对称加密中的钥匙A`)。
    6. 服务器使用客户端公钥(锁B)对服务器会话密钥(钥匙A`)进行加锁,通过网络发送给客户端。
    7. 客户端接受到该数据后,使用客户端私钥(钥匙B)进行解锁,可以获得服务器会话密钥(钥匙A`),并保存下来。
    8. 此后,两端都拥有了对方对称加密方法中的钥匙,可以使用对称加密方法进行通信。
    9. 客户端向服务器传输数据时,会使用客户端会话密钥对内容进行加锁,而服务器已经拥有客户端会话密钥,因此可以成功解锁,获得数据。
    10. 服务器向客户端传输数据,会使用服务器会话密钥对内容进行加锁,同样的客户端也拥有服务器会话密钥,因此也可以成功解锁,获得数据。

    参考资料

    图解HTTP
    https://www.geek-share.com/detail/2658037943.html

    我是一个菜鸟,有讲的不对的地方还望各位指出。Thanks~

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: