创建TCP连接的一般开销

sea*_*and 13 sockets networking tcp

与UDP相比,我想知道创建新连接的一般成本.我知道TCP需要初始交换数据包(3次握手).什么是其他费用?例如,在设置缓冲区等内核中是否存在某种神奇的东西?

我问的原因是我可以保持现有连接打开并根据需要重用它.但是,如果重新连接的开销很小,则会降低复杂性.

Mar*_*c B 11

一旦UDP数据包被转储到线路上,UDP协议栈就可以完全忘记了它.使用TCP,至少有连接细节(源/目标端口和源/目标IP),序列号,连接的窗口大小等......这不是一个庞大的数据量,但在繁忙的服务器有很多连接.

然后还有3次握手.一些脑卒(和/或恶意系统)可以滥用该过程(查找"同步泛滥"),或者只是将连接断开,让您的系统等待响应或关闭通知永远不会发生.好的一面是,通过TCP,系统将尽最大努力确保数据包到达必要的位置.使用UDP,根本没有任何保证.


use*_*421 7

与数据包交换的延迟相比,所有其他成本(如内核设置时间)都是微不足道的.


Kev*_*ice 5

选项1:创建TCP连接的一般成本是:

  1. 创建套接字连接
  2. 发送数据
  3. 撕下插座连接

步骤1:需要交换数据包,因此延迟了网络延迟加上目标服务器的服务时间.两个盒子都没有显着的CPU使用率.

第2步:取决于邮件的大小.

步骤3:IIRC,只发送一个'立​​即关闭'数据包,无需等待目标确认,因此不涉及延迟.

方案2:UDP的成本:*

  1. 创建UDP对象
  2. 发送数据
  3. 关闭UDP对象

第1步:需要最少的设置,没有延迟担忧,非常快.

步骤2:小心小,UDP中没有重传,因为它不关心数据包是否被任何人接收.我听说消息越大,数据被接收损坏的可能性就越大,而且经验法则是你会丢失超过20 MB的一定比例的消息.

第3步:最少的工作,最短的时间.

选项3:使用ZeroMQ代替

您将TCP与UDP进行比较,目标是减少重新连接时间.有一个很好的妥协:ZeroMQ套接字.

ZMQ允许您设置一个发布套接字,您不关心是否有人在监听(如UDP),并且在该套接字上有多个侦听器.这不是UDP套接字 - 它是这两种协议的替代品.

有关详细信息,请参阅: ZeroMQ.org.

它具有极高的速度和容错能力,并且出于这些原因在金融行业中的使用越来越多.

  • 我不知道你在哪里获得了20MB的UDP号码.根据维基百科的说法,在IPV4中,最大消息大小为65,507字节(65,535 - 8字节UDP报头--20字节IP报头).也许你正在假设IPV6? (2认同)
  • UDP没有大于单个64k数据报的消息概念,因为UDP报头中的大小字段是16位(https://tools.ietf.org/html/rfc768).这通常大于底层传输层的MTU,因此IP可能会碎片化并重新组装64k数据包.如果任何片段丢失,则整个数据包丢失,因此不建议超过MTU.20MB消息需要UDP上的更高级别协议或TCP之类的其他协议.如果您有更大的消息参考,我有兴趣阅读它. (2认同)