首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tcp或udp,另一个比较

tcp或udp,另一个比较
EN

Stack Overflow用户
提问于 2012-02-10 22:17:16
回答 1查看 1K关注 0票数 1

考虑每秒数千次请求的缓存应用程序,其中客户端使用整数索引请求对象,服务器将对象发回给它。(仅Linux)

对于UDP协议来说,什么会更快:

  • 在一个包中发送多个答复?
  • 在一个数据包中发送一个答复?

(适用于双方、服务器或客户端)

缺点:

每个数据包的

  • 多个回复:

代码语言:javascript
复制
- many memcpy()s will be needed to assemble packet with multiple replies. If a get() request returns to the client 16 byte objects, a single packet of 65535 bytes would have to memcpy() about 4000 objects before issuing sendto() system call. _memcpy() is costly_
- An UDP packet of 65000 bytes will generate about 43 udp packet headers     since the packet will be transmitted in fragmetns, due to 1500 default MTU size. _not a big overhead_

每个数据包的

  • 单应答:
    • 每个get()将导致28字节的协议开销。对于一个16字节的对象来说,这将是非常昂贵的。每秒的对象吞吐量将很低,网络将被数据包所饱和。例如,发送4000个对象将生成4000个udp数据包报头,有条件地超过43个具有多个答复的标头。此外,过多的sendto() syscalls也会增加CPU消耗,因为内核必须在每个syscall.

上保存CPU寄存器。

这两种方法都有各自的缺点,目前还不清楚哪种解决方案更好,然而,千兆以太网的时钟运行在1 GHz,而处理器是3 GHz,内存总线也比以太网接口的双绞线宽得多。因此,每个数据包多个回复将是更好的选择,因为额外的memcpy()将减少网络流量,对吗?

现在,如果我们使用TCP而不是UDP:

每个包的

  • 多个答复:再次指出,组装该包需要许多memcpy()s,该包不应大于65535,然后由内核将其碎片化,以MTU大小的数据包发送,与UDP 不存在太大差异。

每个包的

  • 单应答:
    • ,因为我们的16个字节对象是随机分布在服务器内存中的,所以我们必须向每个对象发出写() syscall,与udp单个请求的情况相同。
    • 每个get()将导致52字节的开销,因为有更大的头+我们将不得不向另一个ACK数据包的开销,即40字节。更大的网络traffic

结论:

这个特定应用程序的

  1. (从客户机提供的索引向客户机发送简单的数据块) TCP的性能不会比UDP更好。+考虑TCP栈的实现比UDP复杂得多,在那里执行的指令更多。使协议运行更快的全部要点是将UDP数据包组装到MTU上,因为possible.
  2. The向系统中添加另一个NIC的成本低于添加另一个。降低memcpy()的数量是有意义的,但是发送一堆小的UDP数据包,并为网络端的每个udp头的开销支付额外费用(通过执行许多sendto()系统来增加一些开销,我认为这些开销将低于memcpy()的开销),因为这样一个CPU就可以通过多个NICs

发送请求。

非常感谢您对协议选择的意见和经验。

注意:让我们把可靠性问题放在一边,假设我们的网络是无错误的,如果你正确地连接它们,这在大多数情况下都是正确的,如果发生错误,这肯定不是正常的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-10 22:56:13

这里有一些不准确的陈述,并且稍微改变了画面:

  1. 多个对象不需要多个write()系统调用,您可以使用writev()来满足这一需求。(对UDP和TCP都有好处)
  2. 发送带有UDP的65K字节缓冲区不会创建UDP的多个头,只创建一个UDP报头的多个IP头。此外,对于今天的1 1Gbit /s,您可以使用jambo帧并增加MTU (超过1500),如果这是针对专用网络的话。
  3. for TCP,发送一个带有写()/Send()的对象并不一定会生成一个数据包,很可能它会等待您填充MSS,然后再分派几个对象,记住它是一个流,它没有UDP所具有的数据包边界。
  4. 您不能假设可靠性、顺序和负载,这使得UDP更难管理。当服务器或客户端开始超载流量时,TCP将处理连接。使用UDP,您将必须检测此类病例并作出反应。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9235592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档