参考书:计算机网络自顶向下方法(第6版)(黑皮书)
一些概念
rdt(reliable data transfer):停等
- 不错without error
- 不乱in order
- 不丢
GBN:流水线
SR:流水线
multiplexing复用:accept items from more than one source
- UDP:dest IP+dest port
- TCP: (source IP+port) + (dest IP+port)
demultiplexing分解:deliver items to more than one source
congestion control: 拥塞控制是作用于网络的
- cwnd拥塞窗口
- ssthresh慢启动阈值
flow control:流量控制是作用于接收者的,通过控制发送者的发送速度实现。
传输层
传输层协议提供的服务:
- 应用程序(进程)间的逻辑通信
- 差错检测
- 无连接或面向连接的服务
- 复用和分解
不提供:
- delay guarantees
- bandwith guarantees
除此之外,TCP还提供:
- connection setup
- flow control
- congestion control
可靠数据传输协议
计算机网络 可靠数据传输原理——从rdt协议到GBN到SR_anlian523的博客-CSDN博客_rdt协议
停等
- 发送方利用率=发送端实际忙于发送比特送进信道的时间/发送时间—>低。
- 大部分的时间浪费在等待确认上
rdt
可靠数据传输。
rdt1.0: 底层信道完全可靠->无错、按序
rdt2.0:考虑比特错误、按序
- ACK,NAK
- ARQ自动重传请求协议
- 停等
rdt2.1:考虑ACK,NAK是否受损
- 序号(0,1),包的序号=ACK的序号
rdt2.2:无NAK
rdt3.0:考虑分组受损+丢包->数据分组丢orACK丢+超时
- 定时器
- d.Premature timeout过早超时
流水线
允许发送端发送多个分组而无需等待确认。
- 增加序号范围:每个传输中的分组必须有一个单独的序号
- 协议的发送方和接收方两端必须能缓存多个分组。发送方至少得能缓存那些已发送但未确认的分组(因为这些分组有可能需要被发送方重传),而接收方或许也需要缓存那些已经正确接收的分组(因为这些分组有可能暂时还不能交付给上层,当小序号的分组迟迟未到,而大序号的分组却先到了)。
GBN
回退N步。受限于在流水线中未确认的分组数不能超过 N(流量控制是需要限制窗口长度的原因之一)。
- nextseqnum下一个即将被发送的分组将采用的序号
- 累积确认,接收方反馈的
(ACK, n)
代表的是 接收方已正确收到了序号n以及n以前的所有分组
- pkt2丢失,在pkt2超时重传之前发送过的3,4,5都要重传
- 单个分组的差错可能会引起GBN重传大量的分组,然后许多本来不用重传的分组会充斥在信道中,造成资源浪费
SR
选择重传
- 让发送方仅重传那些丢失和受损的分组而避免不必要的重传
- 接收方也需要维护一个接收窗口,并且需要缓存分组的能力。
- 发送方接收到ACK则滑动窗口
- vs GBN
- 根据不同序号启动对应的定时器。而不是当发送窗口内第一个分组时才启动定时器。
- 当需要发送滑动窗口所属序号以外的数据时,则把它缓存起来。而不是直接抛弃。
- GBN和SR的发送最大窗口长度=2^n-1,n表示sequence number
TCP
- 累积应答-与GBN类似
- 在接收端缓存失序分组-与SR类似
- 快速重传:如果收到对于一个特定报文段的3个冗余ACK,则在超时事件发生前就会对该报文段进行重传,这大大节约了时间。
- TCP中的ACK是指接收端希望从发送端收到的下一字节的序号。
UDP
报文
- length: UDP segment including header
- checksum:同上
- 有进位的加法(溢出则加到低位)
- 取反码
TCP
报文
- ACK:seq # of next byte expected from other side
- FIN:置1表示想要关闭连接
三次握手
- 前两步的seq是随机初始化的
可靠数据传输
是GBN和SR的混合。
拥塞控制
在tcp双方建立逻辑链接关系时, 拥塞窗口cwnd的值被设置为1,还需设置慢开始门限ssthresh,在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口cwnd的值加一,然后开始下一轮的传输,当拥塞窗口cwnd增长到慢开始门限值时,就使用拥塞避免算法。TCP的拥塞控制(详解)_程序媛_婷的博客-CSDN博客_拥塞控制
慢启动
当cwnd=2时,发送方此时可以连续发送两个数据报文段,接收方收到该数据报文段后,给发送方一次发回2个确认报文段,发送方收到这两个确认报文后,将拥塞窗口的值加2变为4,因此整体看是呈指数增长。当cwnd=ssthresh时进入拥塞避免。
拥塞避免
cwnd线性加一。直至出现:
- 超时重传
- ssthresh=cwnd/2
- cwnd=1
- 重新开始慢启动
- 3次冗余ACK
- ssthresh=cwnd/2
- cwnd=cwnd/2[+3]