.net Socket send vs sendwords,什么时候发送会阻塞?

4sup72z8  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(115)

阅读MSDN页面,很明显,如果套接字传输层中没有内部缓冲区,发送将阻塞。这实际上是一件好事,因为我不希望出现NoBufferSpaceAvailable错误。我的理解是,传输缓冲区空间相当大,但如果发送节流的东西,以防止这些错误,我很高兴。
但是,不清楚还有什么会导致发送阻塞。我的猜测是,它不会阻止等待发送的ACK,并且发送将只是将数据排队到传输缓冲区并返回。
如果一个发送真的阻塞了,直到一个特定的套接字实际上完全阻塞了,直到传输完成,这将是一件非常糟糕的事情。如果是这种情况,那么1000个连接中的一个缓慢连接可能会减慢整个发送过程。在这种情况下,SendAsync真的是强制性的。
有人知道更多细节吗?

u5i3ibmn

u5i3ibmn1#

正如EJP所说,发送缓冲区负责处理任何未确认的数据,也就是说,您发送的任何数据都将保留在缓冲区中,直到接收方确认。这是为了在ACK永远不会到达数据包的情况下,允许稍后重新发送数据。
此外,正如EJP所说,每当收到ACK时,刚刚收到ACK的数据就会从发送缓冲区中删除,空间被释放出来,以便您可以将其用于进一步的发送。
然而,在发送大量数据的情况下,并且ACK返回缓慢(由于高延迟、嘈杂的连接或仅仅是沿途的断开沿着),则发送缓冲器将被填满,并且最终将由于缺少发送缓冲器空间而导致发送阻塞。
因此,未确认的数据本身不会直接导致发送阻塞,但如果您发送大量数据,并且存在网络问题,这意味着ACK无法返回给您,那么是的......未确认的数据将最终导致发送阻塞。这是正确的行为。
你不想永远发送数据,而不接收ACK。如果你真的想这样做,那么你可能会使用UDP而不是TCP:)
编辑:此外,每个连接使用一个线程并不罕见,以避免您提到的一个坏连接可能影响一千个的特定情况。如果你担心伸缩性,你可能无论如何都应该使用异步调用。

y0u0uwnf

y0u0uwnf2#

TCP发送不会阻止等待该发送的ACK被接收。这就是缓冲的作用。发送被缓冲,并且仅在缓冲区满时阻塞。同时,TCP异步地将缓冲区的内容发送给对等体,并在它们被ACK时丢弃它们。

相关问题