当套接字发送的数据快于其处理速度时,套接字将如何操作?

Jun*_*Jun 3 sockets networking network-programming tcp flow-control

我不太清楚TCP和套接字的一些详细机制。

一个客户端通过TCP连接到服务器,然后将数据发送到服务器。如果发送速度远大于处理速度会怎样?例如,如果客户端每秒发送1 MiB,但服务器每秒只能处理1 KiB,这会导致系统内存崩溃吗?

我知道套接字API中有接收缓冲区大小设置:

  1. 如果我设置了缓冲区大小,但数据却泛滥怎么办?
  2. 如果我没有设置接收缓冲区大小怎么办?

Phi*_*yck 6

简而言之,当服务器每秒只能处理1k时,客户端将没有机会每秒发送1M。这有两个原因:

  • TCP的启动机制很慢
  • TCP具有窗口机制,其中TCP连接的每一侧都不断向另一侧通告自己的接收能力。

客户端发送超出广告窗口大小的数据是没有意义的,因为服务器首先会丢弃超出其窗口大小的所有段,因此如果客户端忽略该消息,则必须重新发送。窗口大小。

缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级别的缓冲区,它们不能直接控制TCP窗口大小。如果不设置这些缓冲区,则会在套接字级别获得默认的缓冲区大小。TCP是否在排队,取决于是否接收到窗口大小不正确的数据包。如果它接收到的数据是有序的,它将触发套接字级别,然后才将数据推入套接字级别的缓冲区中,然后再推入足够的可用空间。如果TCP无法将其收到的所有数据推送到套接字缓冲区中,那么这将对计算TCP窗口大小的算法产生影响。此计算机制基于TCP缓冲区中剩余的字节数。

服务器和客户端都不会崩溃。

在客户端,可以高速发送的客户端发生了类似的事情,这是因为TCP将基于服务器的通告窗口大小看到它无法在网络上放置大量数据。因此客户端发送缓冲区将被填满。如果已满,则客户端套接字将以发送状态(阻塞模式)阻塞或返回一个错误消息,表明它将阻塞(非阻塞模式)。

因此,这不仅说明发生了什么,而且我还试图解释了为什么发生这些事情以及如何实现这些事情。

  • 您可以通过表达感激;-) (2认同)