TCP/IP 之 滑动窗口和延迟确认

滑动窗口

滑动窗口(Sliding window)是一种流量控制技术。早期的网络通讯中,通讯双方不会考虑网络的拥挤状况直接发送数据。因为你们不知道网络拥塞情况,同时发送数据,致使中间节点阻塞掉包,谁也发不了数据,因此就有了滑动窗口机制来解决此问题。(百度百科)算法

其实滑动窗口就是互相的协商, 发送的数据不能超过对方的处理能力.网络

  1. #1 表示已经发送并确认的数据
  2. #2 表示已经发送可是并未 Ack 的数据
  3. #3 表示即将要发送还未发送的数据
  4. #4 表示没有发送的数据

其中黑色的框就是咱们说的滑动窗口, 它的大小为 20 字节, 当 #2 Ack回来的时候, 会从新返回对方的窗口大小, 而后发送方进行动态调节.tcp

上图展现了发送窗口和接收窗口两端的实际执行状况, 有意思的是最后出现了 窗口占满(window=0) 的状况, 一般这种状况会发生 RST 标志位进行重置. 这个再也不这次范围讨论里面.ide

上图中咱们能够看到 Server 端每次根据自身消费数据缓冲区状况,从新计算 RCV.WND 值大小, ACK 响应给 Client 端都会携带 window 字段, Client 端根据 Server端的 window 大小, 从新调整了 发送窗口 大小.ui

Nagle算法 和 延迟确认

Naggle

可是若是频繁的进行 TCP小包 通讯, 网络效率是很是低下的, 对于发送方来讲咱们可使用 Nagle 算法来提升传输效率操作系统

只有收到前一数据的 ACK 消息时或者超时40ms、达到了 MSS 值时, Nagle 算法才发送下一份数据。 TCP 套接字默认使用的 Nagle 算法交换数据, 所以最大限度地进行缓冲, 直到收到 ACK。3d

可使用 TCP_NODELAY 参数关闭掉 Naggle 算法.cdn

TCP delayed ack

接收方在收到数据后,并不会当即回复ACK, 而是延迟必定时间 或者 达到2x最大段数据长度为止 (不一样操做系统实现并不同)htm

  1. 这样作的目的是ACK是能够合并的,也就是指若是连续收到两个TCP包,并不必定须要ACK两次,只要回复最终的ACK就能够了,能够下降网络流量。
  2. 若是接收方有数据要发送,那么就会在发送数据的TCP数据包里,带上ACK信息。这样作,能够避免大量的ACK以一个单独的TCP包发送,减小了网络流量。

参考文档:

www.tcpipguide.com/free/t_TCPS…blog

更多精彩内容 关注公众号(呆呆熊的技术路):

相关文章
相关标签/搜索