TCP可靠传输和流量控制

TCP可靠传输和流量控制

文章目录

一、前言

今天,我们来深入探索关于TCP可靠传输的详细过程 以及流量控制~

二、TCP可靠传输

无论协议怎样天花乱坠,可靠传输的本质 还是超时重传

2.1 停止等待ARQ协议

  • ARQ(Automatic Repeat-reQuest)自动重传请求

    发送包和确认包不是一个包哦~

    • 若有包重传很多次还是失败,系统是不会一直重传的,这取决于系统的设置,当超出一定次数还未成功时,就会发送RST报文,断开连接

2.2 连续ARQ协议 + 滑动窗口协议

在上述ARQ协议中,可能会出现一个问题:CPU运转过快,但是网络IO(数据逐段的发送确认)过慢的情况,会有大量时间在等待数据包。而连续ARQ协议 + 滑动窗口协议就可以有效地规避这个问题。

其中,M1、M2...都是数据包,而窗口的大小并非取决于发送端A,而是B在和A建立连接时,就把A的接收能力告知A,从而确定窗口大小。

  • 如果接收窗口最多能接4个包,但发送方只发了2个包

    • 接收方等待一段时间后,没有收到第3个包(确认包),就会返回确认收到2个包给发送方
  • 每个包多大呢,每个确认编号如何编址

    建立连接的时候会进行确认

  • 序号和确认号

    • 在传输过程的每一个字节都会有一个编号
    • 在建立连接后,序号 表示,这一次 传给对方的TCP数据部分的第一个字节的编号
    • 在建立连接后,确认号 代表,期望对方下一次 传过来的TCP数据部的第一个字节的编号

4.3 选择性确认(SACK)

像上面的图那样,如果出现发送序列的某个数据包丢失(5、6、7、8都发,但是7丢失了),TCP会通过重传最后确认的分组发后续分组(确认的是6,会重传7),这样就会造成已经正确传输的分组(8)重复发送,降低了TCP性能。这个时候,选择性确认机制应运而生。

  • 发展出了SACK(Selective acknowlegement,选择性确认)技术

    • 告诉了发送方哪些数据丢失,哪些数据已经提前收到
    • 使TCP重新发送丢失的包 (比如7),不用发送后续的所有分组(8)
  • SACK信息会放在TCP首部的的选项部分

    确认号只能确认边界。这个时候,在TCP协议头中,有一个长度可变的选项字段(最多40字节),就起到了决定性的作用了。

    • Kind:占1字节。值为5代表这是SACK选项(后面的数据使用的是选择重传机制)
    • Length:占1字节。表明SACK选项一共占用多少字节
    • Left Edge:占4字节,左边界
    • Right Edge:占4字节,右边界
    • 一对边界信息需要占用8字节,由于TCP首部的选项部分最多40字节
      • SACK选项最多携带4组边界信息
      • SACK选项的最大占用字节数:4 * 8 + 2 = 34
    • 滑动窗口有大小限制,这和接收方有关

为什么选择在传输层将数据分成多个段,而不是等到网络层分片传递给数据链路层?

可靠传输是在传输层进行控制的

  • 如果在传输层不分段,一旦出现数据丢失,整个传输层的数据都得重传
  • 如果在传输层分了段,一旦出现数据丢失,只需要重传丢失的那些段即可,提高了效率

三、TCP流量控制

应用程序可能正忙于其他任务,并不一定能够立刻取走数据,客户端持续发送大量数据,接收端缓存(recv-Q)会溢出,造成数据丢失

TCP应用程序提供了流量控制 (Flow Control),以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。

3.1 定义

让发送方的发送速率不要太快,让接收方来得及接收处理

3.2 基本情况

基本方法:接收方根据自己的接收能力(接收缓存的可用空间大小)控制发送方的发送速率、

  • 通过确认报文中窗口字段来控制发送方的发送速率

  • 发送方的发送窗口大小不能超过接收方给出窗口大小

  • 当发送方收到接收窗口的大小为0时,发送方就会停止发送数据

    万一又有空间了呢?你都不发了,你怎么知道它什么时候有空间呢?

rwnd:receive window

一开始的发送窗口400是待发送区,因为一次发送可能不能全部占满,就会有一个发送区

所谓的1,2,3等都是数据段

窗口的收缩就是流量控制的生动体现

所谓市面上限速的软件都是应用了窗口的原理

3.3 特殊情况

针对3.2中的特殊问题而产生的一种特殊情况:

一开始,接收方给发送方发送了0窗口的报文段,后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了,发送方的发送窗口一直为0,双方陷入僵局。

  • 解决方案

    • 当发送方收到0窗口通知时,这时发送方停止发送报文
    • 并且同时开启了一个定时器隔一段时间就发个测试报文去询问接收方最新的窗口大小
    • 如果接收的窗口大小还是为0,则发送方再次刷新启动定时器

    即使是窗口从0变为非0,也不可能发送方就会立即发送数据的,可能此时恰好没什么可发的。

    小练习

    一开始窗口为4000字节,已经发送了2个1000字节,一个已经确认收到,另一个未确认(题目并未对此明确指出,因此不能确认其已丢失),也没说超时,此时窗口已经变为2000字节,因此最多只能再发1000字节,得解。

四、小结

TCP除了可靠传输和流量控制,还有一个拥塞控制,下一节见~

相关推荐
姚青&2 小时前
1、Linux 系统与 Shell 环境准备
linux·运维·服务器
运维小斌2 小时前
ubuntu22.04.5配置ip并使用远程工具连接
linux·运维·网络·ubuntu
爬山算法2 小时前
Netty(29)如何实现基于Netty的长连接和推送通知?
运维·服务器·网络
同聘云2 小时前
腾讯云国际站服务器dns怎么设置?ping网关和DNS的区别在哪里?
服务器·云计算·腾讯云
网安INF2 小时前
电子邮件安全协议详解
网络·网络协议·安全·网络安全
WizLC2 小时前
【后端】面向对象编程是什么(附加几个通用小实例项目)
java·服务器·后端·python·设计语言
云资源服务商2 小时前
阿里云共享带宽实战指南:从入门到性能优化
服务器·网络·阿里云·云计算
HalvmånEver2 小时前
Linux:库制作与原理(四)
linux·运维·服务器
晚风吹人醒.2 小时前
LAMP(Linux+Apache+MySQL+PHP)完整搭建过程
linux·服务器·mysql·centos·php·apache·lamp