可靠数据传输原理 一(rdt3.0)


在Rdt2.0及2.x时代,假定的是信道只有一种不可靠特征,也就是只发生位bit的错误,不会丢失分组等错误,现在假设更实际一些。

如果信道极可能发生错误,也可能丢失分组,怎么办?

  • “校验和+序列号+ACK+重传”够用吗?

例子假如说现在发送方发了一个分组给接收方,而接受方没有收到,则接收方一直等着,发送方也一直等着接收方发来确认消息。

这时候这些机制就不够用了,怎么处理分组丢失呢?

解决办法:

设置一个等待的合理的时间。过了时间就重传。

  • 如果没有收到ACK,重传。
  • 如果分组或者ACK知识延迟,而不是丢了。
    重传会产生重复,序列号机制能够处理
    接收方需要在ACK中显式告知所确认的分组
  • 需要定时器。

状态图

下面是正常情况:


发送方发了pkt0,接收方收到后,发ack0。然后发送方收到了ack0,则继续发pkt1,接收方正常接收后,发ack1.发送方收到后,再发pkt0...

下面是丢包的情况下:


当发pkt1的时候,发送失败后,timeout后,触发再次发送pkt1。

如果丢失了ack怎么办?


ack1没有发给发送方,则过了timeout的时间后发送方会重新发送pkt1,这时候其实接收方接到了两次pkt1,删除掉重复的,然后再发一次ack1(ack永远是最后一个收到的分组)给发送方

如果定时器设置过短呢?

在发送方没有接受到ack的时候,又重传的情况

网络延迟是不确定的,timeout的值不好设定。

Rdt3.0功能正确的,性能怎么样?


Rdt3.0性能是由于这样的停等操作引起的效率非常低。


过了半个rtt,第一个bit到达接收方,再过L/R的时间,该分组的最后一个bit到达接收方,然后发ack(ack很小可以认为一次性发过去),再花半个RTT的时间,到达发送方。所以发送一个分组的总时间为t=RTT+L/R.
所以利用率就是


可靠数据传输原理 一(rdt1.0 2.0 2.1 2.2)


把不可靠的数据传输编程可靠的数据传输

  • 信道的不可靠特性决定了靠靠数据传输协议(Rdt)的复杂性
  • 要实现不丢,不乱,不错


应用层和传输层的箭头是单项的,而传输层跟网络层,链路层是双向的控制消息的流动完成的,后面会进一步去看

利用状态机刻画传输协议

圆圈是表示一个状态,横线上边是一个事件,下面是一个动作

Rdt1.0:可靠信道上的可靠数据传输(信道本省就是可靠的情况)

发送方:


由于确定百分之百可靠的传输所以发完之后,又回来重新等待继续发送不用管别的

接收方:


接收方也就一个状态,就等着从下层发过来,

Rdt2.0:可能产生位错误的信道,但是不会丢包等其他错误。

  • 底层信道可能翻转分组中的位,可以利用校验和检验位错误

发完了后发送方不知道错没错,只有接收方告诉他

如何从错误中恢复?

  • 确认机制(ACK):接收方显式的告知发送方分组已确认接收
  • NAK:接收方显式的告知发送方分组有错误
  • 发送方收到NAK后,重传分组。

也就是要有机制的概念了,引入了ACK的机制,NAK机制,重传机制。

这种基于重传机制的rdt协议称为ARQ(automatic repeat reQuest)协议

比1.0多的东西,Rdt2.0中引入的新机制

  • 差错检测
  • 接收方反馈控制消息:ACK/NAK
  • 重传


在rdt1.0的时候,发送方接收方一个状态就够了,
首先是等待上层调用,这个没有变。第二个状态是等待Ack,Nak,也就是法完之后要等待对方控制消息的状态,也就叫停等协议

而且发送的时候要加入不仅仅是data,还要加入checksum这个参数

Rdt2.1 应对ACK/NAK消息发生错误或者被破坏

  • 为ACK/NAK增加校验和,检错并纠错
  • 发送方收到被破坏的ACK/NAK时候不知道接收方发生了什么,添加额外的控制消息
  • 如果ACK/NAK坏掉,发送重传
  • 不能简单的重传,因为会产生重复分组

常用的一种方法,发送方接收到ack,nak错误的时候不管三七二十一直接重传,但是会带来的问题就是重复分组。怎么解决呢?

增加序列号,丢弃重复分组

rdt2.0和rdt2.1的区别

注意:接收方无法知道ack/nak是否被发送方正确收到。

Rdt2.2


是否真的需要NAK这样的机制,多了一种机制,处理逻辑就更复杂


UDP协议


UDP:User datagram protocol

基于IP协议:多了个

  • 多路分用/复用,
  • 简单的错误校验

为什么在传输层做错误检测呢
这是端到端的检测,虽然链路层也会检测

除了做这两件事就没做什么事了,可以说事对ip层直接暴露给了应用层

UDP是无连接的,体现在

  • UDP发送方和接收方之间不需要握手
  • 每个UDP段的处理独立于其他段

UDP为什么存在?

  • 无需建立链接,意味着减少延迟
  • 头部开销少 8个字节,而tcp需要20个字节
  • 没有拥塞控制,上层可以更好的控制发送时间和速率

用途

常用于流媒体(容忍丢失,速率敏感)
DNS
SNMP

在UDP上实现可靠的数据传输?

在应用层增加可靠性机制

UDP段的格式

关于校验和

目的:检测UDP段在传输中是否发生错误

有些错误能检测出来有些检测不出来的,意思事如果校验和相等也不一定是正确的


上图的最高位 1 需要加上去,得到sum 然后再求反得到checksum


关于TCP协议 多路分用/复用


实习面试中经常被问到这个知识点,有必要补一下。

一个IP地址和一个端口号也称为一个socket,socket是应用层和传输层之间的一个门

在传输层:

在 TCP / IP 协议族中有两个互不相同的传输协议: TCP(传输控制协议)和 UDP(用户数据报协议).

一般不按下面的分层,而是这四层

  • 应用层,
  • 传输层,
  • 网络层,
  • 链路层

TCP数据被封装在一个IP数据报中

理解传输层服务的基本理论和基本机制:

  • 多路复用/分用
  • 可靠数据传输机制
  • 流量控制机制
  • 拥塞控制机制

传输层和网络层的不同点

  • 传输层是为不同应用之间提供的逻辑通信机制。
  • 网络层是为不同主机之间提供的逻辑通信机制。

这里的逻辑,指的是不分空间,物理路径的。通过某种机制就好像连在一起

主要掌握传输层的以下概念:

  • UDP:无连接传输服务
  • TCP:面向链接的传输服务
  • TCP拥塞控制

工作大概的方式:

发送方:将应用递交的消息分成一个或者多个segment,并向下传给网络层。
接收方:将接收到的segment组装成消息,并向上交给应用层

TCP是一种可靠的服务,主要有以下三点:

  • 拥塞控制
  • 流量控制
  • 链接建立


可见UDP只是实现了传输层必要的服务即多路分用,多路复用


多路复用多路分用(传输层的一个必要功能)

多路分用:是指在接收端,有多个网络进程,

因为一台主机上有多个应用进程,因此传输层必须进行多路复用多路分用

当p3给p1发送报文,p4给p2发送报文的时候,主机2的传输层就必须进行多路分用,把报文段正确的交给不同的进程,不能错,这就交多路分用。通过头部信息,可以知道该发到哪个进程。

多路复用

发送端发送的时候,而网络层只有一个。首先从多个socket(可以认为是应用层)接受数据,然后再交给网络层之前要做一件事情:为每个数据封装上正确的头部信息,从而产生正确的报文段(segment),再交给网络层

多路分用工作的基本原理:

主机接收到IP数据报

  • 每个数据包携带源IP地址,目的IP地址。
  • 每个数据包携带一个传输层的段(segment)。
  • 每个段携带源端口号和目的端口号

TCP/UDP段的格式如下:

主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket。(TCP会做更多处理)

可见网络层是不关心端口号信息的。

面向链接的多路分用


UDP使用二元组(目的ip地址,目的端口号)

一个TCP链接的例子(TCP是一对一的,一个客户进程对应一个服务进程,):


shijiebei 365bet manbetx 188bet xinshui caipiao 95zz tongbaoyule beplay 88bifa 18luck betway bwin hg0088 aomenjinshayulecheng ca88 shenbotaiyangcheng vwin w88 weide