当数据发送速度快于处理速度时,套接字将如何操作?
How will a socket act when the data is sent faster than it can be processed?
TCP和sockets的一些细节机制不是很清楚
一个客户端通过TCP连接到服务器,并向服务器发送数据。如果发送速度远大于处理速度会怎样?
比如客户端每秒发送1MiB,但是服务端每秒只能处理1KiB,会不会导致系统内存崩溃?
我知道套接字中有接收缓冲区大小设置 API:
- 如果我设置了缓冲区大小但数据泛滥怎么办?
- 如果我不设置接收缓冲区大小会怎样?
网络层有拥塞控制算法来控制这些情况:-
- 数据包排队和服务策略
- 包丢弃策略等
在传输层 (TCP),某些策略用于摆脱这种情况:-
- 重传政策
- 流量控制策略(在这里您将了解 在 TCP 中滑动 window 协议来控制数据流量)
- 超时判定等
结合以上几点,我希望您已经知道如果客户端试图淹没服务器会发生什么。
根据上述因素,adjusting/sliding 或 window(在传输层)、抖动控制、减载(在网络层)等操作发生,如果:
(i) network/router 充斥着请求,或者 (ii) 传输层 (TCP) 的两个进程之间的数据流不规则且错误。
What happens if the speed of sending is far greater than the speed of processing? For example, if the client sends 1 MiB per second, but the server can only process 1 KiB per second …
如果发送方处于阻塞模式,如果它比接收方超前太多就会阻塞。
如果处于非阻塞模式,send()
将 return -1 与 errno == EAGAIN/EWOULDBLOCK.
Will it cause a system memory crash?
没有
I know there's receive buffer size setting in the sockets API:
- What if I set the buffer size but the data is flooding?
当接收缓冲区已满时,接收主机将通知发送方停止发送。
- What if I don't set the receive buffer size?
您将获得默认尺寸。
简而言之当服务器每秒只能处理1k时,客户端将没有机会每秒发送1M。这有两个原因:
- TCP有慢启动机制
- TCP 有一个 window 机制,其中 TCP 连接的每一方都不断地向另一方通告自己的接收能力。
客户端发送超过广告 window 大小的数据是没有意义的,因为服务器将首先丢弃超出其 window 大小的任何段因此,如果客户端忽略 window 大小,则必须重新发送。
缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级缓冲区,它们不能直接控制 TCP window 大小。如果您不设置这些缓冲区,您将获得套接字级别的默认缓冲区大小。 TCP 根据是否收到大小为 window 的无序数据包进行排队。如果它接收到的数据是有序的,它会触发套接字级别,然后才将数据推送到套接字级别缓冲区中,然后仅用于 space 可用的数量。
如果 TCP 无法将它收到的所有数据推送到套接字缓冲区,那么这将影响计算 TCP window 大小的算法。此计算机制基于 TCP 缓冲区中剩余的字节数。
没有人会崩溃,无论是服务器还是客户端。
在客户端,可以高速发送的客户端,会发生类似的事情,因为 TCP 会根据公布的 window 服务器大小看到它无法在线路上放置太多数据。所以客户端发送缓冲区将填满。如果它已满,客户端套接字将阻塞发送(阻塞模式)或 return 一个错误指示它将阻塞(非阻塞模式)。
所以这不仅说明了发生了什么,而且我还试图解释为什么会发生这些事情以及它是如何实现的。
TCP和sockets的一些细节机制不是很清楚
一个客户端通过TCP连接到服务器,并向服务器发送数据。如果发送速度远大于处理速度会怎样? 比如客户端每秒发送1MiB,但是服务端每秒只能处理1KiB,会不会导致系统内存崩溃?
我知道套接字中有接收缓冲区大小设置 API:
- 如果我设置了缓冲区大小但数据泛滥怎么办?
- 如果我不设置接收缓冲区大小会怎样?
网络层有拥塞控制算法来控制这些情况:-
- 数据包排队和服务策略
- 包丢弃策略等
在传输层 (TCP),某些策略用于摆脱这种情况:-
- 重传政策
- 流量控制策略(在这里您将了解 在 TCP 中滑动 window 协议来控制数据流量)
- 超时判定等
结合以上几点,我希望您已经知道如果客户端试图淹没服务器会发生什么。
根据上述因素,adjusting/sliding 或 window(在传输层)、抖动控制、减载(在网络层)等操作发生,如果:
(i) network/router 充斥着请求,或者 (ii) 传输层 (TCP) 的两个进程之间的数据流不规则且错误。
What happens if the speed of sending is far greater than the speed of processing? For example, if the client sends 1 MiB per second, but the server can only process 1 KiB per second …
如果发送方处于阻塞模式,如果它比接收方超前太多就会阻塞。
如果处于非阻塞模式,send()
将 return -1 与 errno == EAGAIN/EWOULDBLOCK.
Will it cause a system memory crash?
没有
I know there's receive buffer size setting in the sockets API:
- What if I set the buffer size but the data is flooding?
当接收缓冲区已满时,接收主机将通知发送方停止发送。
- What if I don't set the receive buffer size?
您将获得默认尺寸。
简而言之当服务器每秒只能处理1k时,客户端将没有机会每秒发送1M。这有两个原因:
- TCP有慢启动机制
- TCP 有一个 window 机制,其中 TCP 连接的每一方都不断地向另一方通告自己的接收能力。
客户端发送超过广告 window 大小的数据是没有意义的,因为服务器将首先丢弃超出其 window 大小的任何段因此,如果客户端忽略 window 大小,则必须重新发送。
缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级缓冲区,它们不能直接控制 TCP window 大小。如果您不设置这些缓冲区,您将获得套接字级别的默认缓冲区大小。 TCP 根据是否收到大小为 window 的无序数据包进行排队。如果它接收到的数据是有序的,它会触发套接字级别,然后才将数据推送到套接字级别缓冲区中,然后仅用于 space 可用的数量。 如果 TCP 无法将它收到的所有数据推送到套接字缓冲区,那么这将影响计算 TCP window 大小的算法。此计算机制基于 TCP 缓冲区中剩余的字节数。
没有人会崩溃,无论是服务器还是客户端。
在客户端,可以高速发送的客户端,会发生类似的事情,因为 TCP 会根据公布的 window 服务器大小看到它无法在线路上放置太多数据。所以客户端发送缓冲区将填满。如果它已满,客户端套接字将阻塞发送(阻塞模式)或 return 一个错误指示它将阻塞(非阻塞模式)。
所以这不仅说明了发生了什么,而且我还试图解释为什么会发生这些事情以及它是如何实现的。