继续画图带你学习TCP 其他 7 大特性(二)

pivoteic
发布于 2022-6-14 16:38
浏览
0收藏

 

情况2: 数据包丢失

如下图,若是 1001-2000 丢失,然后 2001-3000,3001-4000 等后边的几个数据都顺利到达,此时主机 B 反馈的 ACK 的确认序号始终是 1001;

此时若主机 A 发现连续几个 ACK 都是1001,主机 A 就知道,1001 这个数据丢失,就会重传 1001;

在重传 1001 之前,收到的确认序号都是 1001;

当主机 B 收到 1001 这个数据的时候,由于 2001-7000 这些数据前边已经收到过,接下来的 ACK 就从 7001 开始;

此处的重传,只是重传丢了的数据,其他数据不需要额外重传—— 快速重传(搭配滑动窗口下的超时重传)

继续画图带你学习TCP 其他 7 大特性(二)-鸿蒙开发者社区

"乱序"传输:

继续画图带你学习TCP 其他 7 大特性(二)-鸿蒙开发者社区继续画图带你学习TCP 其他 7 大特性(二)-鸿蒙开发者社区

五、流量控制

 

流量控制: 根据接收方的处理能力来反向制衡发送方的发送效率(窗口大小) (通过接收缓冲区的 “剩余空间大小” 来决定发送方的速率)

 

窗口大小不能无限大,传输速率太快,接收方可能处理不过来

在使用滑动窗口机制进行数据传输时,发送方根据实际情况发送数据包,接收端接收数据包;由于接收端处理数据包的能力是不同的,因此可能出现两种情况:

 

  • 若窗口过小,发送端发送少量的数据包,接收端很快就处理了,并且还能处理更多的数据包;当传输比较大的数据时需要不停地等待发送方,就会造成很大的延迟
  • 若窗口过大,发送端发送大量的数据包,而接收端处理不了这么多的数据包,就会堵塞链路;若丢弃这些本应该接收的数据包,又会触发重发机制

 

(第一次的窗口大小是根据链路带宽的大小来决定的) ,发送数据包,接收端接收这些数据包,并返回确认应答包,告诉发送端自己下次希望收到的数据包是多少(新的窗口大小),发送端收到确认应答包以后,将以该窗口大小进行发送数据包

 

  • 接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段,通过 ACK 端通知发送端
  • 窗口大小字段越大,说明网络的吞吐量越高
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端
  • 发送端接受到这个窗口之后,就会减慢自己的发送速度
  • 如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端

 

如下图:

继续画图带你学习TCP 其他 7 大特性(二)-鸿蒙开发者社区

图解:

  • 假设初始窗口大小为4000,发送端发送 4 个数据包,分别为 1-1000,1001-2000,2001-3000 和 3001-4000
  • 接收端接收数据包,接收到 1-1000 数据包之后,设置窗口大小为 3000,告诉发送端自己现在只能处理 3 个数据包,下一次请发送 3 个数据包
  • 发送端接收到确认应答包,查看到接收端返回窗口大小为 3000,知道接收端处理了 1 个数据包;接着继续发送: 1001-2000,2001-3000 和 3001-4000
  • 接收方收到之后,缓冲区只能处理 2 个数据包,发过去的第 3 个数据包 3001-4000 没有被处理;这说明此时接收端只能处理 2 个数据包,第 3 个数据包还需要重新发送
  • 当窗口为 0 时,发送方会暂停发送,也会定时发送一个探测报文;因为接收缓冲区的数据随时可能被取走,一旦取走,就可以接收新的数据(滑动窗口大小是动态变化的)

 

文章转自公众号:三友的java日记

标签
已于2022-6-14 16:38:41修改
收藏
回复
举报
回复
    相关推荐