计算机网络原理 笔记 3

网络原理 运输层

无连接运输:UDP

优势:

  • 关于发送什么数据以及何时发送的应用层控制更加精细
  • 无需建立连接(无需握手)
  • 无连接状态
  • 报文段首部短

报文段

检验和

发送方将所有1616比特字段求和并取反码,得到检验和,接收方将所有1616比特字段(包括检验和)进行求和,如果结果不是全11则有错,只能检验不能恢复

可靠数据传输

下层协议可能不可靠
(ARQ) 功能:

  • 差错检测
  • 接收方反馈
  • 重传

    在上一组数据传完并得到ACK相应之前不会有下一组数据,也即上层协议的send不会被调用,称为停等协议
    考虑处理ACK/NAK受损的问题:


    2.22.2中,可以看出在接收到ACK的时候会判断其数字是否与当前状态相同,如果不相同则视作NAK
    为了处理丢包,在发送发建立一个定时器,使得其能够在一定时间未接收到ACK之后默认为丢包,重发分组并且重置定时器

流水线

减少停等带来的传输利用率低下(传播时延远远大于传输时延)

  • 增加序号
  • 双方缓存多个分组
  • 差错恢复:回退N步选择重传

回退N步

当base得到确认之后窗口开始滑动,具体的FSM如下:

超时的时候,重传所有已发送但是未被确认的分组,同时接收方会丢弃所有失序的分组

选择重传

窗口长度必须不大于分组序号空间大小的一半,反之无法正常工作,接收方会出现无法分辨重传与新分组的现象
接收方收到自身的滑动窗口之前的分组时仍要发送ACK,否则发送方无法知道已被接收,窗口不能滑动

可靠数据传输总结

TCP

连接

  • 全双工服务:双向传输
  • 点对点:一对一传输
    传输路径:进程 -> 套接字 -> 发送缓存 -> 网络层 -> 接收缓存 -> 套接字 -> 进程
    典型的MSS的值为14601460字节

报文

  • 接收窗口字段:用于流量控制,指示接收方愿意接受的字节数量
  • 选项字段:协商MSS,或在高速网络下作为窗口调解因子
  • 标志字段:
    • ACK:确认接收
    • RST, SYN, FIN:用于建立和拆除连接
    • PSH:指示接收方立即上传数据
    • URG:指示紧急数据

序号和确认号

一个报文段的序号是指该报文段首字节的字节流编号,TCP将数据看成有序字节流,对每一个字节分别标号
确认号指的是期待收到的最小字节标号,例如发送方已经收到01000\sim100200300200\sim300,则确认号为101101

往返时间与超时

时限必须要大于RTT

  • SampleRTT:报文段从发出到接被确认接收所需要的时间,在任意时刻仅测量一个报文段的SampleRTT而不是计算所有待确认的报文段,得到结果后加权更新,同时计算RTT偏差:

    EstimatedRTT=(1α)EstimatedRTT+αSampleRTT\text{EstimatedRTT} = (1-\alpha)\text{EstimatedRTT} + \alpha\text{SampleRTT}

    DevRTT=(1β)DevRTT+βSampleRTTEstimatedRTT\text{DevRTT} = (1-\beta)\text{DevRTT} + \beta|\text{SampleRTT} - \text{EstimatedRTT}|

  • 时限应当确定为:

    Timeout=EstimatedRTT+4DevRTT\text{Timeout} = \text{EstimatedRTT} + 4\text{DevRTT}

  • 在真实处理中,有一种技术是在每次超时之后将时限翻倍

可靠数据传输

冗余ACK:用于指示报文丢失,当重复收到一个报文段的33次冗余ACK,之后,立即重传其下一个报文

流量控制

使得发送速率与接收方的读取速率相匹配,通过发送发来维护接收窗口实现,指示接收方剩余的缓存空间

发送方保证发送到连接中但是未被确认的数据量小于rwnd即可
特例:当缓存已经满了的时候发送仅含一字节数据的报文段,此时接收方开始清空缓存,并在确认报文里发送新rwnd

三次握手

  • 客户向服务器发送一个SYN为11的报文段,随机选择一个初始序号,请求连接
  • 服务器接收,分配缓存与变量,选择初始序号,返回SYNACK报文段表示允许连接
  • 客户端接收,分配缓存与变量,连接建立

关闭过程:

  • 客户端发送FIN置11的报文段表示关闭请求,并接收ACK,清理变量和缓存
  • 服务端发送FIN置11的报文段表示关闭请求,并接收ACK,清理变量和缓存

拥塞控制

原因

  • 理想路由器,分组的到达速率接近链路容量时,排队时间趋近于无穷大
  • 有缓存的路由器,发送方因为大时延进行不必要重传占据链路带宽
  • 上游路由器发送的分组最终被丢弃,这样发送它所占用的资源就被浪费了

控制方法

  • 端到端:网络层不反馈,全部依靠运输层
  • 网络辅助:网络层会反馈一些信息

TCP拥塞控制

发送方维护一个拥塞窗口cwnd,满足

LastByteSentLastByteAckmin(cwnd,rwnd)\text{LastByteSent} - \text{LastByteAck} \leq \min(\text{cwnd}, \text{rwnd})

发送速率为

cwndRTT字节/\frac{\text{cwnd}}{\text{RTT}}字节/秒

发送方判定丢包为超时或三个冗余ACK
TCP为自计时的

TCP拥塞控制算法

慢启动:

cwnd初始值被确定为一个MSS,传输的报文段被首次确认的时候增加一个MSS,因此整体呈现几何级数增长的形式,同时在发送方维护ssthresh(慢启动阈值),结束增长有如下情况:

  • 超时丢包:重新初始化并慢启动,令ssthresh=cwnd/2\text{ssthresh} = \text{cwnd}/2
  • cwnd=ssthresh\text{cwnd} = \text{ssthresh}:进入拥塞避免
  • 33个冗余ACK:快速重传,进入快速恢复

拥塞避免

每个RTT只增加一个MSS而不是翻倍,例如每个ACK增加MSS2/cwnd\text{MSS}^{2}/\text{cwnd},结束控制如下:

  • 超时丢包:同慢启动
  • 33个冗余:快速重传,令ssthresh=cwnd/2,cwnd=ssthresh+3MSS\text{ssthresh} = \text{cwnd}/2, \text{cwnd} = \text{ssthresh} + 3\text{MSS}

快速恢复

每个冗余ACK增加一个MSS,结束控制:

  • 超时丢包:同慢启动

回顾

整体拥塞控制方法成为加性增,乘性减
另一种拥塞控制方法为基于延迟,即实时检测吞吐量,并于最大吞吐量cwnd/RTT\text{cwnd}/\text{RTT}进行比较,并且线性增减去趋近最大吞吐量

宏观吞吐量

WW代表窗口长度,则

Mean=0.75WRTTMean = \frac{0.75*W}{\text{RTT}}

高带宽TCP

LL为丢包率,则

Mean=1.22MSSRTTLMean = \frac{1.22*\text{MSS}}{\text{RTT}*\sqrt{L}}

这代表高吞吐率需要非常低的丢包率来支持

TCP公平性

公平性代表瓶颈链路分配给每条链路的资源应该是相近的
TCP趋近于多条链路之间平等分享,但是在实际应用中,RTT较小的通常吞吐量更大

公平与UDP

UDP无拥塞控制,并且可能会抑制TCP

公平与并行TCP

一个应用使用多条TCP并行会导致占用过多资源,但是资源的公平应该是在应用层面上的

明确拥塞公告

网络层辅助的拥塞控制机制

IP协议的首部中有两个比特被用于标记ECN,当接收方收到ECN时则在回复的ACK中设置ECE,发送发收到之后进行窗口减半处理(和超时丢包相同),并在下一个报文段首部标记CWR字段(拥塞窗口缩减)