0%

第3章:运输层

3.2 因特网提供的运输服务

TCP 协议提供的拥塞控制不一定能给通信进程带来直接好处,但能为因特网带来整体好处。

3.3 无连接运输:UDP

Dns 是一个通常使用 UDP 的应用层协议的例子。一台主机中的DNS应用程序想要进行一次查询时,它构造一个报文并将其交给UDP。如果没有查询到,要么告知应用程序不能响应,要么试图向另一个dns服务器发送查询。

为什么不是总选择TCP这种可靠连接呢?有以下几个原因:

  • 速度快。无需建立连接,不用像TCP 哪样三次握手然后建立连接(想想如果dns运行在tcp上,则会慢很多)
  • 更精细控制。使用UDP ,应用层可以更精细控制 何时、发送什么数据
  • UDP 无需维护连接状态。没有维护连接状态,也就不需要发送和跟踪 缓存、拥塞控制、序号确认 等工作,响应更快
  • 分组的首部开销小,TCP 有20个字节,而UDP 仅仅 8个字节

首先要提一下,UDP 是可以实现可靠数据传输的,可以通过在应用程序中建立可靠性机制来保证。这样无需受制于TCP 拥塞控制机制限制传输速率。

UDP 首部只有 源端口号,目的端口号,长度(首部+数据) 以及 校验和。校验和用于防止传输过程中引入的差错(路由器内存可能引入比特差错)

3.4 可靠传输的原理

TCP 是在不可靠的 IP 层之上实现可靠数据传输协议。

需要三种协议来处理比特差错的情况:

  • 差错检测。要有检测手段
  • 接收方反馈。
  • 重传

回退N步:允许发送放发送多个分组,而不需要等待确认,但是也受到滑动窗口的限制,不能超过最大分组数。如果出现超时,发送方重传所有已发送但还未被确认过的分组。当接收到一个连续的ack时,窗口就向前滑动(因为接收方是要求按序接收的,比如n还没收到,但是来了n+1,将会把n+1丢掉的)。
选择重传:按照滑动窗口发送时,接收方将确认一个正确接收的分组而不管其是否按序,时序的分组将被缓存直到所有丢失分组都受到位置,这样才一并交给上一层。避免丢弃导致无谓的重传

3.5 面向连接的传输:TCP

快速重传: 一旦收到3个冗余的ACK,TCP就会执行快速重传,即在该报文段的定时器过期之前重传丢失的报文段。

TCP让发送方维护一个接收窗口的变量来提供流量控制。

流量控制服务:限制发送速率,避免发送方使接收方缓存溢出的可能性。

如果客户端故意不发送ACK来完成第三次握手,那就是所谓的SYN洪范攻击。

拥塞控制:如果TCP发送方感知到网络没什么拥塞,则TCP发送方增加其发送速率;如果发送方感知有拥塞,则降低发送速率。

确定拥塞: 超时或者 收到3个冗余的 ACk,就认为发生了拥塞
如何控制:可以使用拥塞窗口(congestion window,用cwnd 来表示) 去控制发送方向网络中发送流量的速率。

TCP拥塞控制算法:

  • 慢启动:TCP 连接开始时,cwnd 通常设置一个较小的值,之后,每发送成功一次,cwnd就翻番。因此,tpc开始时较慢,但在慢启动过程中以指数增长。
  • 拥塞避免: 一旦进入拥塞避免状态,cwnd的值是上次遇到拥塞时的值的一半,即距离拥塞并不远。因此,tcp 每发送成功一次不再是翻番,而是增加一定的量,先行规律缓慢增长,比慢启动速率慢很多。
  • 快速恢复: 拥塞窗口减半cwnd=cwnd/2,之后执行拥塞避免算法,使拥塞窗口慢慢增大。
谢谢你的鼓励