【TCP 重传、滑动窗口、流量控制、拥塞控制】

news2024/11/17 9:39:20

文章目录

    • 重传机制
      • 超时重传
      • 快速重传
      • SACK方法
      • Duplicate SACK
    • 滑动窗口
    • 流量控制
      • 那操作系统的缓冲区,是如何影响发送窗口和接收窗口的呢?
      • 窗口关闭
    • 拥塞控制
      • 慢启动
      • 拥塞避免
      • 拥塞发生
      • 快速恢复

重传机制

  • TCP 实现可靠传输的方式之一,是通过序列号与确认应答。
  • 常见的重传机制:
    • 超时重传
    • 快速重传
    • SACK
    • D-SACK

超时重传

  • 重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据
  • TCP 会在以下两种情况发生超时重传:
    • 数据包丢失
    • 确认应答丢失

超时时间应该设置为多少呢?

  • RTT指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。
  • RTO指超时重传时间,两种超时时间不同的情况:
    • 当超时时间 RTO 较大时,重发就慢,丢了老半天才重发,没有效率,性能差;
    • 当超时时间 RTO 较小时,会导致可能并没有丢就重发,于是重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
  • 因此超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。
    在这里插入图片描述

超时重传问题?

  • 「报文往返 RTT 的值」是经常变化的,因为我们的网络也是时常变化的。也就因为「报文往返 RTT 的值」 是经常波动变化的,所以「超时重传时间 RTO 的值」应该是一个动态变化的值。
  • 每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境
  • 超时触发重传存在的问题是,超时周期可能相对较长差,不宜频繁反复发送。

快速重传

  • 不以时间为驱动,而是以数据驱动重传。
  • 快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。

快速重传流程

  • 第一份 Seq1 先送到了,于是就 Ack 回 2;
  • 结果 Seq2 因为某些原因没收到,Seq3 到达了,于是还是 Ack 回 2;
  • 后面的 Seq4 和 Seq5 都到了,但还是 Ack 回 2,因为 Seq2 还是没有收到;
  • 发送端收到了三个 Ack = 2 的确认,知道了 Seq2 还没有收到,就会在定时器过期之前,重传丢失的 Seq2。
  • 最后,收到了 Seq2,此时因为 Seq3,Seq4,Seq5 都收到了,于是 Ack 回 6 。在这里插入图片描述

快速重传问题

  • 快速重传机制只解决了一个问题,就是超时时间的问题,另一个问题是重传的时候,是重传一个,还是重传所有的问题。
  • 假设发送方发了 6 个数据,编号的顺序是 Seq1 ~ Seq6 ,但是 Seq2、Seq3 都丢失了,那么接收方在收到 Seq4、Seq5、Seq6 时,都是回复 ACK2 给发送方,但是发送方并不清楚这连续的 ACK2 是接收方收到哪个报文而回复的, 那是选择重传 Seq2 一个报文,还是重传 Seq2 之后已发送的所有报文呢(Seq2、Seq3、 Seq4、Seq5、 Seq6) 呢?

SACK方法

  • SACK( Selective Acknowledgment), 选择性确认
  • 需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将已收到的数据的信息发送给「发送方」,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。
  • 如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。
    在这里插入图片描述

Duplicate SACK

  • 使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。
  • D-SACK 有这么几个好处:
    • 可以让「发送方」知道,是发出去的包丢了,还是接收方回应的 ACK 包丢了;
    • 可以知道是不是「发送方」的数据包被网络延迟了;
    • 可以知道网络中是不是把「发送方」的数据包给复制了;

ACK 丢包在这里插入图片描述

  • [接收方」发给「发送方」的两个 ACK 确认应答都丢失了,所以发送方超时后,重传第一个数据包(3000 ~ 3499)
  • 于是「接收方」发现数据是重复收到的,于是回了一个 SACK = 3000~3500,告诉「发送方」 3000~3500 的数据早已被接收了,因为 ACK 都到了 4000 了,已经意味着 4000 之前的所有数据都已收到,所以这个 SACK 就代表着 D-SACK。
  • 这样「发送方」就知道了,数据没有丢,是「接收方」的 ACK 确认报文丢了。

网络延迟
在这里插入图片描述

  • 数据包(1000~1499) 被网络延迟了,导致「发送方」没有收到 Ack 1500 的确认报文。
  • 而后面报文到达的三个相同的 ACK 确认报文,就触发了快速重传机制,但是在重传后,被延迟的数据包(1000~1499)又到了「接收方」;
  • 所以「接收方」回了一个 SACK=1000~1500,因为 ACK 已经到了 3000,所以这个 SACK 是 D-SACK,表示收到了重复的包。
  • 这样发送方就知道快速重传触发的原因不是发出去的包丢了,也不是因为回应的 ACK 包丢了,而是因为网络延迟了。

滑动窗口

  • TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。效率比较低,而且有一个缺点:数据包的往返时间越长,通信的效率就越低。

引入滑动窗口原因

  • 指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。
  • 窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
  • 中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」(只要发送方收到了 ACK 700 确认应答,就意味着 700 之前的所有数据「接收方」都收到了。)
    在这里插入图片描述

窗口大小由哪一方决定?

  • TCP 头里有一个字段叫 Window,也就是窗口大小。
  • 这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。
  • 通常窗口的大小是由接收方的窗口大小来决定的。发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。

发送方滑动窗口

在这里插入图片描述

  • 当发送方把数据「全部」都一下发送出去后,可用窗口的大小就为 0 了,表明可用窗口耗尽,在没收到 ACK 确认之前是无法继续发送数据了。
  • 当收到之前发送的数据 32~36 字节的 ACK 确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动 5 个字节,因为有 5 个字节的数据被应答确认,接下来 52~56 字节又变成了可用窗口,那么后续也就可以发送 52~56 这 5 个字节的数据了。

在这里插入图片描述

程序如何表示这四部分?

  • TCP 滑动窗口方案使用三个指针来跟踪在四个传输类别中的每一个类别中的字节。其中两个指针是绝对指针(指特定的序列号),一个是相对指针(需要做偏移)。

在这里插入图片描述

  • SND.WND:表示发送窗口的大小(大小是由接收方指定的);
  • SND.UNA(Send Unacknoleged):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。
  • SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 SND.UNA 指针加上 SND.WND 大小的偏移量,就可以指向 #4 的第一个字节了。

那么可用窗口大小的计算就可以是:

  • 可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)

接收方滑动窗口

在这里插入图片描述

  • RCV.WND:表示接收窗口的大小,它会通告给发送方。
  • RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 RCV.NXT 指针加上 RCV.WND 大小的偏移量,就可以指向 #4 的第一个字节了。

注意:接收窗口的大小是约等于发送窗口的大小的。但是滑动窗口并不是一成不变的,需要根据发送方的发送快慢和接收方的处理快慢决定窗口的大小

流量控制

  • TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。

操作系统缓冲区与滑动窗口的关系?

  • 假定了发送窗口和接收窗口是不变的,但是实际上,发送窗口和接收窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而操作系统的缓冲区,会被操作系统调整
  • 当应用进程没办法及时读取缓冲区的内容时,也会对我们的缓冲区造成影响。

那操作系统的缓冲区,是如何影响发送窗口和接收窗口的呢?

  • 当应用程序没有及时读取缓存时,发送窗口和接收窗口的变化:

    • 后窗口都收缩为 0 了,也就是发生了窗口关闭。当发送方可用窗口变为 0 时,发送方实际上会定时发送窗口探测报文,以便知道接收方的窗口是否发生了改变
  • 当服务端系统资源非常紧张的时候,操作系统可能会直接减少了接收缓冲区大小,这时应用程序又无法及时读取缓存数据,会出现数据包丢失的现象

    • 如果发生了先减少缓存,再收缩窗口,就会出现丢包的现象。
    • 为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况

窗口关闭

接收方,接收到数据后,进行响应,会发送给发送方自己的窗口大小,当发送方下次发送时,就会知道发送多少的数据,这就是流量控制。

  • 如果窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。

窗口关闭带来的危险

  • 接收方向发送方通告窗口大小时,是通过 ACK 报文来通告的。当发生窗口关闭时,接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失了,双方就会死锁
    在这里插入图片描述

TCP如何解决死锁?

  • TCP 为每个连接设有一个持续定时器,只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。
  • 如果持续计时器超时,就会发送窗口探测 ( Window probe ) 报文,而对方在确认这个探测报文时,给出自己现在的接收窗口大小。
    • 如果接收窗口仍然为 0,那么收到这个报文的一方就会重新启动持续计时器;
    • 如果接收窗口不是 0,那么死锁的局面就可以被打破了。
  • 窗口探测的次数一般为 3 次,每次大约 30-60 秒。如果 3 次过后接收窗口还是 0 的话,有的 TCP 实现就会发 RST 报文来中断连接。

拥塞控制

为什么要有拥塞控制呀,不是有流量控制了吗?

  • 流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。
  • 在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大…
  • 拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。

什么是拥塞窗口?和发送窗口有什么关系呢?

  • 拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
  • 发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,由于加入了拥塞窗口后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。
  • 拥塞窗口 cwnd 变化的规则:
    • 只要网络中没有出现拥塞,cwnd 就会增大;
    • 但网络中出现了拥塞,cwnd 就减少;

那么怎么知道当前网络是否出现了拥塞呢?

  • 只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。

拥塞控制有哪些控制算法?

  • 慢启动
  • 拥塞避免
  • 拥塞发生
  • 快速恢复

慢启动

  • 慢启动的算法:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1

例子

  • 连接建立完成后,一开始初始化 cwnd = 1,表示可以传一个 MSS 大小的数据。
  • 当收到一个 ACK 确认应答后,cwnd 增加 1,于是一次能够发送 2 个
  • 当收到 2 个的 ACK 确认应答后, cwnd 增加 2,于是就可以比之前多发2 个,所以这一次能够发送 4 个
  • 当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于是就可以比之前多发 4 个,所以这一次能够发送 8 个。
    在这里插入图片描述

那慢启动涨到什么时候是个头呢?

  • 慢启动门限 ssthresh (slow start threshold)状态变量。
    • 当 cwnd < ssthresh 时,使用慢启动算法。
    • 当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。

拥塞避免

  • 进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。

例子

  • 现假定 ssthresh 为 8:
    • 当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。
      在这里插入图片描述
  • 这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。
  • 当触发了重传机制,也就进入了「拥塞发生算法」

拥塞发生

当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:

  • 超时重传
  • 快速重传

发生超时重传的拥塞发生算法

  • 当发生了「超时重传」,则就会使用拥塞发生算法。
  • ssthresh 和 cwnd 的值会发生变化:
    • ssthresh 设为 cwnd/2,
    • cwnd 重置为 1 (是恢复为 cwnd 初始化值,我这里假定 cwnd 初始化值 1)
      在这里插入图片描述
  • 接着,就重新开始慢启动,慢启动是会突然减少数据流的。这真是一旦「超时重传」,马上回到解放前。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。

发生快速重传的拥塞发生算法

  • 快速重传算法:当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。
  • TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:
    • cwnd = cwnd/2 ,也就是设置为原来的一半;
    • ssthresh = cwnd;
    • 进入快速恢复算法

快速恢复

  • 快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。

  • 进入快速恢复之前,cwnd 和 ssthresh 已被更新了:

    • cwnd = cwnd/2 ,也就是设置为原来的一半;
    • ssthresh = cwnd;
  • 进入快速恢复算法如下

    • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
    • 重传丢失的数据包;
    • 如果再收到重复的 ACK,那么 cwnd 增加 1;
    • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
      在这里插入图片描述

快速恢复算法过程中,为什么收到新的数据后,cwnd 设置回了 ssthresh ?

  1. 在快速恢复的过程中,首先 ssthresh = cwnd/2,然后 cwnd = ssthresh + 3,表示网络可能出现了阻塞,所以需要减小 cwnd 以避免,加 3 代表快速重传时已经确认接收到了 3 个重复的数据包;
  2. 随后继续重传丢失的数据包,如果再收到重复的 ACK,那么 cwnd 增加 1。加 1 代表每个收到的重复的 ACK 包,都已经离开了网络。这个过程的目的是尽快将丢失的数据包发给目标。
  3. 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,恢复过程结束。
  • 首先,快速恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
  • 其次,过程2(cwnd逐渐加1)的存在是为了尽快将丢失的数据包发给目标,从而解决拥塞的根本问题(三次相同的 ACK 导致的快速重传),所以这一过程中 cwnd 反而是逐渐增大的。

文章参考https://www.xiaolincoding.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt可以降重论文吗-chatgpt降重论文软件

chatgpt可以降重论文吗 ChatGPT是一种自然语言处理技术&#xff0c;可以生成符合指定条件的文本。因此&#xff0c;理论上可以使用ChatGPT来降重论文。但是&#xff0c;需要注意以下几点&#xff1a; 是否符合学术道德要求&#xff1a;学术论文的降重需要严格遵守学术道德准则…

mfc140u.dll丢失怎么解决?,哪种方法更简单?

如果您在运行 Windows 操作系统时遇到了“mfc140u.dll 丢失”或“找不到 mfc140u.dll”等错误提示&#xff0c;那么这意味着您的计算机遗失了该文件。mfc140u.dll 文件是 Microsoft Visual C 的一部分&#xff0c;是支持应用程序运行所必需的。无论是什么原因导致了 mfc140u.dl…

PointNetGPD<论文>

摘要 提出了一种端到端的抓取位置预测模型&#xff0c;能够从点云中估计出机器人的抓取位姿。网络以原始点云作为输入&#xff0c;能够捕捉到抓取器闭合区域点云的复杂几何结构&#xff0c;即使这些点云很稀疏。 PointNetGPD是一种轻量级的网络模型&#xff0c;能够处理抓取器…

手把手教你在Centos7.6系统安装mysql5.7

文章目录 1 查看linux系统版本2 官网获取文件3 wget下载4 安装yum源5 查看是否正常工作6 安装mysql服务6.1出错6.2解决方法 7 检查配置文件8 启动mysql服务9 root第一次登录10 其他设置10.1 修改密码10.2 开启开机自启动10.3 配置my.conf 1 查看linux系统版本 需要安装对应系统…

Docker安装、Docker基本操作

一、Dokcer安装 1.安装 # 1、yum 包更新到最新,需要几分钟时间(注意:也可以直接跨过) sudo yum update # 2、作用&#xff1a;安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 sudo yum install -y yum-util…

从文字到语义:文本分词和词性标注的原理与实现

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

个人博客系统调试详细过程

系统功能的详细说明和源代码见以下链接:https://blog.csdn.net/shooter7/article/details/121180333相关的源码数据库文件、软件安装包可以联系博主koukou(壹壹23七2五六98) 调试过程如下&#xff1a; 文章目录 调试过程如下&#xff1a;一、数据库安装二、sql数据文件的导入三…

java调用cmd命令

1.首先&#xff0c;我们需要了解一下 java是如何调用 cmd的&#xff1a; 6.在实际的开发中&#xff0c;我们有可能会遇到 java调用 cmd命令的情况&#xff1a; 7.对于一些特定的环境下&#xff0c;例如在嵌入式系统中&#xff0c;那么我们可以使用下面这种方式来调用 cmd命令&a…

【Redis】Redis常用基本命令

数据结构 常用基本命令 keys * 查看当前库所有的key exists key 判断某个key是否存在 type key 查看key的类型 del key 删除指定的key数据 unlink key :非阻塞删除&#xff0c;仅仅将keys从key元数据删除&#xff0c;真正的删除会异步操作 6.ttl key 查看key多少秒过期…

AIGC:ColossalChat(基于LLM和RLHF技术的类似ChatGPT的聊天机器人)的简介、安装、使用方法之详细攻略

AIGC&#xff1a;ColossalChat(基于LLM和RLHF技术的类似ChatGPT的聊天机器人)的简介、安装、使用方法之详细攻略 目录 ColossalChat的简介 1、局限性 LLaMA-finetuned 模型的限制 数据集的限制 2、在线演示 3、Coati7B examples Generation Open QA ColossalChat的安装…

功率电子开关的高边开关和低边开关high -side power switch

下图为使用NMOS&#xff0c;最简单的开关电路。&#xff08;低侧驱动&#xff09; CONTROL为控制信号&#xff0c;电平一般为3~12V。负载一端接电源正极&#xff0c;另一端接NMOS的D&#xff08;漏极&#xff09;。CONTROL电平为高时&#xff0c;Vgs>NMOS的Vgs导通阀值&…

数据库基础应用——概念模型

1、实体(Entity) 客观存在并可相互区别的事物称为实体。实体可以是人、物、对象、概念、事物本身、事物之间的联系。&#xff08;例如一名员工、一个部门、一辆汽车等等。&#xff09; 2、属性(Attributre) 实体所具有的每个特性称为属性。&#xff08;例如&#xff1a;员工由员…

基于OpenCV的haar分类器实现人脸检测分析

基于OpenCV的haar分类器实现人脸检测分析 文章目录 基于OpenCV的haar分类器实现人脸检测分析一、基于OpenCV的haar分类器实现笑脸检测1、Haar分类器介绍2、haar分类器的静态使用&#xff08;处理图片&#xff09;3、haar分类器的动态使用&#xff08;对摄像头视频进行处理&…

JAVA 17新特性

JAVA 17新特性 概述 JDK 16 刚发布半年&#xff08;2021/03/16&#xff09;&#xff0c;JDK 17 又如期而至&#xff08;2021/09/14&#xff09;&#xff0c;这个时间点特殊&#xff0c;蹭苹果发布会的热度&#xff1f;记得当年 JDK 15 的发布也是同天 Oracle 宣布&#xff0…

S32K3学习笔记_电源管理

S32K3学习笔记_电源管理 1、缩略词 PMC&#xff1a;Power Management Controller&#xff0c;电源管理控制器 FPM&#xff1a;Full Performance mode&#xff0c;全性能模式 LPM&#xff1a;Low Performance mode&#xff0c;低性能模式 LPCMP&#xff1a;低功耗比较器 S…

C语言单链表

本节目标&#xff1a; ①定义单链表结构体 ②初始化单链表 ③单链表增加结点&#xff08;头插法、尾插法&#xff09; ④删除指定结点 ⑤打印输出 目录 导入头文件 定义单链表结构体 初始化单链表 头插法 尾插法插入 删除指定结点 打印单链表 全部代码展示 导入头文件 …

NP完全性PART1:多项式时间与形式化语言体系

算法导论第三版&#xff0c;CH34笔记 NP完全性 Chapter Introduction 一般来说&#xff0c;我们认为可以在多项式时间内求解的问题是易处理的问题&#xff0c;在超多项式时间内解决的问题是不易处理的问题。 下面列出的几对问题&#xff0c;前者可以用多项式时间算法求解&…

MATLAB 点云法向量计算与可视化 (9)

MATLAB 点云法向量计算与可视化 (9) 一、实现效果二、算法介绍三、函数说明四、具体代码(注释详细)一、实现效果 红色线即代表该点位处的法向量计算结果 二、算法介绍 用于拟合局部平面的法线,以 M 乘3或 M 乘 N 乘3矩阵的形式返回。法向量由 k 值定义的邻域数局部计算。…

Packet Tracer - 配置 IP ACL 来缓解攻击

Packet Tracer - 配置 IP ACL 来缓解攻击 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/5 S0/0/0 (DCE) 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 10.1.1.2 255.255.255…

10款UML建模工具更新(2023.4)Software Ideas Modeler 、Rhapsody、Papyrus

最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;Software Ideas Modeler 13.99 更新时间&#xff1a;2023年4月17日 工具简介 轻量级建模工具&#xff0c;支持UML、BPMN、SysML。 平台&#xff1a;Windows 获得地址 https://www.softwareideas.net/en/do…