区别¶
- TCP 是面向连接的,UDP 是无连接的
- TCP 是可靠的,UDP 是不可靠的
- TCP 是面向字节流的,UDP 是面向数据报文的
- TCP 只支持点对点通信,UDP 支持一对一,一对多,多对多
- TCP 报文首部 20 个字节,UDP 首部 8 个字节
- TCP 有拥塞控制机制,UDP 没有
- TCP 协议下双方发送接受缓冲区都有,UDP 并无实际意义上的发送缓冲区,但是存在接受缓冲区
使用途径¶
对某些实时性要求比较高的情况,选择 UDP,比如游戏,媒体通信,实时视频流(直播),即使出现传输错误也可以容忍;其它大部分情况下,HTTP 都是用 TCP,因为要求传输的内容可靠,不出现丢失
TCP 对数据可靠性的保证¶
TCP 使用以下方式保证自身发送接受数据可靠 1. 数据包校验(16 为数据校验和)防止发送过来的数据是错误数据 2. 确认序列号,对失序报文进行重排 3. 丢弃重复数据包,防止数据冗余重复 4. 确认应答机制,接收方接受数据之后会发送一个确认 5. 超时重传机制,发送方发出数据后会启动一个定时器,超过该定时器时间依旧未收到对方确认,便会重新发送该数据 6. 流量控制(16 位窗口大小)确保接收方收到的数据在自身缓冲区中不会溢出 7. 拥塞控制,保证数据在网络中传播的可靠性,降低丢包的概率,提高 TCP 的可靠性
拥塞控制¶
作用于网络,防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是: (1 )慢开始、拥塞避免(cwnd++,ssthresh 减半)--滑动窗口 (2 )快重传(三个重复 ACK)、快恢复(乘法减小,但只有超时和建立连接才慢开始,重复则是 cwnd 缓慢增大)。
流量控制¶
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
UDP 如何变得可靠--KCP¶
KCP】从零开始深入理解 KCP 原理(含 TCP 可靠机制原理), 及源码解析。-CSDN 博客
ARQ¶
- 停等式 ARQ(stop-and-wait)
- 确认机制
- 超时重传
- 连续 ARQ(由于停止等待 ARQ 协议信道利用率太低,采用流水线传输)
- 回退 n 帧(go-back-n):从错误开始,全部重新发送--TCP
- 选择重传:只重传真正丢失的分组--KCP
- 滑动窗口协议
接下来看一下 KCP 和 TCP 的对比¶
来自官方对比
- 选择性重传 vs 全部重传:
TCP 丢包时会全部重传从丢的那个包开始以后的数据,KCP 是选择性重传,只重传真正丢失的数据包。(也就是 TCP 采用的是 回退 n 帧,而 KCP 采用的 选择性重传)
- 快速重传:
发送端发送了 1,2,3,4,5 几个包,然后收到远端的 ACK: 1,3, 4,5,当收到 ACK3 时,KCP 知道 2 被跳过 1 次,收到 ACK4 时,知道 2 被跳过了 2 次,此时可以认为 2 号丢失,不用等超时,直接重传 2 号包,大大改善了丢包时的传输速度。(两次)
- 延迟 ACK vs 非延迟 ACK
TCP 为了充分利用带宽,延迟发送 ACK(NODELAY 都没用),这样超时计算会算出较大 RTT 时间,延长了丢包时的判断过程。KCP 的 ACK 是否延迟发送可以调节。
- UNA vs ACK+UNA
ARQ 模型响应有两种,UNA(此编号前所有包已收到,如 TCP)和 ACK(该编号包已收到),光用 UNA 将导致全部重传,光用 ACK 则丢失成本太高,以往协议都是二选其一,而 KCP 协议中,除去单独的 ACK 包外,所有包都有 UNA 信息。
- 非退让流控
KCP 正常模式同 TCP 一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着 BT 都能流畅传输的效果。