
一、多路复用和多路分用如果某层的一个协议对应直接上层的多个协议/实体则需要复用/分用。1.1、多路分用传输层从网络层收到Segment后依据每个Segment中头部信息的差别将收到的所有Segment交给正确的Socket这个过程就是多路分用。如下所示多路分用的详细过程可以分为以下3步①、主机从传输层以下接收到了 IP数据报(datagram)每个数据报携带源IP地址、目的IP地址②、每个 IP数据报(datagram) 携带一个传输层的Segment该传输层的Segment携带了源端口号和目的端口号③、传输层协议提取Segment中的 IP地址和端口号信息将Segment导向相应的Socket1.1.1、无连接UDP的多路分用无连接的多路分用指的就是UDP的多路分用UDP的Socket使用了 “目的IP地址、目的端口号” 这个二元组标识。当传输层收到UDP的Segment后传输层会检查Segment中的目标端口号并将这个Segment绑定到对应端口号的Socket上。1.1.2、面向连接TCP的多路分用面向连接的多路分用指的就是TCP的多路分用TCP的Socket使用了“源IP地址、源端口号、目的IP地址、目的端口号”这个四元组标识。当传输层收到TCP的Segment后传输层会检查Segment中的目标端口号并将这个Segment绑定到对应端口号的Socket上。如下图所示二、无连接不可靠UDP的传输协议UDP协议基于IP协议是一种数据报SOCK_DGRAM的传输协议。UDP协议在传输层实现了多路复用/多路分用并且UDP协议在传输层实现了简单的端到端的错误校验机制端到端的错误校验机制不同于链路层和物理层的错误校验机制端到端的错误校验机制是传输层特有的一种错误校验机制。由于UDP协议和IP协议一样只是在他们所在的OSI模型中做了简单的错误校验机制并没有做错误恢复机制因此UDP协议和IP协议相同都是一种简单的“Best effort”服务模型“Best effort”服务模型可能会导致报文段丢失或者报文段不能按序到达。由于UDP协议无连接因此UDP协议中每个数据报SOCK_DGRAM的传输都是独立的数据报之间并没有相互依赖。UDP协议相比于TCP协议UDP协议中协议头部只需要8KB的存储空间TCP协议中头部需要20KB的存储空间并且UDP协议没有拥塞控制而TCP协议有拥塞控制。UDP协议常用于流媒体应用DNS应用和SNMP应用。UDP协议报文的Segment如下图所示UDP协议报文的Segment中的checksum是UDP协议的校验和主要用于检测UDP协议报文Segment在传输中是否发生错误比如位翻转。checksum的校验原理如下图所示三、有连接可靠的传输协议——rdt协议gbn协议sr协议可靠数据传输的定义为发送方将信息通过可靠信道reliable channel或者不可靠信道unreliable channel传输给接收方时信息可以保证不错、不丢、不乱。由于传输信道channel存在不可靠性因此可靠数据传输的过程最终要依赖于复杂的可靠数据传输协议——rdt协议。可靠数据传输协议的接口中有以下3点需要注意①、发送方的rdt_send()函数是单向的这个表示发送方的应用层单向的将数据通过rdt_send()函数传递给传输层然后由传输层通过TCP协议将数据传输给网络层的IP协议②、接收方的deliver_data()函数是单向的这个表示接收方的网络层和传输层接收到完整的数据之后才会将完整的数据传递给应用层③、传输层和网络层的函数调用是双向的传输层的TCP协议和网络层的IP协议共同构成了可靠数据传输。可靠数据传输协议一般利用传输层的有限状态自动机Finite State Machine, FSM来刻画传输协议有限状态自动机的结构如下图所示3.1、rdt1.0协议rdt1.0协议解决的问题是在可靠信道上进行可靠数据传输实际不存在这种理想环境。rdt1.0协议建立在数据传输的底层信道是完全可靠的假设之上比如①、假设底层信道不会发生错误(bit error)②、假设底层信道不会丢弃分组。同时rdt1.0协议中发送方和接收方都会有各自的有限状态自动机FSMrdt1.0协议的工作流程如下图所示在rdt1.0协议的工作流程图中有以下3个逻辑比较重要①、发送方的有限状态自动机FSM只有1个状态——等待应用层的调用状态。当发送方的应用层调用传输层rdt_send(data)函数时发送方的传输层通过make_pkt(data)函数创建一些packet分组然后利用可靠信道udt_send(packet)虽然在rdt1.0命名为udt_send(packet)但是可以看做为可靠信道传输把这些packet分组发送出去。在这段逻辑的执行完成后发送方的有限状态自动机FSM处于等待应用层的调用状态。②、接收方的有限状态自动机FSM只有1个状态——等待网络层的调用状态。当接收方的网络层调用传输层rdt_rcv(packet)函数时接收方的传输层通过extract(packet,data)函数把网络层发过来的packet分组提取出来合并为data然后通过deliver_data(data)传递给应用层。在这段逻辑的执行完成后接收方的有限状态自动机FSM处于等待网络层的调用状态。③、因为rdt1.0协议建立在数据传输的底层信道是完全可靠的假设之上所以接收方的传输层通过extract(packet,data)函数把网络层发过来的packet分组提取出来合并为data时并不需要检测网络层发过来的packet分组是否有错是否有丢失是否有重复...等这些问题。3.2、rdt2.0协议rdt2.0协议解决的问题是如何处理产生错误的分组信息。rdt2.0协议建立在数据传输的底层信道会产生错误信道的场景之上比如底层信道可能翻转分组中的位(bit)...等等如果产生了错误的分组信息rdt2.0协议还建立了错误恢复的机制如下图所示总结如下Rdt 2.0中引入的新机制中包含了①、差错检测“校验和”只是差错检测方式中的一种②、接收方反馈控制消息ACK/NAK来决定发送方是否重传分组基于这种重传机制的rdt2.0协议又称为ARQ(Automatic Repeat reQuest)协议。rdt2.0协议中发送方的有限状态自动机FSM和接收方的有限状态自动机FSM分别设计如下与rdt1.0协议的有限状态自动机相比rdt2.0协议的有限状态自动机有以下2点比较重要①、发送方的有限状态自动机FSM有2个状态——等待应用层的调用状态、等待接收方的ACK或NACK状态。当发送方的应用层调用传输层rdt_send(data)函数时发送方的传输层通过make_pkt(data,checksum)函数创建一些sndpke分组然后利用可靠信道udt_send(sndpke)函数把这些sndpke分组发送出去之后发送方的有限状态自动机FSM处于等待接收方的ACK或NACK状态接收方回复的内容有以下2种可能第一种接收方回复了ACK那么发送方的有限状态自动机FSM由等待接收方的ACK或NACK状态变为等待应用层的调用状态第二种接收方回复了NACK那么发送方要重新发送刚才的sndpkt继续等待直到接收方回复了ACK。②、接收方的有限状态自动机FSM只有1个状态——等待网络层的调用状态。当接收方的网络层调用传输层rdt_rcv(rcvpkt)函数时接收方的传输层需要判断接收到的rcvpkt分组是否正确接收方接收到分组会有以下2种可能第一种rcvpkt是正确的接收方的传输层会把rcvpkt分组提取出来合并为data然后通过deliver_data(data)传递给应用层最后回复发送方ACK信号第二种rcvpkt分组是错误的接收方会立即回复发送方NACK信号并删除刚才接收到的rcvpkt分组。可以用下面2个张图分别模拟rdt2.0协议的传输过程和有限状态自动机3.3、rdt2.1协议和rdt2.2协议3.3.1、rdt2.1协议虽然rdt2.0协议加入了接收方反馈控制消息ACK/NAK来决定发送方是否重传分组但是在rdt2.0协议中如果接收方反馈给发送方的ACK/NAK消息发生错误/被破坏(corrupted)那么发送方的有限状态自动机FSM将会进入死锁。为了解决这个问题rdt2.1协议引入了序列号来控制分组信息rdt2.1协议的针对rdt2.0协议的问题处理逻辑如下①、发送方给每个分组增加序列号如果发送方接收到的ACK/NAK消息发生错误/被破坏(corrupted)发送方将重传当前序列号的分组②、接收方如果接收到了重复序列号的分组信息那么接收方将会丢弃重复的分组。rdt2.1协议中发送方的有限状态自动机FSM和接收方的有限状态自动机FSM分别设计如下与rdt2.0协议中有限状态自动机相比rdt2.1协议中有限状态自动机有以下2点比较重要①、发送方的有限状态自动机FSM有4个状态——等待序列号为0的分组、等待接收方返回序列号为0的分组的ACK或NACK、等待序列号为1的分组、等待接收方返回序列号为1的分组的ACK或NACK。具体的函数调用过程此处不再赘述。②、接收方的有限状态自动机FSM有2个状态——等待序列号为0的分组、等待序列号为1的分组。具体的函数调用过程此处不再赘述。需要注意的是如果接收方在等待序列号为0的分组时完整无误的接收到了序列号为1的分组那么接收方同样会给发送方返回序列号为1的分组的ACK和checksum同样的如果接收方在等待序列号为1的分组时完整无误的接收到了序列号为0的分组那么接收方同样会给发送方返回序列号为0的分组的ACK和checksum。3.3.2、rdt2.2协议rdt2.2协议相比rdt2.1协议接收方采用ACK序列号的返回方式替代了接收方返回NAK。rdt2.2协议只使用ACK序列号的处理逻辑如下①、接收方通过ACK告知发送方最后一个被正确接收的分组在ACK消息中有被确认分组的序列号②、如果发送方收到了非当前发送分组的序列号那么重传当前分组。rdt2.2协议中发送方的有限状态自动机FSM和接收方的有限状态自动机FSM分别设计如下3.4、rdt3.0协议rdt1.0协议建立在可靠信道上进行可靠数据传输实际不存在这种理想环境rdt2.x 协议建立在数据传输的底层信道会产生错误信道的场景之上比如底层信道可能翻转分组中的位(bit)...等等但是在真实的网络环境中数据传输的底层信道除了可能发生错误以外还可能丢失分组。因此rdt3.0协议解决的问题就是数据传输的底层信道丢失了分组这种场景rdt3.0协议的处理逻辑如下①、继承了rdt2.x协议中ACK序列号的机制②、rdt3.0 协议中发送方在发送完数据后会等待“合理”时间如果发送方在等待的时间内没有收到接收放的ACK那么发送方重传分组rdt3.0协议中发送方的有限状态自动机FSM设计如下rdt3.0协议在面对不同场景的分组丢失时处理流程如下rdt3.0协议虽然能够正确工作但是rdt3.0协议的性能很差比如下面这个rdt3.0协议的使用场景在1Gbps链路端到端的传播延迟为15ms发送1KB的分组所使用的时间和效率分别为由于rdt协议是停等协议因此在一个分组发送完成时整个网络一直处于等待的状态因此发送时间为1515830.008发送方利用率发送方发送时间百分比为同样可以计算得到在1Gbps链路上发送方每30毫秒才发送一个大小为1KB的分组那么1s可以发送的分组为33个即1s可以发送33KB的数据。因此可以得到如下结论rdt3.0协议限制了物理资源的利用造成这个限制的原因是rdt3.0协议的停等操作如下图所示3.5、流水线机制与滑动窗口协议rdt3.0协议的性能瓶颈主要是由停等操作造成的如果在rdt3.0协议的基础上每次可以发送多个分组流水线机制那么就可以显著的提高rdt3.0协议的性能瓶颈提高发送方利用率发送方发送时间百分比如下图所示允许在rdt3.0协议的基础上每次可以发送多个分组的协议叫做流水线协议流水线协议允许发送方在收到ACK之前连续发送多个分组因此流水线协议与rdt协议相比有3点主要区别①、流水线协议需要更大的序列号范围②、流水线协议中发送方和接收方需要更大的存储空间以缓存分组流水线协议流水线协议的工作原理与rdt协议的工作原理对比如下图所示3.5.1、流水线协议的具体实现——Go-Back-NGBN协议Go-Back-N协议的发送方包含分组头、窗口尺寸N、ACK(n)、计时器(timer)、超时Timeout(n)事件...等每一个属性的具体含义如下①、分组头表示分组头部包含一个长度为k bit的序列号因此序列号的长度为0~2^k②、窗口尺寸N表示滑动窗口中最多允许N个分组未确认如下图所示③、ACK(n)确认到序列号n(包含n)的分组均已被正确接收可能收到重复ACK④、计时器(timer)为滑动窗口中未确认接收的分组设置计时器(timer)⑤、超时Timeout(n)事件当计时器timer超时时需要重传序列号大于等于n还未收到ACK的所有分组。Go-Back-N协议中发送方的有限状态自动机FSM设计如下Go-Back-N协议中有限状态自动机有以下3点比较重要①、当nextseqnum等于base时表示滑动窗口开始从第一位向接收方发送数据此时发送方开启计时器并设置start_timer直到滑动窗口中未接收到ACK的数据量等于窗口尺寸N时停止向接收方发送数据②、如果滑动窗口中的第一位数据收到了接收方的ACK此时窗口会整体向前滑动一位将接收到ACK的第一位数据移出滑动窗口并重置计时器的开始时间start_time当发生timeout超时时Go-Back-N协议会将滑动窗口中的所有数据全部发送一次③、如果滑动窗口中的最后一位数据收到了接收方的ACK并且整个传输层也没有更多需要发送的数据那么计时器将会被关闭。Go-Back-N协议中接收方没有缓存因此接收方的ACK机制为发送拥有最高序列号的、已被正确接收的分组的ACK这个ACK机制保证了Go-Back-N协议中接收方只需要记住唯一的expectedseqnum即可对于乱序到达的分组由于Go-Back-N协议中接收方没有缓存接收方直接丢弃即可。因此Go-Back-N协议中接收方只能接收按序到达的分组。Go-Back-N协议中接收方的有限状态自动机FSM设计如下Go-Back-N协议的工作示例如下图所示通过上图可以看出发送方已经发送了编号为05的分组。当计时器超时时若发送方只收到0、1号分组的确认信息ACK0和ACK1发送端则需要重发的分组数是4个依次分别是2、3、4、5号分组。3.5.2、流水线协议的具体实现——Selective RepeatSR协议Selective Repeat协议在Go-Back-N协议的基础上为Go-Back-N协议的接收方设置缓存机制——增加了接收方的滑动窗口缓存乱序到达的分组。因此Selective Repeat协议中发送方在发送分组时只需要重传那些没收到ACK的分组即可并且Selective Repeat协议会为每一个发送过的分组设置定时器Go-Back-N协议只会为整个窗口内的所有分组设置定时器。Selective Repeat协议中发送方滑动窗口和接收方滑动窗口如下图所示Selective Repeat协议中发送方和接收方的工作流程如下图所示