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,之后执行拥塞避免算法,使拥塞窗口慢慢增大。