zoukankan      html  css  js  c++  java
  • 计算机网络

    1:三次握手

    第一次:主机向客户机发送一个包syn=1(建立连接),seq(x是一个随机值),客户机收到后,知道syn=1,主机希望建立连接

    第二次:客户机向主机发送一个返回包,syn=1(建立连接),ack=1(确认),ack number=seq+1(确认值),seq(y主机产生的随机值)

    第三次:主机收到后先确认ack number是否正确,返回发送ACK=1,ack number=y+1,seq=x+1

     为什么一定要三次,不是两次四次

    这种情况是:一端(client)A发出去的第一个连接请求报文并没有丢失,而是因为某些未知的原因在某个网络节点上发生滞留,导致延迟到连接释放以后的某个时间才到达另一端(server)B。本来这是一个早已失效的报文段,但是B收到此失效的报文之后,会误认为是A再次发出的一个新的连接请求,于是B端就向A又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要B端发出确认报文就会认为新的连接已经建立了,但是A端并没有发出建立连接的请求,因此不会去向B端发送数据,B端没有收到数据就会一直等待,这样B端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,B端收到一个过时失效的报文段之后,向A端发出确认,此时A并没有要求建立连接,所以就不会向B端发送确认,这个时候B端也能够知道连接没有建立。
    - 问题的本质是,信道是不可靠的,但是我们要建立可靠的连接发送可靠的数据,也就是数据传输是需要可靠的。在这个时候三次握手是一个理论上的最小值,并不是说是tcp协议要求的,而是为了满足在不可靠的信道上传输可靠的数据所要求的。
    - 我们再来考虑,如果不是三次握手会出现什么情况呢:
    假设有A和B两端要进行通信,
    - 第一次:首先A发送一个(SYN)到B,意思是A要和B建立连接进行通信;
    如果是只有一次握手的话,这样肯定是不行的,A压根都不知道B是不是收到了这个请求。
    - 第二次:B收到A要建立连接的请求之后,发送一个确认(SYN+ACK)给A,意思是收到A的消息了,B这里也是通的,表示可以建立连接;
    如果只有两次通信的话,这时候B不确定A是否收到了确认消息,有可能这个确认消息由于某些原因丢了。
    - 第三次:A如果收到了B的确认消息之后,再发出一个确认(ACK)消息,意思是告诉B,这边是通的,然后A和B就可以建立连接相互通信了;
    这个时候经过了三次握手,A和B双方确认了两边都是通的,可以相互通信了,已经可以建立一个可靠的连接,并且可以相互发送数据。
    - 第四次:这个时候已经不需要B再发送一个确认消息了,两边已经通过前三次建立了一个可靠的连接,如果再发送第四次确认消息的话,就浪费资源了。
    如果第二个报文段B发出的(SYN+ACK)分别发送的话,也是可以理解为四次,但是被优化了,一起发送了。

    超时重传机制

    1. 如果第一个包,A发送给B请求建立连接的报文(SYN)如果丢掉了,A会周期性的超时重传,直到B发出确认(SYN+ACK);
    2. 如果第二个包,B发送给A的确认报文(SYN+ACK)如果丢掉了,B会周期性的超时重传,直到A发出确认(ACK);
    3. 如果第三个包,A发送给B的确认报文(ACK)如果丢掉了,
      1. A在发送完确认报文之后,单方面会进入ESTABLISHED的状态,B还是SYN_RCVD状态
      2. 如果此时双方都没有数据需要发送,B会周期性的超时发送(SYN+ACK),直到收到A的确认报文(ACK),此时B也进入ESTABLISHED状态,双方可以发送数据;
      3. 如果A有数据发送,A发送的是(ACK+DATA),B会在收到这个数据包的时候自动切换到ESTABLISHED状态,并接受数据(DATA);
      4. 如果这个时候B要发送数据,B是发送不了数据的,会周期性的超时重传(SYN+ACK)直到收到A的确认(ACK)B才能发送数据。

    三次握手牵扯到的状态转换

      • LISTEN 表示socket已经处于listen状态了,可以建立连接;
      • SYN_SENT 表示socket在发出connect连接的时候,会首先发送SYN报文,然后等待另一端发送的确认报文(ACK),表示这端已经发送完SYN报文了;
      • SYN_RCVD 表示一端已经接收到SYN报文了;
      • ESTABLISHED 表示已经建立连接了,可以发送数据了。

    2:四次释放

     TIME-WAIT 

    2倍最长报文寿命,保证关闭确认信息被收到,如果B没有收到,会重发关闭信息

    接收方被动关闭,需要发送确认信息后会继续传送未传送完的信息,在发送一个确认关闭的消息

    3:滑动窗口

    滑动窗口按字节滑动,收到前方字节数的确认消息后,就向后滑动指定字节数,如果中间某段丢失,返回起点终点进行重传

    4:SSL层加密

     

     tip:数字证书中存放着非对称加密算法的公钥

    第一步:A产生一个随机数1,协议版本,加密算法给B

    第二步:B确认信息后,返回自己的数字证书,以及B随机生成的一个B

    第三步:A确认数字证书是否有效,并从中取出公钥,使用公钥加密3,并发送给B(注意,3虽然在网上进行了传播,但是没有密钥并不能解密,所以只有B知道)

    第四步:B收到3后,对3使用私钥进行解密。

    此时

    A有随机数1(A产生),2(B产生并发送),3(A产生)

    B有随机数1(A产生并发送),2(B产生),3(A产生加密并发送,B解密后获得)

    双方使用1,2,3并根据指定的算法,得到对称密钥,进行数据加密解密,这个对称密码双方都知道,但是并没有在互联网中进行过传播,所以是安全的

    SSL中综合使用了对称和非对称加密

    5:HTTP协议

    http://主机:端口/url

    • get 获取保存数据
    • Post 提交数据
    • delete 删除指定资源
    • update 更新指定资源

    请求参数时可以在URL中指定,也可以在请求体中添加

    Get和Post有什么区别

  • 相关阅读:
    [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
    ubuntu下设置开机自启动项
    【JSP】Cookie的使用及保存中文,并用Cookie实现购物车功能
    汉语-词语:笑面虎
    汉语-词语:阴险
    汉语-词语:奸猾
    汉语-词语:奸诈
    汉语-词语:厚道
    汉语-词语:忠厚
    汉语-词语:狡猾
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/12509250.html
Copyright © 2011-2022 走看看