我不太清楚TCP和套接字的一些细节机制。
一个客户端通过TCP连接到服务器,并将数据发送到服务器。如果发送速度远远大于处理速度会怎样? 例如,如果客户端每秒发送1MiB,但服务器每秒只能处理1 KiB,是否会导致系统内存崩溃?
我知道套接字API中有接收缓冲区大小设置:
答案 0 :(得分:4)
简而言之,当服务器每秒只能处理1k时,客户端将无法每秒发送1M。这有两个原因:
客户端发送的数据超过广告窗口大小是没有意义的,因为服务器将首先丢弃超出其窗口大小的任何段,因此客户端必须重新发送(如果是忽略窗口大小。
缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级缓冲区,它们不能直接控制TCP窗口大小。如果您没有设置这些缓冲区,则会在套接字级别获得默认缓冲区大小。 TCP正在排队,具体取决于是否接收到窗口大小的乱序数据包。如果它接收到有序的数据,它会触发套接字级别,然后只将数据推送到套接字级别缓冲区,然后只有可用空间的数量。 如果TCP无法推送它在套接字缓冲区上收到的所有数据,那么这将对计算TCP窗口大小的算法产生影响。此计算机制基于TCP缓冲区中剩余的字节数。
没有人会崩溃,无论是服务器还是客户端。
在客户端,可以高速发送的那个,类似的事情发生是因为TCP将根据服务器的广告窗口大小看到它无法在线路上放置太多数据。所以客户端发送缓冲区将填满。如果它已满,则客户端套接字将阻塞发送(阻塞模式)或返回它将阻止的错误指示(非阻塞模式)。
所以这不只是说会发生什么,但我也试图解释为什么会发生这些事情以及如何实施。
答案 1 :(得分:2)
如果发送速度远远大于处理速度会怎样?例如,如果客户端每秒发送1 MiB,但服务器每秒只能处理1 KiB ......
如果发送方处于阻止模式,如果发送方远远超过接收方,它将阻止。
如果它处于非阻止模式,send()
将返回-1 errno == EAGAIN/EWOULDBLOCK.
是否会导致系统内存崩溃?
没有
我知道套接字API中有接收缓冲区大小设置:
- 如果我设置缓冲区大小但数据泛滥怎么办?
醇>
当接收缓冲区已满时,接收主机将告诉发送方停止发送。
- 如果我没有设置接收缓冲区大小怎么办?
醇>
您将获得默认尺寸。
答案 2 :(得分:-1)
网络层中存在用于控制这些情况的拥塞控制算法: -
在传输层(TCP),使用某些策略来摆脱这种情况: -
基于以上几点,我希望你可能已经知道如果客户端试图淹没服务器会发生什么。
如果出现以下因素,则会根据以上因素调整/滑动窗口(在传输层),抖动控制,减载(在网络层)等操作:
(i)网络/路由器充满了请求,或者(ii)数据流在传输层(TCP)的两个进程之间是不规则和错误的。