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除了可靠传输和流量控制,还有一个拥塞控制,下一节见~