传输层服务

传输层协议为运行在不同Host上的进程提供了一种逻辑通信机制(端到端)。

发送方:将应用递交的消息分成多个Segment,并向下传给网络层。

接收方:将接收到的Segment组装成消息,并上交给应用层。

常见的协议如Internet上的TCP和UDP协议。

与网络层相比,传输层提供的是进程之间的逻辑通信机制,网络层提供的是主机之间的逻辑通信机制。

多路复用和多路分用

原因:一个主机上的应用层可能运行多个进程

接收端进程多路分用:传输层根据头部信息将接收到的Segment交给正确的Socket。

发送端进行多路复用:从多个Socket接收数据,为每块数据封装头部信息,生成Segment,交给网络层。

TCP/UDP段格式

无连接分用(UDP)

Socket用目的IP地址和目的端口号的二元组标识。

来源于不同源IP地址或源端口号的IP数据包会被导向同一个Socket。

面向连接的分用(TCP)

Socket用源IP地址、源端口号、目的IP地址、目的端口号的四元组标识。

服务器同时支持多个TCP Socket,为每个客户端开不同的Socket。例如如果同一个客户端用两个不同的端口向同一个服务器的同一个端口发送TCP请求,这两个请求在服务器会对应两个不同的Socket(源端口号不同)。

UDP协议

​ UDP提供“best effort”服务,可能发生丢失,也可能不按序到达;同时是无连接的,每个UDP段的处理独立于其他端,发送方与接收方之间不需要握手。

基于Internet IP协议:

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

优势:

  • 无需连接
  • 实现简单
  • 头部开销少
  • 没有拥塞控制,应用更好控制发送时间和速率

用途:

  • 流媒体应用(容忍丢失,速率敏感)
  • DNS

UDP也可以实现可靠数据传输,但需要在应用层实现相应的功能。

UDP端

校验和(checksum):检测UDP段在传输中是否发送错误

校验和相等也可能发生了错误。

可靠数据传输(rdt)

rdt

​ 通过可靠数据传输协议,利用不可靠信道(如IP协议)建立可靠传输,注意可靠数据传输协议与不可靠信道是双向交互,才能实现可靠传输。

Rdt1.0 可靠信道上的可靠数据传输

条件:底层信道完全可靠:不会发送错误,不会丢弃分组;发送方与接收方的有限状态机独立

rdt1.0

Rdt2.0 产生位错误的信道

条件:底层信道只会产生位错误,不会丢弃分组,保证顺序

可以利用校验和检测位错误

接受发需要显式告诉发送方分组正确(ACK,acknowledgements)或错误接收(NAK),发送方收到NAK后,重新传送分组

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

rdt2.0

Rdt2.1

Rdt2.0缺点:无法处理ACK/NAK发生错误的情况

发送方发送分组时添加序列号,如果ACK/NAK发生错误,则重新发送分组,序列号可以避免分组不会被重复接收

rdt2.1

rdt2.1

Rdt2.2 无NAK消息协议

在ACK中显示加入被确认分组的序列号

rdt2.2

Rdt3.0

条件:信道既可能发送错误,也可能丢失分组

方法:发送方等待合理时间,如果没收到ACK,重传,序列号可以解决重传可能导致的重复问题

rdt3.0

但Rdt3.0性能很差,因为大量时间浪费在等待对方的响应上

流水线协议

允许发送方在收到ACK之前连续发送多个分组,需要更大的序列号范围以及更大的空间缓存分组。流水线可以显著降低Rdt中等待响应带来的低效率。

滑动窗口协议

窗口:允许使用的序列号范围

滑动窗口:随着协议的运行,窗口在序列号空间内向前滑动

GBN(Go-Back-N)协议

分组头部包含k-bit序列号

窗口尺寸为N,最多允许N个分组未确认

ACK(n),确认到n的分组均已正确接收,累积确认

Timeout(n),重传序列号大于等于n,还未收到ACK的所有分组

GBN

接收方发送拥有最高序列号、已被正确接收的分组的ACK(当前期望接收的分组),乱序到达的分组直接丢弃

GBN示例

SR(Selective Repeat)协议

GBN协议可能导致正确接收的分组被丢弃,导致重复发送

SR协议对每个分组单独进行确认,接收方设置缓存机制,缓存乱序到达的分组,增加接收方的窗口

SR

SR示例

序列号和两个窗口相比需要足够大,否则可能出现错误