如果您实现了自己的错误检查,为什么还要使用 TCP 而不是 UDP?
Why would you ever use TCP instead of UDP if you implement your own error checking?
我在网上阅读了很多关于为什么要使用 UDP 或 TCP 的资料,但我仍然需要帮助来理解一些东西。
如果我在我的应用程序中实施错误检查和重新传输,我为什么还要考虑使用 TCP?开发人员利用 TCP 的内置功能而不是在应用层自己实现它们是否更方便?我知道 TCP 包括流量控制,这使得它对网络上的其他服务更友好,但是,如果我是一个自私的混蛋,可以对其他人都该死并希望我的应用程序尽可能快,我不会选择 UDP在每种情况下?
在您的应用程序中重新实现 TCP 的功能是一项艰巨的任务吗?我只是需要帮助来理解为什么,如果 UDP 快得多,那么每个应用程序不会在所有情况下都使用 UDP。
您可以从 UDP 构建您自己的类似 TCP。 Google 正在用 QUIC 做到这一点。他们正试图以一种与互联网兼容的方式修复 TCP 的缺陷,这种方式几乎只剩下 UDP 作为底层传输。
QUIC的主要创新有:
- 多个流。数据包丢失只会延迟单个流。其他人继续。
- 前向纠错,以便在丢包的情况下完全不停止。
如你所见,替代TCP是完全可行和有效的。
很可能不值得。 QUIC 这样做不是为了吞吐量,而是为了延迟。预期的用例肯定是网页浏览。 UDP当然不是"much faster"。为什么会这样? TCP 和 UDP 都可以线速运行,减去一些相当小的开销。
一种流行的混合方案是先通过 UDP 发送数据。如果需要重试,请通过 TCP 重新发送。
I just need help understanding why, if UDP is so much faster, every application doesn't use UDP in every case.
UDP 本身并不快。它甚至可以更慢:
- UDP 是基于数据报的,即每个
send
都会生成一个包含所有相关开销的新数据包。相反,TCP 是基于流的,并尝试通过将多个 send
合并在一起来创建具有最佳大小 (MTU) 的数据包。因此,它通过自动调整实现了更少的开销,而对于 UDP,您需要显式调整才能实现相同的性能。
- 丢包时 TCP 会降低发送速度,这样它就不会丢失更多的数据包。使用 UDP,您要么必须低于线路的最大连接数以确保安全,要么您必须预计会有大量数据包丢失。当然,您可以实施与 TCP 类似的方法,或者您可以实施一个更好的方法,该方法不是通用的,但更适合您的用例。
- UDP 对于短连接可能更快,因为您没有初始握手。但是您仍然需要注意数据包丢失,请参阅 SIP (RFC3261) 以获取有关如何处理此问题的示例。
- UDP 通常用于 audio/video 的实时流式传输。但这并不是因为它更快,而是因为低延迟更重要,而且所使用的编解码器可以处理数据包丢失。在这种情况下,使用 TCP 完成的数据重传是无用的。
- TCP 用于以可靠的方式传输大量数据,就像在 FTP 和 HTTP 中所做的那样。
TCP 提供的不仅仅是错误检查,所以如果您想替换它,还有很多东西需要实现。以下是不分先后顺序想到的一些事情:
1.标准化
您已经编写了自己的传输协议。恭喜!享受自己使用它的乐趣,因为你的是唯一的实现。另一方面,TCP 存在并且在任何平台上都经过了很好的测试。它受防火墙、代理、路由器以及您的流量可能 运行 进入网络的所有其他东西的支持。
2。拥塞控制
这就是您在说“流量控制”时想到的(见下一条)。拥塞控制会限制 TCP 流以响应网络拥塞。但你是个自私的混蛋(这很好!)所以你问为什么要关心。好吧,大部分网络使用的瓶颈是您与提供商之间的 link。您的供应商通常配备齐全,并有网络工程师随时待命。这些人知道如何保护网络免受过度使用以及如何避免热点。所以 TCP 的拥塞控制真正保护了您和您的应用程序,确保单个应用程序不会阻塞整个连接。它有助于确保您不会做任何愚蠢的事情,比如仅仅因为从您的 PC 到路由器的 link 可以支持 1Gbps,就通过您的 50Mbps 连接发送价值 1Gbps 的流量。
3。流量控制
流量控制不是拥塞控制。简而言之,流程控制就是在您无法再处理传入信息时告诉对方闭嘴。想一想移动 phone 试图从附近的 HTTP 服务器加载繁重的网页。服务器可以在 phone 处理它所花费的时间的一小部分内将整个页面转储到网络上。在这种情况下,瓶颈不是网络而是设备之一。您的 TCP 替代方案也必须解决此问题。
4.按顺序发货
除了错误检测之外,TCP 还保证数据以正确的顺序到达。这与错误检测不同,它是一个附加功能。
5.安全
TCP 三向握手和现代操作系统生成初始序列号的方式实际上向双方保证了对方主机的 IP 地址是真实的而不是欺骗性的。情况并非总是如此。当初始序列号很容易预测时,these 攻击就存在了。
此外,实现 TCP 的所有功能很困难,而且复杂性会滋生错误。众所周知,许多 TCP 实现包含各种错误,例如缓冲区溢出,其中一些错误具有严重的安全隐患。希望现在已经找到并修复了所有问题。新协议和新实施总是 运行 引入新安全漏洞的风险。
6.性能
网卡和现代操作系统减轻了应用程序管理 TCP 的负担,而且它们现在做得很好。您想使用自己的序列号和错误检测吗?您必须自己在用户 space 中实现它们(并遭受性能损失,特别是如果您的应用程序是用 Java 之类的东西编写的)或准备编写内核和驱动程序补丁。
此外,现有的 TCP 实现本身已经经过整代工程师的审查和优化。自己打磨出来的东西是很有挑战性的。
无论如何选择 TCP 的另一个原因可能是:
当您需要通过 NAT 路由器进行通信时,使用 TCP 时不必发送那么多 IP 数据包。这样做的原因是,在任何协议上,NAT 路由器都会在一段时间后断开内部和外部网络地址之间的关联(可能是两端都死了)。但是在典型的 NAT 路由器上使用 TCP 超时是在几十分钟内,而在 UDP 上使用相同的超时是在几十秒内。
这对于移动设备尤其重要,因为发送每个数据包都会耗尽电池电量。因此,许多手机更喜欢使用 SIP 协议而非 TCP 连接,而不是使用 UDP。
我在网上阅读了很多关于为什么要使用 UDP 或 TCP 的资料,但我仍然需要帮助来理解一些东西。
如果我在我的应用程序中实施错误检查和重新传输,我为什么还要考虑使用 TCP?开发人员利用 TCP 的内置功能而不是在应用层自己实现它们是否更方便?我知道 TCP 包括流量控制,这使得它对网络上的其他服务更友好,但是,如果我是一个自私的混蛋,可以对其他人都该死并希望我的应用程序尽可能快,我不会选择 UDP在每种情况下?
在您的应用程序中重新实现 TCP 的功能是一项艰巨的任务吗?我只是需要帮助来理解为什么,如果 UDP 快得多,那么每个应用程序不会在所有情况下都使用 UDP。
您可以从 UDP 构建您自己的类似 TCP。 Google 正在用 QUIC 做到这一点。他们正试图以一种与互联网兼容的方式修复 TCP 的缺陷,这种方式几乎只剩下 UDP 作为底层传输。
QUIC的主要创新有:
- 多个流。数据包丢失只会延迟单个流。其他人继续。
- 前向纠错,以便在丢包的情况下完全不停止。
如你所见,替代TCP是完全可行和有效的。
很可能不值得。 QUIC 这样做不是为了吞吐量,而是为了延迟。预期的用例肯定是网页浏览。 UDP当然不是"much faster"。为什么会这样? TCP 和 UDP 都可以线速运行,减去一些相当小的开销。
一种流行的混合方案是先通过 UDP 发送数据。如果需要重试,请通过 TCP 重新发送。
I just need help understanding why, if UDP is so much faster, every application doesn't use UDP in every case.
UDP 本身并不快。它甚至可以更慢:
- UDP 是基于数据报的,即每个
send
都会生成一个包含所有相关开销的新数据包。相反,TCP 是基于流的,并尝试通过将多个send
合并在一起来创建具有最佳大小 (MTU) 的数据包。因此,它通过自动调整实现了更少的开销,而对于 UDP,您需要显式调整才能实现相同的性能。 - 丢包时 TCP 会降低发送速度,这样它就不会丢失更多的数据包。使用 UDP,您要么必须低于线路的最大连接数以确保安全,要么您必须预计会有大量数据包丢失。当然,您可以实施与 TCP 类似的方法,或者您可以实施一个更好的方法,该方法不是通用的,但更适合您的用例。
- UDP 对于短连接可能更快,因为您没有初始握手。但是您仍然需要注意数据包丢失,请参阅 SIP (RFC3261) 以获取有关如何处理此问题的示例。
- UDP 通常用于 audio/video 的实时流式传输。但这并不是因为它更快,而是因为低延迟更重要,而且所使用的编解码器可以处理数据包丢失。在这种情况下,使用 TCP 完成的数据重传是无用的。
- TCP 用于以可靠的方式传输大量数据,就像在 FTP 和 HTTP 中所做的那样。
TCP 提供的不仅仅是错误检查,所以如果您想替换它,还有很多东西需要实现。以下是不分先后顺序想到的一些事情:
1.标准化
您已经编写了自己的传输协议。恭喜!享受自己使用它的乐趣,因为你的是唯一的实现。另一方面,TCP 存在并且在任何平台上都经过了很好的测试。它受防火墙、代理、路由器以及您的流量可能 运行 进入网络的所有其他东西的支持。
2。拥塞控制
这就是您在说“流量控制”时想到的(见下一条)。拥塞控制会限制 TCP 流以响应网络拥塞。但你是个自私的混蛋(这很好!)所以你问为什么要关心。好吧,大部分网络使用的瓶颈是您与提供商之间的 link。您的供应商通常配备齐全,并有网络工程师随时待命。这些人知道如何保护网络免受过度使用以及如何避免热点。所以 TCP 的拥塞控制真正保护了您和您的应用程序,确保单个应用程序不会阻塞整个连接。它有助于确保您不会做任何愚蠢的事情,比如仅仅因为从您的 PC 到路由器的 link 可以支持 1Gbps,就通过您的 50Mbps 连接发送价值 1Gbps 的流量。
3。流量控制
流量控制不是拥塞控制。简而言之,流程控制就是在您无法再处理传入信息时告诉对方闭嘴。想一想移动 phone 试图从附近的 HTTP 服务器加载繁重的网页。服务器可以在 phone 处理它所花费的时间的一小部分内将整个页面转储到网络上。在这种情况下,瓶颈不是网络而是设备之一。您的 TCP 替代方案也必须解决此问题。
4.按顺序发货
除了错误检测之外,TCP 还保证数据以正确的顺序到达。这与错误检测不同,它是一个附加功能。
5.安全
TCP 三向握手和现代操作系统生成初始序列号的方式实际上向双方保证了对方主机的 IP 地址是真实的而不是欺骗性的。情况并非总是如此。当初始序列号很容易预测时,these 攻击就存在了。
此外,实现 TCP 的所有功能很困难,而且复杂性会滋生错误。众所周知,许多 TCP 实现包含各种错误,例如缓冲区溢出,其中一些错误具有严重的安全隐患。希望现在已经找到并修复了所有问题。新协议和新实施总是 运行 引入新安全漏洞的风险。
6.性能
网卡和现代操作系统减轻了应用程序管理 TCP 的负担,而且它们现在做得很好。您想使用自己的序列号和错误检测吗?您必须自己在用户 space 中实现它们(并遭受性能损失,特别是如果您的应用程序是用 Java 之类的东西编写的)或准备编写内核和驱动程序补丁。
此外,现有的 TCP 实现本身已经经过整代工程师的审查和优化。自己打磨出来的东西是很有挑战性的。
无论如何选择 TCP 的另一个原因可能是:
当您需要通过 NAT 路由器进行通信时,使用 TCP 时不必发送那么多 IP 数据包。这样做的原因是,在任何协议上,NAT 路由器都会在一段时间后断开内部和外部网络地址之间的关联(可能是两端都死了)。但是在典型的 NAT 路由器上使用 TCP 超时是在几十分钟内,而在 UDP 上使用相同的超时是在几十秒内。
这对于移动设备尤其重要,因为发送每个数据包都会耗尽电池电量。因此,许多手机更喜欢使用 SIP 协议而非 TCP 连接,而不是使用 UDP。