zoukankan      html  css  js  c++  java
  • Https,Http,TCP,IP的一些理解

    网络模型分为7层,应用层,表现层,会话层,传输层,网络层,链路层,物理层,每一层有很多不同的协议。

    http:属于应用层的协议,负责的是数据以什么结构传输也可以说成是打包成什么样子

    SSL/TLS:属于应用程协议,同样是负责数据打包成什么样子(主要侧重于数据加密,TLS 算是SSL的后续版本所以通常放在一起说)

    tcp:属于传输层,负责的是传输的通道建立

    ip:并没有这么一个协议,通常说的ip说的是IPv4,IPv6,属于网络层,负责寻址

    https:并不是某个单独的协议,(全称Http on TLS)其实是2个协议的组合应用

    这里说到每一层其实都还有其他协议,例如传输层还有udp,应用层还有ssh等

    这里有一个概念需要了解,数据在网络上传输并不是直接到达接收方的。而是经过了很多次的跳转以后才能达到。这个过程叫做路由。

    这里由于这里经过了很多中间过程。就存在数据在某个中间过程点上被劫持。

    为了保证中间过程没有被劫持数据没有被篡改,就引入了互相验证的过程,通常采用双向不对称加密的方式来验证,算法通常为RSA。

    基于RSA这种加密算法发展出了,SSH,SSL/TLS这两种协议,SSH和SSL/TLS的协议验证的方式,个人认为的主要区别就是SSL/TLS更通用。因为他引入了CA这么个机构。

    具体的验证方式也就是比SSH多了最开始先验证“证书是否是CA颁发的合法证书”的这个流程。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    发送方任何一个请求从发出到接收方接收到,都是经历了网络的7层的流程。每一层都按照对应协议包装,当然最后都是通过物理层(网线,电缆,光纤)到达服务器。

    发送方打包:

    具体数据>应用层>表现层>会话层>传输层>网络层>链路层>物理层

    接收方解包:

    物理层>链路层>网络层>传输层>会话层>表现层>应用层>具体数据

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    TCP负责建立通道:

    这里所谓的建立通道指的是客户端和服务器已经做好了接受对方数据的准备,所以这里是一个所谓的概念上的通道(这里要明确,建立通道的数据传输依然是要经过上述的的7层包装传递的)。

    这段是从百度百科上的说明:

    应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( 1MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    我们通常说的http的3次握手,其实指的是tcp的3次握手。也就是这个过程基于tcp协议实现的。

    我们的http数据传送是基于通道建立已经成功的基础上。所以必须先通过一个握手的过程来建立通道。

    握手的过程(传输层按tcp协议打包):

    1.客户端发syn包:应用层向传输层发送数据流,这个数据流里面包含内容为:一个SYN标识和一个数字,

    2.接收方确认:接收方收到这个包解析以后看到SYN标识就知道了客户端是要建立连接。这时就会把客户端发过来的这个数字加1,然后带上一个自己的数字,发送返回包给客户端。

    3.客户端确认接收方并准备以及接收方确认客户端已准备:客户端收到返回的包以后看到自己发过去的数字已经被加了1,说明服务器以接到自己请求,这个时候把服务器发过来的数字也加1,发包给服务器并且自己做好准备。

    4.服务器看到自己返回的数字也加了1,说明客户端也已经准备好了,此时自己也做好准备。

    握手完成(这个过程发了3次包所以被称为3次握手)。

    这里服务器为什么不实在第2步就做好准备的原因是因为服务器资源有限。必须要客户端做好准备以后再准备,不然很有可能自己做好了准备,客户端那边没接到自己的响应导致没有做好准备

    挥手的过程(传输层按tcp协议打包):

    与握手过程相似只不过包内的标识为fin,并且服务器向客户端发送的时候ack和fin是分为开为2步发送(上面的百科说明tcp协议是支持数据打成多个包的)。至于为什么要分两步发,因为通道时双向通信的,很有可呢客户端提出关闭的时候服务器这边还有数据没发送完,所以先返回一个ack告诉客户端已经收到,数据发送完以后再告诉客户端已经发完了可以关闭了。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    通道建立以后。

    接下来传输数据。传数据的时候我们根据输入的url来分辨是用http还是用https。如果用的是https。 这个时候就牵涉到SSH,SSL/TLS了。

    在使用http协议组织数据之前。要先保证刚才建立的通道是否是安全的,一旦确定了通道安全,就可以开始传递加密的数据了,这时候再来劫持就已经晚了。劫持到也解密不出来。

    所以只要保证协商加密的这个步骤安全就行。所以这里就在传输数据之前协商加密的时候,加入了证书认证的这个过程。

    证书认证的底层逻辑就是双向不对称加密,公钥可以很多,私钥只有一个。私钥可以解密所有公钥加密的内容,所有公钥都可以解密私钥加密的内容。但是公钥之间不能互相解密。

    这里认证的这个行为就是公钥解密私钥的过程并比较解密以后是否正确的过程。正确则说明内容是由私钥加密的。

    这里具体的说一下:证书的内容包含如发布者名称之类的一些信息,加上一个用摘要算法(例如MD5)对这些内容算出来的摘要,然后用私钥对这个摘要加密生成的结果,这个结果就是签名。

    完整的证书验证行为就是先用公钥对这个签名解密,然后对证书上公开的其余信息同样用摘要算法(MD5)算摘要。如果算出来的摘要和公钥解密之后的摘要相同则说明是正确的。

    这也就是SSH的过程,然后中间再加上了CA签名的话就是SSL/TLS了。

    这里CA又牵涉到一个分级的问题。这里就要牵涉到一个证书链。因为CA是分级的。CA机构有很多,但是最顶层的CA只有固定的几个。通常证书都是由下级的CA颁发的。而下级CA颁发的证书里面其实是包含上一级CA的信息的。最低级的CA颁发的证书解开以后会包含上一级CA的信息,这里又可以继续解析上一层CA的信息。解析过程相同(公钥解密,确认摘要),然后一直解析到最顶层。也就是说客户端这边要保存每一级的CA的公钥以及最终的顶级CA的公钥。否则任何一级验证失败了就解析不下去了。只有当解析到最后才能确定这个证书确实是顶顶级CA颁发的。当这些步骤完成了以后,才轮到解析服务器的签名。

    (顶级CA的证书被称为Root Certificate,下级CA的证书被称为InterMediate Certificate,最终用户的被称为End User Certificate)

    所以SSL/TLS是先解析CA的证书(通过证书链),CA的验证通过。 在进行服务器本身的验证。所以SSH,SSL/TLS其实原理是一样的。

    这里除了验证的过程。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    在证书传递的过程里面其实还有协商加密方式,协商压缩方式,以及协商密钥,这个密钥是真正数据发送时使用对称加密的密钥。

    这个完整的过程叫做TLS握手,具体流程是

    客户端发送请求包里面含有支持的 SessionId(如果有),SSL/TLS版本,压缩方式,加密组件。以及一个随机数字A。

    服务器挑选一种压缩方式,加密套件,附带上证书并且也产生一个随机数字以后发送返回包给客户端,这里产生的这个随机数为B。

    客户端验证证书,验证通过以后,根据前面传输的所有内容,产生第三个数字PreMaster,然后用A,B,PreMaster三个参数算出数据传输对称加密的密钥trasnKey。然后发包给服务器告诉服务器这边验证好了,我们的通道是安全的,可以开始数据传输了。服务器这个时候根据之前传输的内容也可以算出同样的trasnKey,然后双方就可以开始以trasnKey互相传输数据。

    TLS握手完成。

    在然后就是http 的传输了。

    一篇解释https很好的文章

     https://blog.csdn.net/ly131420/article/details/38400583

  • 相关阅读:
    Session机制详解
    JDK各个版本比较 JDK5~JDK9
    CAS 自旋锁
    OAuth2.0认证和授权原理
    微信二维码登录原理
    Django Restframework 实践(一)
    ESXI 5.5卡在LSI_MR3.V00
    理解RESTful架构
    RESTful API 设计指南
    python 异步 select pooll epoll
  • 原文地址:https://www.cnblogs.com/fengxiaoling/p/9963173.html
Copyright © 2011-2022 走看看