← 返回 计算机网络原理

计算机网络原理

第三章 第3节

第三章第三节:无连接的传输:UDP

UDP的特点:没有连接建立(连接建立需 要耗费RTT的延迟)

简单:在发送方和接收方 无需维护连接的状态 ,小的头部开销 ,没有拥塞控制 UDP不受拥塞控制制约,可以按照自己的速率往网络中 发送在拥塞时还可以往外发送 适合某些实时流媒体应用

??????? ????3??? 1

UDP 的核心作用就是:

在 IP 的主机到主机交付基础上,加上端口号,实现进程到进程交付。

??????? ????3??? 2

UDP 发出去以后可能出现:

丢包 乱序 重复 出错 对方没收到 对方应用没处理

UDP 本身不会重传,也不会排序。如果应用需要可靠性,就要自己在应用层实现。

比如: 应用层自己加序号 应用层自己等 ACK 应用层自己重传 应用层自己做超时机制

可靠数据传输原理:rdt

Rdt1.0非常鸡肋,没啥用直接来看2.0

解决就是:没错回答ACK,有错回答NAK(重发),问题是ACK或NAK本身传输过程中损坏,发送方就无法知道接收方到底收到了没。

??????? ????3??? 3

Rdt2.1:给每个包加上序号0或1,如果期待的序号是0,收到0,就发ACK。如果是重复的序号,比如期望1,收到0,就说是重传的老包,丢弃,但仍然发ACK,相当于每一个包都有0或者1的两个状态,因为我发送方不知道接收方收到没,比如说他收到了,可能回答给我的ACK坏了,我以为他没收到又重发一遍,发过去对方看到已经有了,就把这个扔了,让我发下一个。

但代价是发送方和接收方都需要记住当前期待和发送的序号

Rdt2.2:把NAK去掉,换成重复发一个对包0的ACK,发送方收到ACK0就知道包1可能坏了,于是重发

??????? ????3??? 4

Rdt2.0-2.2解决了bit错误,也就是通过校验和ACK,NAK,序号等问题解决了发错的问题,但是假设不会丢包,也就是发送方发了,接收方就没收到,也就是不会发ACK回复。这样发送方会一直等下去。

所以看rdt3.0解决这个问题:引入了一个定时器counter,也就是超时情况,发送方认为包丢了,重传当前包。但是代价是效率非常低,发一个包还需要等ACK,再发一个包。利用率低。所以我们会引入流水线协议

流水线:发送方允许多个、等待确认的“飞行”分组

必须增加序号的范围:用多个bit表示分组的序号 ,在发送方/接收方要有缓冲区 发送方缓冲:存储尚未得到确认的分组,因为可能需要重传; 接收方缓冲:上层用户取用数据的速率≠接收到的数据速率;接收到的数 据可能乱序,排序交付(可靠)

??????? ????3??? 5??????? ????3??? 6

但是这样流水线又会有问题就是说,他这个消息是有顺序的,我第一个包如果坏了,然后接收方让他重传,结果他重传之后第二三个包的顺序是对的到了,结果第一个包和第四个包最后同时到,结果顺序就乱了。所以我们的缓冲区和滑动窗口以及回退N步和选择重传就是来解决这些问题的

我们看重点:滑动窗口是如何滑动的:

??????? ????3??? 7??????? ????3??? 8??????? ????3??? 9

大概知道就是这个缓冲区分为已经发了收到回复的,发了没收到回复的,还没发的,以及不能用的,这四个部分就行,接收方缓冲区临时缓存已经到达但未按顺序排序的包,等到缺失的到达之后再连续交付上去,发送方缓冲区保存已发但未确认的包,以便超时后重传。

两种经典流水线协议:回退N步 和 选择重传

1. 回退N步(Go-Back-N, GBN)

· 发送方:有一个窗口(大小N),窗口内的包可以连续发送,不必等ACK。但必须按序接收ACK。如果某个包超时,发送方回退到该包,重传窗口内从该包开始的所有后续包。

· 接收方:不缓存乱序包,直接丢弃任何不是“下一个期望序号”的包。接收方只发送累计确认(比如ACKn表示0~n都收到了)。

· 缺点:一个包丢失会导致重传很多包(浪费带宽)。

2. 选择重传(Selective Repeat, SR)

· 发送方:窗口内连续发送,每个包有独立定时器。只重传真正丢失或损坏的包。

· 接收方:维护一个窗口,缓存所有正确接收但序号不连续的包。发送单个确认(不是累计),如ACK2表示包2收到了。

· 发送方收到ACK:对应的包标记为已确认,窗口向前滑动(只要最小的未确认序号已确认)。

· 优点:只重传必要包,效率高。

· 代价:接收方需要复杂的缓冲区管理、序号空间需要足够大以避免旧包与新包混淆(最大窗口 ≤ 序号空间的一半)。

总结就是说: GBN:虽然浪费,但顺序强制用发送方重传一切来保证。接收方不缓存乱序,也就不会乱序提交。

·SR:接收方准确缓存乱序包,等缺失包一到,按顺序连续交付。只要窗口大小与序号范围设计正确,就不会出现“旧包误认为是新包”的序号回绕问题,从而保证顺序。

我们直接看个例子来说吧,这概念太扯淡了。这里的ACK0-5就是每个确认收到,类似于rdt的2.2升级版,每个包都有自己的序号,我们看这个GBN的例子:回推N步

??????? ????3??? 10

发送方0 1 2 3 4 5…. 接收方0 1 2 3 4 5.

这两个窗口看我口述这个进程,首先发送方发送0过去,接收方收到了0,之后回答ACK0,之后发送方发分组 1和2过去,收到了1,然后回答ACK1收到了,但是2丢失了,我们需要知道,滑动的原理必须是第一个包收到才能往后滑动,否则就不滑动,我刚刚在上面的笔记没写这个,这个很重要,接下来接收方窗口滑动到2345以后两个,发送方还没滑动,这时候的彼此窗口是错位的,需要知道,发送方发的3到了,但是这时候接收方因为没收到2,他直接就把3给扔了,(后续会将一种保留下来的)他让发送方再重新发送一次,窗口还是不动,继续等2,然后等一会这时候发送方收到了回来的应答ACK0和ACK1,这时候发送方往后滑两个,也是2345以后两个的窗口,这时候发送方继续发4和5,然后检测到2超时了,所以他重新发4和5过去,之后重发2,接受方放这时候收到了4和5,但是因为窗口起始还在2那里,他还是不要后面的,还是把4和5扔掉,让发送方重新发,然后接收方继续等2,之后这个2终于到了,这时候接收方回复ACK2,收到2了,这时候窗口往后滑到3,然后后面的345那些才能继续收到往后滑动窗口,发送方收到ACK2之后,窗口从2再滑到3,等待后续接收方的ACK这样以此类推,总之需要知道回退N步的原理是必须每次窗口的第一个位置收到包之后才能往后滑,否则后续收到的包就丢掉,一直重新等,然后发送方和接收方的窗口两者是错位(国内这些教材好垃圾,谁懂我英译手操流程的痛)

接下来是SR,选择重传机制(下节再说吧,小赖要追re0第四季了,冲冲冲)