您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在此用例中,TCP_CORK和TCP_NODELAY是否有显着差异?

在此用例中,TCP_CORK和TCP_NODELAY是否有显着差异?

您有两个问题:

他们一定有某种理由感到不足,这导致他们引入了新的专有TCP_CORK标志。谁能解释这个原因是什么?

表示在您获取数据后立即发送数据(部分帧),而不管您是否有足够的帧容纳完整的网络数据包。

这意味着在第一个示例的给定用例中,直到结束都不会发送部分帧,但是在第二个示例中,将发送带有接收确认的部分帧。

同样,在您的第一个示例中,最后一次发送Nagle的算法仍然适用于拔瓶后的部分帧,而在第二个示例中则不适用。

简短的版本是TCP_NODELAY发送时不会在发送之前累积逻辑数据包,然后将其作为网络数据包,Nagle的算法根据算法进行操作,TCP_CORK根据应用程序对其进行设置。

这样做的副作用是Nagle的算法将在空闲连接上发送部分帧,而TCP_CORK不会。

另外,TCP_CORK在2.2(特别是2.1.127,请参阅此处)中引入了Linux内核,但是直到2.5.71,它与TCP_NODELAY互斥。例如,在2.4内核中,您可以使用其中之一,但在2.6中,您可以将两者结合使用,并且在应用TCP_CORK时会优先使用。

关于第二个问题。

引用莱纳斯·托瓦尔兹(Linus Torvalds)

现在,TCP_CORK基本上是告诉我大卫米勒,我拒绝玩游戏以具有良好的数据包大小分布,并且我想让应用程序仅告诉操作系统一种方法:我想要大数据包,请等待,直到从中获取足够的数据为止。我可以做成大包。

基本上,TCP_CORK是一种“ anti-nagle”标志。这是“无-”的反面。

Linus的另一句话是关于TCP_CORK的用法,如下所示

基本上,只要服务器知道其批量传输的模式,TCP_CORK就会很有用。使用任何类型的文件服务,这几乎都是100%的时间。

有关更多报价,请参见“ Sendfile邮件列表讨论”的链接

总之,除了在调用writev时使用TCP_MAXSEG和MSGMORE之外,TCP_CORK是另一个工具,它允许用户空间中的应用程序对数据包大小分布进行更精细的控制。

Node 2022/1/1 18:14:44 有562人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶