Transport Layer

Zhang Zhang Lv2

传输层服务

在不同主机上运行的应用进程之间提供逻辑通信.

网络层:主机之间
传输层:进程之间

应用层:报文 => 传输层:报文段 => 网络层 => …… => 网络层:报文段 => 传输层:报文 => 应用层

传输层协议:

  • 可靠、保序的传递:TCP
  • 不可靠、不保序的传递:UDP(IP服务的实实在在的扩展)

不保证时延和带宽!

多路复用&分解

  • 分解:报文段 -> 正确的套接字
  • 复用:套接字 -> 封装成报文段

接收主机的分解

![[Pasted image 20250312115411.png | 400]]

无连接的分解

IP地址?

面向连接

发送主机的复用

无连接的传输:UDP

用户数据报协议,

在UDP上可以实现可靠传递

UDP缺乏拥塞控制

UDP校验和:探测传输的报文段的错误

可靠数据传输原理

抽象服务:

![[Pasted image 20250319100113.png|800]]

可靠信道的实现也依赖不可靠信道

![[Pasted image 20250319100223.png|800]]

可靠数据传输协议接口

FSM

=> 离散时间动态系统的内在逻辑流程

rdt 1.0 完全可靠信道上的可靠数据传输

![[Pasted image 20250319102212.png | 800]]

rdt 2.0 具有比特差错信道上的可靠数据传输

有下面三个新机制:

  • 差错检测

比特差错 => 比特位的翻转.

例如可以使用校验和检测位差

  • 接收方反馈

    • 肯定确认(ACK): 接收方告诉发送方接收成功
    • 否定确认(NAK): 接收方告诉发送方分组有错误. 发送方接受到之后进行重传.
  • 重传

发送方的FSM:

![[Pasted image 20250319103155.png|800]]

接收方的FSM:

![[Pasted image 20250319103224.png|800]]

Question

NAK和ACK如果被传错了怎么办?
发送方重新传递当前的数据包
接收方怎么知道你发的是新的分组还是重传的分组?
可以给每一个分组加一个序号

传递的过程中,接收方丢弃冗余的分组

rdt 2.1 处理被损坏的ACK/NAK

发送方:

![[Pasted image 20250319104835.png | 800]]

接收方

![[Pasted image 20250319104943.png]]

注意ACK也有校验和

注意,为什么等待来自下层的1的部分有一个接受到发送方的0的事件?这种情况其实是接收方发了一个ACK但是发送方没有听清,所以重新发送了1. 这个时候接受方正在等待1,发现发送方重新发送了0,所以接收方丢掉,并且告诉发送方ACK,让它发送1. 如果没有这个东西,系统可能会产生死锁的情况.

rdt 2.2:只使用ACK

和rdt 2.1是类似的,但是此时不发送NAK,而是发送和上一个成功接受的ACK(所以ACK带序号). 发送方接受到冗余ACK等价于之前的rdt 2.1的发送方接受到一个NAK.

rdt 3.0:有位差和数据丢失信道上的可靠数据传输

之前我们假设了只有位差,但是还有可能丢失分组(数据、ACK等)

处理分组丢失 => 发送方在一个合理长的时间内等待ACK,如果没有接受到就重传

rdt 3.0 = rdt 2.2 + timeout

![[Pasted image 20250319111029.png|800]]

注意,在这里我们收到了NAK(实际上是另一个ACK)之后并没有立刻重传,而是等待定时器结束.

可以考虑一些情况,比如过早超时:

![[Pasted image 20250319112107.png | 800]]

Summary

可靠数据传输原理

  • 校验和
  • 顺序号
  • 定时器
  • 肯定、否定确认
  • 流水线

流水线

在rdt 3.0中,有大部分时间发送方都在等待,可能导致链路的利用率很低.

![[Pasted image 20250319112629.png|800]]

在上面这个图中,单个分组很小,而带宽很大,传输时延. 发送方就要等待ACK(差不多是两个传播时延),这会导致带宽的利用率很低.

流水线允许发送方把多个数据包都“扔到”链路上. 一般有两种流水线协议.

  • Go-Back-N协议

发送方可以有个未确认的分组在流水线中,接收方只发送累计确认.

![[Pasted image 20250319113502.png|800]]

接收方发送ACK(n): 表示序号n之前的ACK分组都已经被正确接受了

发送方和接受方的有限状态机都在书上,你可以看看.

乱序的分组的情况:直接丢弃,比如下面这个图的例子:

![[Pasted image 20250319115422.png|800]]

  • 选择性重传(SR)协议

接收方分别接受正确接受的分组,需要对它们进行缓存

发送方仅仅重传没有接受到ACK的分组,而且还要为每一个分组都设置一个定时器

选择性困难的问题