冲洗插座是啥意思?

Posted

技术标签:

【中文标题】冲洗插座是啥意思?【英文标题】:What does it mean to flush a socket?冲洗插座是什么意思? 【发布时间】:2010-10-29 04:41:06 【问题描述】:

除了如何像文件一样读写套接字之外,我对套接字的了解并不多。我对使用套接字选择器有所了解。我不明白为什么你必须刷新一个套接字,那里到底发生了什么?这些位只是在记忆中的某个地方闲逛,直到它们被推开?我在网上看了一些关于套接字的东西,但都是非常抽象和高级的。

这里到底发生了什么?

【问题讨论】:

【参考方案1】:

写入网络套接字和发送数据会产生一定的开销。如果每次字节进入套接字时都发送数据,那么对于实际数据的每个字节,您最终会得到 40 多个字节的 TCP 标头。 (当然,假设您使用的是 TCP 套接字。其他套接字将具有不同的值)。为了避免这种低效率,套接字维护了一个本地缓冲区,该缓冲区通常超过 1000 字节。当该缓冲区被填满时,数据包会包裹一个标头,并将数据包发送到其目的地。

在许多情况下,您不需要立即发送每个数据包;如果您正在传输文件,如果没有文件的最终数据,早期数据可能没有任何用处,因此效果很好。但是,如果您需要强制立即发送数据,则刷新缓冲区将发送任何尚未发送的数据。

请注意,当您关闭套接字时,它会自动刷新所有剩余数据,因此无需在关闭之前刷新。

【讨论】:

NAGL 是如何与此联系在一起的,你知道吗?【参考方案2】:

你不能真正刷新套接字。

(来自How can I force a socket to send the data in its buffer?)

你不能强迫它。时期。 TCP 自己决定何时 可以发送数据。现在,通常当您在 TCP 套接字上调用 write() 时, TCP确实会发送一个段,但没有保证也没有办法 强迫这个。 TCP不发送a的原因有很多 段:关闭窗口和 Nagle 算法是两件事 马上就想到了。

阅读完整的帖子,它非常深入,为我澄清了很多事情。

【讨论】:

【参考方案3】:

Nagle 的算法经常用于套接字。简而言之,它一直等到有大量数据要发送。问题是要在传输延迟和发送数据包的开销成本之间取得平衡。

数据负载越大,浪费的带宽就越小,因为标头(大部分)是固定大小的。此外,中间系统的性能限制通常更明显地基于数据包速率,而不是整体数据速率。

【讨论】:

这个答案并没有真正解决冲洗套接字的关系。 这个答案与这个问题有什么关系。刷新会覆盖 Nagle 的算法并立即发送吗?【参考方案4】:

我没有使用flush 进行套接字编程。我确实记得在某处可以设置一些模式,其中面向流的发送尝试减少发送的小数据包的数量。但是,您将使用 sendall() 来确保发送缓冲区中的所有内容。

shutdown() 函数在您进行后台处理时非常有用。当然,如果您不想让东西闲逛,您必须使用 close() 调用。

查看Beej's guide 了解更多信息。

【讨论】:

sendall() 和 flush() 一样

以上是关于冲洗插座是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

socket是啥意思

我可以强制冲洗 CAN 总线插座吗

usb slave 是啥?

请问,交换机的电源有的说成支持N+M冗余电源,那么请问,N+M是啥意思呢?

PPPoE是啥意思,PPPoE是啥意思

“?”是啥意思?在 Erlang 中是啥意思? [复制]