Transport Layer

传输层服务
在不同主机上运行的应用进程之间提供逻辑通信.
网络层:主机之间
传输层:进程之间
应用层:报文 => 传输层:报文段 => 网络层 => …… => 网络层:报文段 => 传输层:报文 => 应用层
传输层协议:
- 可靠、保序的传递: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]]
在上面这个图中,单个分组很小,而带宽很大,传输时延
而流水线允许发送方把多个数据包都“扔到”链路上. 一般有两种流水线协议.
- Go-Back-N协议
发送方可以有
![[Pasted image 20250319113502.png|800]]
接收方发送ACK(n): 表示序号n之前的ACK分组都已经被正确接受了
发送方和接受方的有限状态机都在书上,你可以看看.
乱序的分组的情况:直接丢弃,比如下面这个图的例子:
![[Pasted image 20250319115422.png|800]]
- 选择性重传(SR)协议
接收方分别接受正确接受的分组,需要对它们进行缓存
发送方仅仅重传没有接受到ACK的分组,而且还要为每一个分组都设置一个定时器
选择性困难的问题