为什么创建新的TCP连接被视为昂贵?


9

我不明白为什么创建新的TCP连接被认为是一项昂贵的任务。基本上,建立新连接是指执行TCP的3向握手。因此,这将发送两个数据包,而接收一个。考虑到将会有成千上万的(数据)数据包,握手不能成为昂贵的部分。它可以?


也许是由于连接的CPU和内存使用情况?
joeqwerty 2012年

@joeqwerty我知道一个新的TCP连接通常也意味着在例如服务器上创建一个新的进程/线程,但这不是因为TCP,而是由于应用程序。

如果随后有成千上万个数据包,则握手并不是昂贵的部分。但是,为什么不为每个数据块使用新的TCP连接呢?因为创建新的TCP连接非常昂贵。这就是为什么您建立一个连接,然后将其用于数千个数据块的原因。
David Schwartz

1
还应考虑新的连接创建可能不仅限于TCP握手。例如,SSL首先在身份验证和加密细节上增加了很多协商。
Zoredache

Answers:


10

我相信,总的来说,与通过保持打开状态重用已经打开的连接的能力相比,打开TCP连接被认为是昂贵的。没错,打开连接仅需3个数据包/匝,但那时间-RTT的3倍-远远超出了重用已经打开的连接的成本,后者接近0。如果您经常打开和关闭连接。

不过,您肯定是对的,当与应用程序“做某事”时所要看到的匝数相比时,这3个数据包看起来似乎很小,但这又取决于您要如何比较选项,以及您的应用程序的行为/计划打开连接的次数。

编辑 如果我们正在谈论UDP与TCP,那么Cheekaleek在这里是100%正确的-与UDP的无连接操作相比,从长远来看,其开销很大


1
我在数据包跟踪中看到了一个很好的例子:重复使用的MySQL连接可以在2-5毫秒内完成查询。一系列ElasticSearch查询可在17-25毫秒内完成查询,大部分时间是在连接设置中(包括初始DNS查找)。
sysadmin1138

2

这肯定比发送UDP数据包而不关心之后发生的事情要多。

TCP还附带了更多的头数据,并维护了连接状态,这将消耗资源。

因此,是的,与UDP相比,TCP更加昂贵,但是昂贵是一个相对术语。

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


5
"TCP connections are a girl's best friend???" 不,他们不是。我有一个成千上万的女孩在她的生日那天,她所做的一切就是停止退回我的电子邮件。:(
HopelessN00b 2012年

2

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

仅使用一些示例数字(因为我们不谈论任何特定的操作系统),如果已建立会话的数据包的CPU成本为1个单位,那么新会话的成本可能是10倍或100倍于此成本。执行的操作。我使用过的大多数硬件防火墙每秒处理新连接的数量比处理已建立会话的数量少一个数量级。

这通常没什么大不了的,特别是因为SYN-SYN / ACK-ACK是在毫秒内发生的,但是对于拥有许多客户的大型系统而言,新会话可能会变成大量开销。


2

通信量或类型的重要性远小于与实际分配内存和状态信息的关联跟踪相关的代码。如果您想大致了解这意味着什么,请查看Linux内核中与TCP关联的代码量与与UDP或ICMP关联的代码量。令人难以置信的粗略比较表明,TCP需要的内容大约是UDP中代码行数的10倍。

在IP网络中,所需的状态维护量是可伸缩性的最重要决定因素之一。对于TCP端点这表示不仅在SYN / ACK而且在滑动窗口,序列号的日常维护,缓冲区管理和QoS动作,等退房的FSM的复杂性TCP,并考虑在UDP缺乏内在的相同...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.