计算机网络知识太难?了解这一篇就够了( 六 )


23、谈下你对 TCP 拥塞控制的理解?使用了哪些算法?拥塞控制和流量控制不同,前者是一个全局性的过程,而后者指点对点通信量的控制 。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏 。这种情况就叫拥塞 。
拥塞控制就是为了防止过多的数据注入到网络中,这样就可以使网络中的路由器或链路不致于过载 。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷 。拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素 。相反,流量控制往往是点对点通信量的控制,是个端到端的问题 。流量控制所要做到的就是抑制发送端发送数据的速率,以便使接收端来得及接收 。
为了进行拥塞控制,TCP 发送方要维持一个拥塞窗口(cwnd) 的状态变量 。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化 。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个 。
TCP 的拥塞控制采用了四种算法,即:慢开始、拥塞避免、快重传和快恢复 。在网络层也可以使路由器采用适当的分组丢弃策略(如:主动队列管理 AQM),以减少网络拥塞的发生 。

  • 慢开始:
慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况 。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值 。cwnd 初始值为 1,每经过一个传播轮次,cwnd 加倍 。
  • 拥塞避免:
拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢增大,即每经过一个往返时间 RTT 就把发送方的 cwnd 加 1 。
  • 快重传与快恢复:
在 TCP/IP 中,快速重传和快恢复(fast retransmit and recovery,FRR)是一种拥塞控制算法,它能快速恢复丢失的数据包 。
没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停 。在暂停的这段时间内,没有新的或复制的数据包被发送 。有了 FRR,如果接收机接收到一个不按顺序的数据段,它会立即给发送机发送一个重复确认 。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段 。
有了 FRR,就不会因为重传时要求的暂停被耽误 。当有单独的数据包丢失时,快速重传和快恢复(FRR)能最有效地工作 。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作 。
24、什么是粘包?在进行 Java NIO 学习时,可能会发现:如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况 。
1. TCP 是基于字节流的,虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块,但是 TCP 把这些数据块仅仅看成一连串无结构的字节流,没有边界;
2. 从 TCP 的帧结构也可以看出,在 TCP 的首部没有表示数据长度的字段 。
基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能 。一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包 。
接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包 。拆包和粘包的问题导致接收端在处理的时候会非常困难,因为无法区分一个完整的数据包 。
25、TCP 黏包是怎么产生的?
  • 发送方产生粘包
采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据 。但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了 。
  • 接收方产生粘包
接收方采用 TCP 协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包 。(放数据的速度 > 应用层拿数据速度)


推荐阅读