为什么创build一个新的TCP连接被认为是昂贵的?

我不明白为什么创build一个新的TCP连接被认为是一个昂贵的任务。 基本上build立一个新的连接是指执行TCP的三次握手。 所以这是发送两个数据包,接收一个。 考虑到数以千计的(数据)数据包将随之而来,握手不可能是昂贵的部分。 它可以?

我相信,一般来说,打开一个TCP连接与通过保持打开状态来重新使用已经打开的连接的能力相比是很昂贵的。 你是正确的,打开一个连接只需要3个数据包/转,但是那个时间 – 你的RTT的3倍 – 远远超出了重用已经打开的连接的成本,这个连接已经接近于0了。如果你经常打开和closures连接。

你当然是正确的,但是与应用程序“看起来是这样”的转换次数相比,这3个数据包看起来很小,但这又取决于你想如何比较选项和您的应用程序的行为/您计划打开连接的次数。

编辑如果我们正在谈论UDP与TCP,Cheekaleek在这里是100%正确的 – 与UDP的无连接操作相比,长期的开销是巨大的

这肯定比发送一个UDP数据包花费更多,并且不关心过去发生的事情。

TCP也带有更多的头部数据,并保持连接状态,这将消耗资源。

所以是的,与UDP相比,TCP更昂贵,但昂贵是相对的术语。

“TCP连接是女孩最好的朋友?

这不仅仅是发送和接收数据包。 必须分配额外的内存,并在每个步骤更新最less的networking状态表,直到会话build立。 更不用说可能执行的任何额外的安全检查(路由欺骗保护等)。

仅仅使用一些示例数字(因为我们没有谈论任何特定的操作系统),如果一个已build立会话的数据包的CPU成本为1个单元,新会话的成本可能是10x或100x,执行的操作。 我所使用的大多数硬件防火墙每秒处理新连接的数量比处理已build立会话的处理量要less一个数量级。

这往往不是什么大事,尤其是因为SYN-SYN / ACK-ACK在几毫秒内就会发生,但对于有大量客户的新系统的大型系统而言,这可能会变成巨大的开销。

stream量的数量或types比与实际分配内存相关的代码和状态信息的相关跟踪要重要得多。 如果您想对这意味着什么有一个粗略的理解,请查看与TCP关联的Linux内核与UDP或ICMP关联的代码量。 一个令人难以置信的粗略的比较显示,TCP需要的东西是在UDP中find的代码行数的10倍。

在IPnetworking中,所需的状态维护量是可扩展性最重要的决定因素之一。 对于TCP端点,这不仅表示在SYN / ACK中,还表示在滑动窗口,序列号,缓冲区pipe理和QoS动作等的持续维护中。检查TCP的FSM的复杂性并考虑UDP中固有的缺乏…