1. 1. 七层网络
  2. 2. 五层网络
  3. 3. UDP
  4. 4. TCP
  5. 5. HTTP下载文件的过程
    1. 5.1. PLT
    2. 5.2. 早期的HTTP
    3. 5.3. HTTP基本优化
    4. 5.4. HTTP1.1
    5. 5.5. HTTPS
    6. 5.6. SPDY协议
    7. 5.7. HTTP2.0
    8. 5.8. 并行连接
    9. 5.9. 持久连接
    10. 5.10. 持久连接的问题
    11. 5.11. 网页缓存
    12. 5.12. 网页代理
    13. 5.13. CDN
  6. 6. DNS服务器
    1. 6.1. 分布式DNS服务器
    2. 6.2. 层次化
    3. 6.3. 本地DNS服务器
    4. 6.4. 一个例子
    5. 6.5. 递归还是非递归
    6. 6.6. DNS缓存
    7. 6.7. DNS插入新值
    8. 6.8. 负载均衡
  7. 7. P2P
    1. 7.1. 发布内容很快
    2. 7.2. 动机
    3. 7.3. 分布式哈希表
    4. 7.4. BitTorrent协议
  8. 8. UDP
    1. 8.1. UDP头
    2. 8.2. UDP问题
    3. 8.3. 不可靠传输的包的问题
    4. 8.4. 什么叫可靠?
    5. 8.5. 正确
    6. 8.6. 丢失
      1. 8.6.1. 包丢失解决方案1
      2. 8.6.2. 反馈
      3. 8.6.3. 包丢失解决方案2
      4. 8.6.4. 包丢失解决方案3
      5. 8.6.5. 多个包的问题
      6. 8.6.6. 多包的解决方案
      7. 8.6.7. 多包的反馈
      8. 8.6.8. 如何检测丢包
      9. 8.6.9. 如何响应丢包
    7. 8.7. GO-BACK-N算法
      1. 8.7.1. GO-BACK-N缺点
    8. 8.8. 完全应答ACK
    9. 8.9. 公正
  9. 9. TCP
    1. 9.1. 不可靠传输的问题
    2. 9.2. 建立TCP连接
      1. 9.2.1. 如何建立连接,为什么是三次握手
      2. 9.2.2. 三次握手携带更多的信息
    3. 9.3. 如何关闭连接,为什么是四次挥手
    4. 9.4. 滑动窗口超时问题
      1. 9.4.1. 自适应RTT
    5. 9.5. 滑动窗口丢包问题
    6. 9.6. 流控制
    7. 9.7. 拥塞控制
      1. 9.7.1. AIMD
    8. 9.8. ACK时钟启动
    9. 9.9. TCP慢启动
    10. 9.10. 超时控制
    11. 9.11. 快速重传快速恢复
      1. 9.11.1. 为什么是3次
      2. 9.11.2. 为什么积性减少
    12. 9.12. ECN(Explicit Congestion Notification)
  10. 10. IPv4与IPv6
    1. 10.1. 早期的地址
    2. 10.2. 类地址
    3. 10.3. 现在的路由表
      1. 10.3.1. 如何寻路?
      2. 10.3.2. 碰到环路
        1. 10.3.2.1. Traceroute
      3. 10.3.3. 包太大怎么办
    4. 10.4. ICMP
    5. 10.5. 发送拥塞信号
    6. 10.6. 如何获得IP地址
      1. 10.6.1. DHCP
    7. 10.7. IPV6
    8. 10.8. NAT
    9. 10.9. 解决路由器环路
      1. 10.9.1. flood
      2. 10.9.2. 学习型交换机
    10. 10.10. 解决最短路径问题
    11. 10.11. 毒性逆转
    12. 10.12. 多径路由
    13. 10.13. 层次路由
    14. 10.14. 策略路由
  11. 11.
    1. 11.1. 字节计数
    2. 11.2. 字节填充
    3. 11.3. 位填充
    4. 11.4. 如何侦错
    5. 11.5. 如何纠错
    6. 11.6. 侦错还是纠错?
    7. 11.7. 多路复用
  12. 12. 安全
    1. 12.1. RSA加密
    2. 12.2. 数字签名
    3. 12.3. 加速签名
    4. 12.4. 无线网安全
    5. 12.5. WPA2
    6. 12.6. WEB安全
      1. 12.6.1. SSL/TLS
    7. 12.7. DNS安全
    8. 12.8. 防火墙
      1. 12.8.1. 无状态防火墙
      2. 12.8.2. 有状态防火墙
      3. 12.8.3. 应用层防火墙
  13. 13. VPN
    1. 13.1. 隧道
  14. 14. DoS
    1. 14.1. IP伪装
  15. 15. 密码学算法
    1. 15.1. MD5算法和SHA1算法
    2. 15.2. CRC算法
    3. 15.3. 置换
    4. 15.4. AES算法
    5. 15.5. DES算法
    6. 15.6. RSA算法
    7. 15.7. ECC算法
  16. 16. HPACK
  17. 17. 以太网
  18. 18. 参考

计算机网络

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial

七层网络

  • 应用层: 针对应用程序的通信服务,大多数文件传输需要第七层
  • 表示层: 加密数据和定义数据格式(ASCII或者二进制)
  • 会话层: 将断开的数据合并,完成回话,则表示层看到的数据是连续的
  • 传输层: TCP、UDP
  • 网络层: IP
  • 链路层: 在单个链路上传输数据
  • 物理层: 传输介质等东西

五层网络

  • 应用层: HTTP,FTP,SMTP,DNS
  • 传输层: TCP,UDP
  • 网络层: IP,ICMP,ARP,RARP,DHCP
  • 链路层:
  • 物理层:

UDP

  • 无连接
  • 包送达的顺序是任意的,因为包可能选择不同的路径
  • UDP发包就行了,能不能到看脸,因此不会重传数据
  • UDP的包会重复, 要是有些不敬业的程序员瞎操作,为了保证数据完整性,每个包都给你发5次,就重复了
  • 无流控制
  • 无拥塞控制

TCP

  • 面向连接,要连接和挂断
  • 可靠的发送,按顺序送达,包丢失重传,包不会重复
  • 接受用缓冲区控制速度
  • 拥塞控制

HTTP下载文件的过程

  • 获得名字所对应的地址(DNS)
  • 和地址对应的服务器建立连接(TCP)
  • 发送获取页面的请求
  • 等待响应
  • 渲染HTML等文件
  • 断开TCP连接

PLT

page load time ,从按下到看见页面的时间,与页面内容有关,与HTTP协议有关、与网络的RTT(Round Trip Time)和带宽有关。

早期的HTTP

早期HTTP/1.0使用单个TCP连接获取一个WEB资源,然后就断开TCP,很容易实现,但性能堪忧。
尽管是访问同一个服务器的不同资源,也要串行,建立了多个TCP,断开了多个TCP,这是很耗时间的。并没有高效使用网络。
每次TCP的连接都将导致三次握手和慢启动,在高RTT的时候,三次握手很慢,在传输大文件的时候慢启动很耗时。

HTTP基本优化

  • 利用缓存和代理来避免传输相同的内容(DNS缓存和网页缓存)
  • 利用CDN让服务器里客户更近
  • 文件压缩后传输

HTTP1.1

  • 改进HTTP协议
  • 并行连接
  • 持久连接: 在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启长连接keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
  • 支持range头传输,即只传输文件的某一部分
  • 支持Host域,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname),HTTP1.0没有host域。
  • 缓存处理: 在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
  • 错误码: 在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。

HTTPS

  • HTTPS使用CA申请证书,证书一般需要交费
  • HTTPS建立在SSL/TLS上,加密
  • HTTPS使用443端口

SPDY协议

  • 多路复用降低延迟,多个流共享一个tcp,解决了HOL blocking(流水线会因为一个response阻塞导致全部阻塞).

  • 请求优先级,优先响应html,而后是js等

  • header压缩(DEFLATE,即LZ77+哈夫曼编码)

  • 基于HTTPS

  • 服务器推送,若客户端请求了sytle.css,服务器会吧style.js推送给客户端

    参考 https://juejin.cn/post/6844903608635359239

HTTP2.0

  • 基于SPDY
  • 支持明文传输
  • 使用HPACK压缩(和SPDY有一点区别)

并行连接

让浏览器并行HTTP实例,但这导致了网络对突发带宽及丢包率

持久连接

用一个连接处理多个HTTP请求,这时候的多个HTTP请求又可以使用流水线。这个技术被用于HTTP/1.1

持久连接的问题

保持TCP连接多长时间?可能导致更慢。????????????

网页缓存

询问服务器时间戳是否过时。

网页代理

  • 大缓存+安全检查
  • 禁止访问某些网站
    缺点:
  • 安全问题,银行不能缓存
  • 动态内容不缓存
  • 大量不常用信息在缓存中

CDN

内容分发网络,服务器就像树根,客户端就像树的叶子,CDN就是中间的东西,从服务器向客户端传输文件的时候,没有必要每次都从根向叶子传输,可能叶子的父亲就拥有正确的文件,直接让他给你传就好了。如下图,客户端4和客户端5先后要一个文件,我们从服务器1传个文件给CDN2,CDN2传给客户端4,当客户端5请求同一个文件的时候,服务器1没有必要再传文件给CDN2了,直接让CDN2给客户端5文件就行了。

1
2
3
4
5
6
7
graph TB
1((服务器1))--> 2((2))
1((服务器1))-->3((3))
2((2))--> 4((客户端4))
2((2))-->5((客户端5))
3((3))-->6((客户端6))
3((3))-->7((客户端7))

DNS服务器

往往我们访问的网站是www.baidu.com,这个叫名字,他对应的IP为36.152.44.96,这个过程可以使用ping得到,名字到IP是谁为我们在提供服务呢?这时候就出现了DNS服务器,将名字映射为IP,

分布式DNS服务器

这个必须分布式

层次化

DNS服务器就像一棵决策树一样,每一层都在分类,最顶层是Zone,他知道.com, .edu, .net 等DNS服务器在哪, .edu服务器又知道 .washington.edu , .cug.edu , .tingshua.edu在哪, 这样一层一层向下

本地DNS服务器

就是学校、公司的DNS服务器

一个例子

比方一个地大的要找gaia.cs.umass.edu, 他就先找地大的DNS服务器dns.cug.edu.cn, 然后找到Zone,然后找到.edu服务器, 然后去找.umass.edu服务器, 然后去找.cs.umass.edu服务器,最后就找到了gaia.cs.umass.edu,然后就找到IP了。

递归还是非递归

即我问了A,A替我去问B,B回答A,A回答我,这就是递归
我问A,A说不知道并让我去问B,我去问B,B回答我,这就是非递归
显然本地服务器采取递归,其他服务器采取非递归好。

DNS缓存

缓存两天

DNS插入新值

花钱买域名

负载均衡

多个IP地址对应一个名字,即服务端有多个IP,他们共用一个名字,这时候DNS服务器收到询问会轮流指向这些IP地址。

P2P

没有服务器,自组织传输,当规模庞大以后会遇到问题

发布内容很快

当一个文件要发给所有客户端的时候,这个速度是呈现指数增长的。

动机

上传助人,下载助己。你传给我,我就传给你,这样就能合作

分布式哈希表

每个节点只储存一部分数据,从而在整个网络上寻址和储存,这样我们就能找到我们要的文件储存在哪。

BitTorrent协议

将文件划分为小块,利用并行机制快速传输数据。

首先联系分布式哈希表,把自己加入其中,然后会得到一堆端(peers),与不同的端并行传输数据,优先和快的端传输

本身拥有文件但不给别的端传输的端,我们也不给他传文件。

UDP

不可靠传输,Voice-over-IP、DNS、RPC、DHCP??????

UDP头

16位源端口,16位目标端口,16位UDP长度,16位checksum

UDP问题

长度受限制了,我们要将大文件分割成小文件,哪一层来负责?为什么要分为小块?更可靠,但是可能导致后发送的先到达。

不可靠传输的包的问题

  • 丢失
  • 损坏
  • 乱序到达
  • 延时到达
  • 重复包

什么叫可靠?

  • 正确、及时、高效、公正

正确

不丢失、不损坏、不乱序

丢失

包丢失解决方案1

  • 频繁而快速地发送单个包
    正确,但效率差,缺乏接收端的反馈,不知道何时停止。

反馈

ACK:收到包了

NACK: 没有收到包(你确定?别人给你发包了吗?) —> 当损坏的时候使用

包丢失解决方案2

收到ACK以前,一直重复发包,好吗? 优化了时间效率,但浪费了带宽。特别是长延时网络。

包丢失解决方案3

发送包以后设置时钟,在这段时间内收到ACK则结束,否则重发,但是时间设置为多少????

多个包的问题

单包方案在局域网不会出现问题,因为距离近,但是在更大的网络呢?效率非常差,带宽利用率过低。

多包的解决方案

使用流水线+滑动窗口,用窗口大小控制链路上包的数量

窗口的目的 限制带宽、限制接收端的缓冲区数量

为什么要限制带宽? 用来拥塞控制

多包的反馈

累加ACK,ACK的时候回馈未收到的包的最小序号

完全ACK,回馈所有未收到的包序号,这个不常用,可能会与累加ACK一起使用

如何检测丢包

累加ACK多次返回同一个值的时候,那个包就丢包了,

如何响应丢包

检测到5号包丢失的时候,包5肯定要重发,包6呢?

GO-BACK-N算法

当检测到5号包丢失的时候,把窗口滑向5,然后重新发送窗口中所有的包。

GO-BACK-N缺点

  • 丢失
  • 顺坏
  • 重排
  • 延时
  • 重复

完全应答ACK

基于窗口,在超时或者多次ACK用一个值后重发。

公正

基于窗口的AIMD,发现丢包以后滑动窗口减半,成功收到ACK后窗口增大1

TCP

TCP传输是一种可靠传输的实现

不可靠传输的问题

  • 包丢失
  • 包损坏
  • 包乱序
  • 包延时
  • 包重复

建立TCP连接

为什么TCP连接需要建立呢? 为了确保网络的可达性。

如何建立连接,为什么是三次握手

考虑这样一个场景,有个人叫C在河边散步,他记得河对面有个人叫S,但是河上雾太大了,他看不清对面。他想和对面的人对话。

既然是你想和对面的人说话,你首先得喊一声吧: “喂喂喂!河对面的S在吗?”,这时候可能有多种情况发生,见1,2,3,4

  1. 突然河面上跳出一条大鱼,把你的声音盖住了,S没有听到你的声音。于是对话结束了吗?不你得多试几次。再去喊他,要是每次都被这条该死的鱼给盖住了,那就意味着你的消息无法送达到河对面。对不起,网络连接可能有问题。
  2. 你的声音传了过去,但是被河中间的河神偷偷改变了,于是对面听到”喂喂喂!河对面的S死了吗?”,这时候S可能就不高兴了,他尽量分析你的句子的意思,这时候如果他分析出来你想说”喂喂喂!河对面的S在吗?”,那就好这等价于下面的情况4,若分析不出,他可能就当你是个傻子说骚话了,就不管你了。
  3. 你的声音传了过去,对面不在,哦豁,这时你可能会再叫他,叫的次数多了就知道叫不通了。
  4. 你的声音传了过去,对面听到了,作为一个礼貌的人,S要回答你的话。他对你说”我S在河对面!”,这时候又得看大鱼跳还是不跳了和河神干不干坏事了,如5,6,7,8
  5. 大鱼跳了,S一看自己说话了半天,你不回答他,S就要再次说”我S在河对面!”,这就又重复到情况4去了,要是S说了多次你还不回答他,S就不理你了,而你可能还会以为他没有听到你说的”喂喂喂!对面的S在吗?”在不断的尝试。
  6. 河神干坏事了,结果你听到了”我lbw真的没有开挂!”,你就得发挥你机智的头脑,把这句话分析为”我S在河对面”。要是分析不出来,和情况5没啥区别,要是分析出来了就进入7,8
  7. 你的声音传了过去,对面听到了,给你说了”我S在河对面!”,你也听到了,很多人这就结束了,你是过瘾了,喊S说话,S理了你,但S呢,莫名其妙的有个人叫了自己,自己给他回了话,然后对面就不说话了,这是S可能就在担心,”哎!他听到我说我在河对面了吗?”,然后他为了验证自己的担心不是多余的,就一直继续说”我S在河对面!”,时间长了S就会想,对面怕不会是个聋子吧。这个交流显然是失败的。
  8. 你的声音传了过去,对面听到了,给你说了”我S在河对面!”,你也听到了,这时候为了防止对面认为你是个聋子,你得再给他说一句,”很好很好,我知道你在河对面了”,这是有可能发生很多情况,就得看鱼和河神了。
    9.要是他俩又干坏事,S要么听不到你说话,认为你是个聋子,要么听见你说骚话,认为你是个傻子,这两种情况他都会不断地多次对你说,”我S在河对面”,要不就分析出你说”很好很好,我知道你在河对面了”,认为你是个正常人。现在你们都认为对面是正常人了。谈话很愉快。

三次握手携带更多的信息

通常我们在握手的时候,就告诉对面自己的初始包号,然后第二次和第三次握手的时候就能携带ACK数据了。

如何关闭连接,为什么是四次挥手

原理一样的,我们忽略丢包和包损坏,不妨设C要准备去吃饭了,这时候S还在滔滔不绝的讲着他的故事,C对S说,”我要吃饭了”,S听到后说”好的,我听到你说你要去吃饭了,但是你先等我把这故事讲完再走”,这是C能离开吗?显然不能,他得等着,知道S说”我讲完了”,这时候已经挥手了三次了,你还不能走,你得根S说,”我听到你说讲完了”之后才能离开,为什么呢?因为你要是不说的话,对面可能以为你没听到他说的“我讲完了”,说一共是挥手4次。

滑动窗口超时问题

多久没有收到ACK才代表着所有的包全部丢失?这个很难确定,我们可以让他自适应

自适应RTT

$$SRTT_n = 0.9SRTT_{n-1} + 0.1RTT_n$$ 这个代表RTT的期望
$$SVAR_n = 0.9SVAR_{n-1} + 0.1|RTT_n-SRTT_n|$$ 这个代表RTT的方差
当一个包超过期望+3倍的方差仍未回应ACK,视为丢包

滑动窗口丢包问题

3次ACK,则丢包

流控制

我们一直在想办法加速我们的网络,用到了发送端滑动窗口,但是如果接收端的内存太小,受不起如此快的传输,就只能丢弃后面收到的包,尽管已经收到了,这时候我们常常让接收端告诉发送端自己还剩下多少缓存取,来放慢传输速率,高效利用网络。

拥塞控制

由于网络上各个线路的带宽不同,可能导致拥堵,TCP协议是闭环,通过反馈信息来判断是否拥堵。

AIMD

没有阻塞的时候,滑动窗口大小+1,阻塞的时候除以2,

ACK时钟启动

发送端一次性发送大量的包,然后开始等待ACK,等到一个ACK就发下一个包,这样就能降低丢包和延时??,刚开始会有网络的爆发,后面会平滑

TCP慢启动

使用指数的方式,先发一个包,然后每收到一个ACK,(滑动窗口增大1)发两个包,当拥塞的时候滑动窗口减半。

超时控制

超时以后使用慢启动(AIMD),更好的检测丢包能保证更好的AIMD

快速重传快速恢复

当3次ACK检测丢包后,认为丢包,重传一个段,然后积性减少滑动窗口

为什么是3次

顺序重排也会导致多次ACK

为什么积性减少

消除超时或丢失后的慢启动,因为重传了一个段,可能后面会收到大量的ACK,预先减少滑动窗口,防止拥塞

ECN(Explicit Congestion Notification)

显示拥塞通知,路由器通过队列检测拥塞,标记收影响的包,被标记的包送达时,接收端视为丢失,然后反馈给发送端拥塞消息。

IPv4与IPv6

IPv4使用32位地址,IPv6使用128位地址

早期的地址

前八位为网络地址,后24位为主机地址,人们认为256个网络就足够了

类地址

接下来人们设计了ABCDE类的地址

类别 IP
A类 0******* ******** ******** ********
B类 10****** ******** ******** ********
C类 110***** ******** ******** ********
D类 1110**** ******** ******** ********
E类 11110*** ******** ******** ********

其中的E是不使用的,D是多播的
C类地址太多了,路由器存不下

现在的路由表

  • CIDR = 无类别域间路由
  • 网络和主机地址间的划分是可变的
  • 为了辨认这两个,提出了掩码,IP按位与掩码就是网络
perfix Next Hop
192.24.0.0/19 D
192.24.12.0/22 B

如何寻路?

匹配LCP(最长公共前缀),常用X快速前缀树这个数据结构,链接在这{ post_link X快速前缀树 }, 通过最佳匹配项,找到应该走的路径即可。

碰到环路

为每一个IP包设置TTL,每一次寻路就让其减少1,减少到0的时候就丢掉这个包。

Traceroute

发送TTL从1开始的包,可以用于网络检测

包太大怎么办

又的路由器low一点,只能收小包,但是到底多大的包才是最合适的?分包会增加丢包率
发现路径的最大传输单位,主机先发一个大包,路由器传输,若出错,返回最大支持的包大小。

ICMP

是IP的伴侣协议,提供转发时发生的错误信息,当路由器遇到错误,就发送一个ICMP给IP源地址

发送拥塞信号

为包打标记,告知主机发生拥塞

如何获得IP地址

过去手动配置,现在使用DHCP

DHCP

向其他节点发放IP地址,提供网络前缀,提供本地路由器地址,提供DNS服务器、时间服务器等
节点只需要在网络上广播,DHCP服务器便会回应。

IPV6

从根本上而言,IPv6不与IPv4兼容,那我们怎么在IPv4网络中发送IPv6的包呢?我们在其包外封装一层IPv4头即可。

NAT

本质上就是将内网地址+端口映射到外网地址+端口

Internal IP:port External IP: port
192.168.1.12:5523 44.25.80.3:1500
192.168.1.13:5523 44.25.80.3:1502
192.168.1.20:5523 44.25.80.3:1505
  • 缺点: 外网无法直接访问内网,需要内网先与外网建立链接
  • 优点: 缓解IP地址压力,易于部署,私密

解决路由器环路

flood

泛洪,由一个节点开始,向四周扩散,flood包最终会发给每个其他节点,于是大家都知道了如何到达第一个节点的路径

学习型交换机

当包到达,查看源ID,已经进入的端口,将其存入路由表,并设置着一项的存活时间,如果不知道要怎么走,就发给所有相邻路由器

解决最短路径问题

分布式bellman-ford算法,记录一个矩阵,D(X,Y,Z)代表从X到Y经过Z的最佳距离,然后跑bellman-ford算法就可以了

毒性逆转

有点复杂了,溜溜球

多径路由

保存最短路dag,转发的时候就能选择多个后继节点发送,进行负载均衡

层次路由

路由到一个区域而不是单个节点,先路由到区域,然后到区域内的IP前缀

策略路由

ISP为客户提供路由服务,客户为ISP付费,ISP内的客户互相路由不付费

就是一串数字

字节计数

每一帧的第一个数字记录了这一帧的长度,很辣鸡,错位就凉凉

字节填充

前后加上特殊flag,就像字符串的写法一样,如abc”abc就写成了”abc"abc”,这样做导致flag要转码。

位填充

flag为6个连续的1,发送数据的时候五个连续的1后插入一个0,原理是什么?
编码?下图是一个正常的编码。他只能识别00,01,10,11

1
2
3
4
5
6
7
graph TB
s((.))--0--> 0((.))
s((.))--1--> 1((.))
1((.)) --0--> 10((10))
1((.)) --1--> 11((11))
0((.)) --0--> 00((00))
0((.)) --1--> 01((01))

这样改进一下呢?(我太菜了mermaid用不好,第一层的1居然在左边)

1
2
3
4
5
6
7
8
9
graph TB
s((.))--0--> 0((.))
s((.))--1--> 1((.))
0((.)) --0--> 00((00))
0((.)) --1--> 01((01))
1((.)) --0--> 10((10))
1((.)) --1--> 11((.))
11((.)) --0--> 110((110))
11((.)) --1--> 111((111))

然后就能识别00,01,10,110,111,我们让111作文分割符,110表示11即可。
为了能让这个更加棒,我们可以把树的高度弄大一点。这里我就不画了。

如何侦错

搞两个拷贝,不同即错。太low了
搞hash check sum,这个很棒
internet校验和 定义函数f(x) = x>=n?f(x%n+x/n):x,n为一个二的幂, check = n-f(sum)-1, 验证: f(check+sum)=n-1,这个是显然的
循环冗余校验 这个就是使用多项式在系数膜2的剩余体系下的除法运算,将得到的模数添加到最后面用于侦错。

如何纠错

汉明码 通常使用二的幂-1对齐,如果我们放入k个检验位,则在最多出现一个错误的情况下可以保护2^k-1个位,为什么?二分!我们讲检验位放在1,2,4,8…等地方,然后使用二进制分类的方式对整个序列进行异或即可。解码的时候重新计算检验位,本质上就是在二分。得到的值位0,表示无错误,否则翻转后的位就是错误位。
卷积码。

侦错还是纠错?

需要根据错误率来选择

多路复用

时分和频分

安全

加密,有两种,对称加密和非对称加密,先用非对称加密,然后用对称加密

加密 = 正确的发送者和完整性

RSA加密

两个大素数p,q相乘得到N,显然$\phi(N)=\phi(p)\ast\phi(q)=(p-1)\ast(q-1)$,找到两个数e,d满足$ed%\phi(N)=1$,这里可以先随便生成一个e,然后利用exgcd算出d,显然e需要与$\phi(N)$互质,否则无解。

其中(e,N)为公钥,(d,N)为私钥。

证明$x^{ed}%N=x$,如果x与N互质,显然成立,如果x与N不互质,不是一般性,假设$x=kp$, 则$x^{ed}%q=x%q$, 于是$x^{ed}=x+tq$,这一步很细节,都知道$=x%q+tq$成立,为什么这样也成立?则$x^{ed}%p=(x+tq)%p=tq%p=0$,即tq同时是p和q的倍数,于是$x^{ed}%N=(x+tq)%N=x$

数字签名

和信息一起发送,让别人知道这条信息是自己发的,因为公钥解密后是签名

加速签名

RSA性能不佳,只对摘要签名,摘要是校验和加认证加上时间戳,要不然别人拿着老消息断章取义

无线网安全

防监听,防蹭网

WPA2

WEB安全

监听c/s流量,篡改c/s消息,假冒web服务器

SSL/TLS

浏览器通知服务器自己支持的加密协议,服务器选择协议并告诉浏览器证书,浏览器用CA的公钥鉴别证书,浏览器用公钥加密一个随机数发给服务器,服务器解密后把随机数和加密后的新的对称密钥返回给浏览器,双方开始对称加密。
客户端请求SSL连接,发送一个随机数和客户端支持的加密算法,
服务端回复加密算法,一个随机数,CA证书和签名,公钥
客户端验证CA证书和签名,再生成一个随机数,并用公钥加密,返回给服务端
服务端用私钥解密随机数,现在他应该知道3个随机数,用他们通过一定算法生产对称加密的密钥,然后尝试用这个给客户端发送一个消息来测试密钥

DNS安全

DNS伪装,使用加密。

防火墙

防火墙对每个包,作出决策,接受或丢弃

无状态防火墙

拒绝某些服务、端口、目标

有状态防火墙

允许内部主机连接后接受TCP包

应用层防火墙

查看包内容,进行安全检测

VPN

隧道

IP in IP,在IP外再次封装一层IP实现虚拟链路封包

DoS

畸形包、发送TCP连接请求但不发送接下来的,

IP伪装

将假的源地址放到包上,ISP要干一些事情来预防这种事件

密码学算法

MD5算法和SHA1算法

这是一个哈希函数,他很复杂,取了很多奇怪的数字,然后对数据分段,然后疯狂的加减和各种位运算,这导致了他不可逆

CRC算法

把数据看为一个二进制串,进而把每一位看作系数,于是成了一个多项式f(x),让这个多项式乘以$x^k$,然后模上g(x),得到余数h(x), 我们传输的时候传输$F(x)=f(x)*x^k+h(x)$,验证的时候F(x)模g(x)为0即可

置换

这个东西嘿嘿嘿,不是这篇博客的重点,了解一小下叫置换群:)
只要知道置换是可逆的就行了

AES算法

把明文分组,每组128位即16字节
先把一维的message做成一个二维的列优先矩阵[4*4], 然后进行很多轮下述操作

  • 字节置换, 把矩阵的每一个元素查表替换为另一个元素
  • 行位移, 第一行不变,第二行向右移动一个单位,第三行移动两个,以此类推
  • 列混淆,在模群下,让自己乘上一个矩阵A(确保A存在逆元),
  • 轮密钥加,就是异或另一个矩阵B即可
    不难发现第四步可以再次异或B复原,第三步可以乘上A的逆复原,第二步可以向左移位复原,第一步可以查表复原,第

DES算法

把明文分组,每组64位即8字节

  • 初始置换, 通过查表的方式,把每一位上的元素替换为另一个位上的元素
  • 加密处理,共16轮,先把64位的数据拆为两个32位的数据L和R,$L_i=R_{i-1},R_i=L_{i-1}^f(R_{i-1],k_{n-1}})$ k是一个密钥
  • 函数f 第一步,密钥置换 , 用64位的密钥生成16个48位的子密钥,每一轮使用不同的子密钥,使用循环左移生成
  • 函数f 第二步,拓展置换 , 讲32位的R改变位的次序并重复某些位,拓展为48位,
  • 函数f 第三步,S盒替换 , 把48位的R分割为8个6位的小段,对每一个段使用S盒来替换,输出是4位,故而最终R又从48位变成了32位,
  • 函数f 第四步,P盒置换 , 把32位的R再次和初始置换类似的方法置换即可
    解密一样的啦

RSA算法

基于大合数难以分解的原理,达到难以破解,基于模群的性质达到加密和解密

ECC算法

一个基于圆锥曲线的算法,非对称加密算法

HPACK

HPACK: 专门为头部设计的压缩算法,使用两个索引表来把头部映射到索引值,一个是静态索引,一个是动态索引

静态索引表: 预先只有少量的值,但是这个表是固定的

动态索引表: 是一个先进先出的队列维护的空间有限的表,每个动态表只针对一个连接,

整形编码: 头+value,如果不够长度,则下一个字节为0+value(x-2^n+1)

字符串编码: H+len+data, 是否曼哈顿+字符串长度+数据, 有两种编码方式,看第一位如果为1就算哈夫曼编码,否则是原串

二进制编码: 然后就开始维护动态表

以太网

以太网是一种计算机局域网技术,工作于链路层,使用MAC地址寻址。

参考

以太网,OSI与TCP/IP

图解SSL/TLS协议

HTTP1.0和HTTP1.1和HTTP2.0的区别