TCP协议详解三:数据的传输及滑动窗口协议
数据的传输
1. tcp传输的数据分类
- 成块数据传输:量大,报文段常常满
- 交互数据传输:量小,报文段为微小分组,大量微小分组,在广域网传输会增加拥堵的出现
- tcp处理的数据包括两类,有不同的特点,需要不同的传输技术
2. 交互数据的传输技术
2.1 经受时延的确认
- 概念:tcp收到数据时,并不立马发送ack确认,而是稍后发送
- 目的:将ack与需要沿该方向发送的数据一起发送,以减少开销
- 特点:接收方不必确认每一个收到的分组,ACk是累计的,它表示接收方已经正确收到了一直到确认序号-1的所有字节
- 延时时间:绝大多数为200ms。不能超过500ms
2.2 Nagle算法
- 解决什么问题:微小分组导致在广域网出现的拥堵问题
- 核心:减少了通过广域网传输的小分组数目
- 原理:要求一个tcp连接上最多只能有一个未被确认的未完成的分组,该分组的确认到达之前,不能发送其他分组。tcp收集这些分组,确认到来之前以一个分组的形式发出去
- 优点:自适应。确认到达的快,数据发送越快。确认慢,发送更少的组。
- 使用注意:局域网很少使用该算法。且有些特殊场景需要禁用该算法
3. 成块数据的传输
- 主要使用滑动窗口协议
滑动窗口协议
1. 概述
- 解决了什么问题:发送方和接收方速率不匹配时,保证可靠传输和包乱序的问题
- 机制:接收方根据目前缓冲区大小,通知发送方目前能接收的最大值。发送方根据接收方的处理能力来发送数据。通过这种协调机制,防止接收端处理不过来。
- 窗口大小:接收方发给发送端的这个值称为窗口大小
2. tcp缓冲区的数据结构
- 接收端:
- LastByteRead: 缓冲区读取到的位置
- NextByteExpected:收到的连续包的最后一个位置
- LastByteRcvd:收到的包的最后一个位置
- 中间空白区:数据没有到达
- 发送端:
- LastByteAcked: 被接收端ack的位置,表示成功发送确认
- LastByteSent:发出去了,还没有收到成功确认的Ack
- LastByteWritten:上层应用正在写的地方
3. 滑动窗口示意图
3.1 初始时示意图
- 黑框表示滑动窗口
- #1表示收到ack确认的数据
- #2表示还没收到ack的数据
- #3表示在窗口中还没有发出的(接收方还有空间)
- #4窗口以外的数据(接收方没空间)
3.2 滑动过程示意图
- 收到36的ack,并发出46-51的字节
4. 拥塞窗口
- 解决什么问题:发送方发送速度过快,导致中转路由器拥堵的问题
- 机制:发送方增加一个拥塞窗口(cwnd),每次受到ack,窗口值加1。发送时,取拥塞窗口和接收方发来的窗口大小取最小值发送
- 起到发送方流量控制的作用
5. 滑动窗口会引发的问题
5.1 零窗口
- 如何发生: 接收端处理速度慢,发送端发送速度快。窗口大小慢慢被调为0
- 如何解决:ZWP技术。发送zwp包给接收方,让接收方ack他的窗口大小。
5.2 糊涂窗口综合征
- 如何发生:接收方太忙,取不完数据,导致发送方越来越小。最后只让发送方传几字节的数据。
- 缺点:数据比tcp和ip头小太多,网络利用率太低。
- 如何解决:避免对小的窗口大小做响应。
- 发送端:前面说到的Nagle算法。
- 接收端:窗口大小小于某个值,直接ack(0),阻止发送数据。窗口变大后再发。
作者:kinnylee
来源:掘金
THE END