青训营第①课(计算机网络概论)

142 阅读10分钟

计算机网络概论

计算机网络是众多计算机借助通信线路连接形成的效果。

  • 通信方式

    1. 边缘部分:

      主机之间的通信方式:客户端服务器方式、对等连接方式。

      1. 客户-服务器方式所描述的是进程之间服务和被服务的关系。客户是服务请求方,服务器是服务提供方。
      2. 对等连接方式:对等连接是指两个主机在通信时并不区分哪一个是服务请求方还是服务提供方。只要两个主机都运行了对等连接软件(如:P2P软件),它们就可以进行平等的、对等连接通信。这时双方都可以下载对方已经存储到硬盘中的共享文档。
  • 核心部分的数据交换方式

    1. 电路交换:整个报文的比特流连续地从源点直达终点,好像在一个管道中传送;适合与数据量很大的实时性传输,核心路由器之间可以使用电路交换。
    2. 报文交换:整个报文先传送到相邻结点,全部存储下来后查找转发表(需要时间),转发到下一个节点。
    3. 分组交换:单个分组(报文的一部分)传送到相邻结点,存储下来后查找转发表,转发到下一个节点。
  • 网络分层

    • 应用层:通过应用进程间的交互来完成特定网络应用,交互的数据单元称为报文

    • 运输层:负责向两个主机中进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。

      1. 传输控制协议TCP ——提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段。
      2. 用户数据报协议UDP ——提供无连接的、尽最大努力的数据传输服务(不保证可靠传输),其数据传输的单位是用户数据报。
    • 网络层:负责为分组交换网上的不同 主机 提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成 分组 进行传输。 简称为数据报

    • 数据链路层:在两个相邻结点之间传送数据时,数据链路层将网络层交下来的IP数据报 组装成帧 ,在两个相邻结点间的链路上传送帧。 每一帧包括数据和必要的控制信息 (如同步信息、地址信息、差错控制等)。在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提取出数据部分,上交给网络层。

    • 物理层:在物理层上所传数据的单位是 比特 。发送方发送1(或0)时,接收方应当收到1(或0)而不是0(或1)。 因此物理层要考虑用多大的电压代表 “1” 或 “0” ,以及接收方如何识别出发送方所发送的比特。

  • HTTP

    • HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

    • HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。

    • 特点:

      1. 支持客户/服务器模式。支持基本认证和安全认证。
      2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
      3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
      4. HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。
      5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
    • HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。

  • TCP的三次握手、四次挥手

    • 三次握手

      1. 一次握手

        • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
      2. 二次握手

        • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYNACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
      3. 三次握手

        • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。
    • 四次挥手

      1. 一次挥手

        • 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
      2. 二次挥手

        • 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
      3. 三次挥手

        • 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
      4. 四次挥手

        • 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
        • 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
    • 为什么要挥手四次?

      • 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
      • 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

      从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACKFIN 一般都会分开发送,从而比三次握手导致多了一次。

  • CDN的原理

    • CDN——Content Delivery Network,内容分发网络

    • 最初的核心理念,就是将内容缓存在终端用户附近

      • CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。
    • CDN=更智能的镜像+缓存+流量导流

    • 具体步骤:

      ①、当用户点击APP上的内容,APP会根据URL地址去本地DNS(域名解析系统)寻求IP地址解析。

      ②、本地DNS系统会将域名的解析权交给CDN专用DNS服务器

      ③、CDN专用DNS服务器,将CDN的全局负载均衡设备IP地址返回用户。

      ④、用户向CDN的负载均衡设备发起内容URL访问请求。

      ⑤、CDN负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的缓存服务器

      ⑥、负载均衡设备告诉用户这台缓存服务器的IP地址,让用户向所选择的缓存服务器发起请求。

      ⑦、用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。

      ⑧、如果这台缓存服务器上并没有用户想要的内容,那么这台缓存服务器就要网站的源服务器请求内容。

      ⑨、源服务器返回内容给缓存服务器,缓存服务器发给用户,并根据用户自定义的缓存策略,判断要不要把内容缓存到缓存服务器上。

  • WebSocket

    • 有状态的持久连接

    • 服务端可以主动推送消息

    • 用WebSocket发送消息延迟比HTTP低

    • 代码示例:

       <!DOCTYPE html>
       <html lang="en">
         <head>
           <meta charset="UTF-8" />
           <meta http-equiv="X-UA-Compatible" content="IE=edge" />
           <meta name="viewport" content="width=device-width, initial-scale=1.0" />
           <title>登录</title>
         </head>
         <style>
           div {
             width: 100px;
             height: 100px;
             border: 1px #000 solid;
           }
         </style>
         <body>
           <!-- 输入内容   -->
           <input type="text" placeholder="请输入内容" />
       ​
           <!-- 触发发送请求事件 -->
           <button>发送请求</button>
       ​
           <!-- 显示结果 -->
           <div></div>
       ​
           <script>
             var input = document.querySelector("input");
             var button = document.querySelector("button");
             var div = document.querySelector("div");
             // 演示webSocket的使用
             // H5自带webSocket Api
       ​
             //1.创建webSocket
             // 参数1:webSocket服务地址
             var Socket = new WebSocket("ws://localhost:3000");
       ​
             //2.open 当和webSocket连接成功是触发
             Socket.addEventListener("open", function () {
               div.innerHTML = "服务连接成功";
             });
       ​
             // 3. 主动给webSocket服务发送信息
             button.addEventListener("click", function () {
               var value = input.value;
               Socket.send(value);
             });
       ​
             // 4. 接收webSocket服务的数据
             Socket.addEventListener("message", function (e) {
               console.log(e);
               div.innerHTML = e.data;
             });
       ​
             // 5. 断开webSocket连接
             Socket.addEventListener("close", function () {
               div.innerHTML = "服务断开连接";
             });
           </script>
         </body>
       </html>
       ​
      
  • 网络安全:

    • 三要素:

      • 机密性:攻击者无法获知通信内容
      • 完整性:攻击者对内容进行篡改能被发现
      • 身份验证:攻击者无法伪装成通信双方任意一方与另一方通信
    • 对称加密和 非对称加密

      • 对称加密:加密、解密用同样的密钥
      • 非对称加密:加密、解密使用不同的密钥(公钥和私钥),而且公钥加密只能用私钥解密、私钥加密只能用公钥解密。
    • 密码散列函数(哈希函数)

      • 输入:任意长度的内容
      • 输出:固定长度的哈希值
      • 性质:找到两个不同的输入使之经过密码散列函数后有相同的哈希值,在计算上是不可能的。
    • 机密性

      • 加密需要加密算法和密钥等信息(统称为秘密信息)

      • 网络是明文的,不安全

      • 实现:

        1. 已知:网络是明文的
        2. 如果双方可以通过明文通信商量出秘密信息,那么攻击者也可以。
        3. 所以想要通过铭文通信交换秘密信息,通信双方需要现有秘密信息。
    • 完整性和身份验证

      • 如何实现完整性:

        1. 有明文m,密码散列函数H,以及一个密钥 s
        2. 计算H(m+s)获得哈希值h
        3. 将m和h组合程新信息m+h
        4. 接收方拆分m+h,重新计算H(m+s)得 h’ ,对比 h’ 和h
      • 如何实现身份验证:

        1. 签名:用于鉴别身份和防止伪造
        2. 保证机密性,完整性和身份验证
        3. 数字签名:对明文内容得哈希值使用私钥加密,验证者使用公钥验证
        4. 数字签名(指纹)=私密加密(密码散列函数(原文))
        5. 消息=原文+数字签名
        6. 一般用于对公开内容(如包含公钥的证书)进行数字签名,防止篡改
        7. 根证书是证书链的尽头
        8. 验证一连串的证书称为证书链
        9. 分发证书、验证证书的基础设施为PKI,Public Key Infrastructure
    • HTTPS

      • 把HTTP的明文换成密文,再验证身份
      • HTTPS = HTTP + TLS
      • TLS = 身份验证 + 加解密
      • 身份验证靠PKI(服务端身份验证靠PKI,客户端身份验证靠HTTP协议)