1 传输层服务
网络层的作用是提供主机之间的逻辑通信机制,而传输层位于网络层之上,提供应用进程之间的逻辑通信机制,传输层依赖网络层服务,并对网络层服务进行(可能的)增强。
简单讲网络层的作用是找到主机,传输层是找到进程。
传输层可以提供的协议包括TCP和UDP。
2 多路复用/分用
定义
如果一层协议需要对应直接上层的多个协议,那么就需要多路复用。
发送端多路复用:从多个Socket接收数据,为每块数据封装上头部信息,生成Segment,交给网络层。
接收端多路分用:传输层依据头部信息将收到的Segment交给正确的Socket,即不同的进程。
过程
主机接收到IP数据报(datagram),每个数据报携带源IP地址、目的IP地址,和传输层的段(Segment)。每个段携带源端口号和目的端口号,主机收到Segment之后,传输层协议提取IP地址和端口号信息,将Segment导向相应的Socket。
分类
分用包括无连接分用和面向连接分用,主要对应UDP和TCP两种协议。
无连接分用情况下,UDP的Socket只包括目的IP和端口,因此如果这两个相同,接收端会把来自不同源的数据包会发到同一个Socket。
面向连接分用情况,TCP的Socket除了目的IP和端口,会增加源IP和端口,因此接收端会将数据包发到合适的Socket。
UDP协议是无连接协议,所谓无连接,就是发送方和接收方之间不需要握手,这样做优势是减少延迟、实现简单、无需维护连接状态、头部开销少、应用可更好地控制发送时间和速率,同时会导致了不可靠,因为这种特性,常被用于流媒体应用,但是通过增加特定机制,可以实现可靠的UDP传输。
在UDP数据包中增加校验和项的也是为了实现可靠机制。
3 可靠数据传输机制
需求
可靠的定义:不错、不丢、不乱
基本结构:接口,如图
可靠数据传输协议包括Rdt1.0、Rdt2.0、Rdt2.1、Rdt2.2、Rdt3.0、GBN、SR。
停-等协议
Rdt1.0认为信道可靠,这时发送方和接收方的是独立的。(要注意以下FSM图中红色字体部分)
如果底层信道发生分组中的位(bit)翻转怎么处理?
Rdt 2.0协议中引入的新机制,即差错检测、接收方反馈控制消息:(ACK/NAK)、发送端重传。
如果ACK/NAK消息发生错误/被破坏(corrupted)会怎么样?
此时仍然可以采用重传机制,但简单的重传会产生重复分组,Rdt2.1协议中的解决方式是采用序列号(Sequence number),即发送方给每个分组增加序列号(0和1),然后接收方可丢弃重复分组。
为什么只用两个序列号就可以实现?停等协议。
Rdt2.2和Rdt 2.1功能相同,只做了简要更改,在反馈信息中只使用ACK,接收方在ACK消息中显式地加入被确认分组的序列号,通过ACK告知最后一个被正确接收的分组,发送方收到重复ACK之后,采取与收到NAK消息相同的动作,即重传当前分组。
如果信道既可能发生错误,也可能丢失分组,怎么办?
Rdt3.0在发送方增加定时器机制,发送方等待“合理”时间,如果没收到ACK就会重传;如果分组或ACK只是延迟而不是丢了,重传会产生重复,通过序列号机制能够处理,接收方需在ACK中显式告知所确认的分组。
但是Rdt采用停等机制,虽然能够正确工作,但性能很差。如图,如果设置不合理,网络协议会大大限制物理资源的利用,所以我们需要软硬件协同设计。
滑动窗口协议
如何改进Rdt3.0?
采用流水线机制和滑动窗口协议,允许发送方在收到ACK之前连续发送多个分组,则可以提高资源利用率。这里核心思想是在停等协议中,只能发送一个数据包然后等待ACK消息,这样大部分时间浪费在端与端之间的传输时间上(RTT),如果在等待时间内多发送几个分组,并能够对发送的分组进行记录来保证可靠性,这样资源利用率得到提高。
定义
滑动窗口协议: Sliding-window protocol
窗口:允许使用的序列号范围
窗口尺寸为N:最多有N个等待确认的消息,随着协议的运行,窗口在序列号空间内向前滑动。
GBN
GBN主要是在发送方增加滑动窗口,记录已经被正确接收的分组,当超时发生时,重传大于等于n的所有分组。GBN中的接收方变化不大,对乱序到达的分组直接丢弃。
SR
SR对接收方进行了改进,接收方采用滑动窗口缓存下乱序到达的分组。
序列号空间大小与窗口尺寸需满足:NS+NR<=2k。