我不明白为什么创建新的 TCP 连接被认为是一项昂贵的任务。基本上,建立新连接是指执行 TCP 的三次握手。因此,这相当于发送两个数据包并接收一个数据包。考虑到随后将有数千个(数据)数据包,握手不可能是昂贵的部分。是吗?
答案1
我认为,一般来说,与通过保持打开状态来重用已打开的连接相比,打开 TCP 连接的成本更高。您说得对,打开连接只需要 3 个数据包/回合,但这段时间(3 倍于您的 RTT)远远超过了重用已打开连接的成本,后者更接近于 0。如果您频繁打开和关闭连接,这种差异会增长得更快。
不过,您当然是正确的,当与应用程序“执行其操作”时您将看到的转弯次数相比时,这 3 个数据包似乎非常小,但同样,这取决于您想如何比较选项以及您的应用程序如何运行/您计划打开连接的次数。
编辑 如果我们讨论的是 UDP 与 TCP,那么 Cheekaleek 的说法 100% 正确 - 与 UDP 的无连接操作相比,从长远来看,TCP 的开销是巨大的
答案2
这肯定比发送 UDP 数据包并且不关心之后发生什么的开销更大。
TCP还带有较多的报头数据,并维护连接状态,这些都会消耗资源。
所以是的,与 UDP 相比,TCP 更昂贵,但昂贵是一个相对的术语。
“TCP 连接是女孩最好的朋友???”
答案3
这不仅仅是发送和接收数据包。还必须分配额外的内存,并且至少在会话建立之前的每个步骤中更新网络状态表。更不用说可能执行的任何额外安全检查(路由欺骗保护等)。
仅使用一些示例数字(因为我们不讨论任何特定的操作系统),如果已建立会话的数据包的 CPU 成本为 1 个单位,则新会话的成本可能是执行操作数成本的 10 倍或 100 倍。我使用过的大多数硬件防火墙每秒处理的新连接数比处理已建立会话的数量少一个数量级。
这通常不是什么大问题,特别是因为 SYN-SYN/ACK-ACK 发生在几毫秒内,但对于拥有许多客户的大型系统来说,新的会话可能会变成重要的高架。
答案4
流量的数量或类型远不如实际分配内存和跟踪状态信息的代码重要。如果您想大致了解这意味着什么,请查看 Linux 内核中与 TCP 相关的代码量与与 UDP 或 ICMP 相关的代码量。一个非常粗略的比较显示,TCP 所需的代码行数是 UDP 的 10 倍左右。
在 IP 网络中,所需的状态维护量是可扩展性的最重要决定因素之一。对于 TCP 端点,这不仅体现在 SYN/ACK 中,还体现在滑动窗口、序列号、缓冲区管理和 QoS 操作等的持续维护中。查看 FSM 的复杂性传输控制协议并考虑到 UDP 中固有的相同缺陷......