Jun*_*Jun 3 sockets networking network-programming tcp flow-control
我不太清楚TCP和套接字的一些详细机制。
一个客户端通过TCP连接到服务器,然后将数据发送到服务器。如果发送速度远大于处理速度会怎样?例如,如果客户端每秒发送1 MiB,但服务器每秒只能处理1 KiB,这会导致系统内存崩溃吗?
我知道套接字API中有接收缓冲区大小设置:
简而言之,当服务器每秒只能处理1k时,客户端将没有机会每秒发送1M。这有两个原因:
客户端发送超出广告窗口大小的数据是没有意义的,因为服务器首先会丢弃超出其窗口大小的所有段,因此如果客户端忽略该消息,则必须重新发送。窗口大小。
缓冲区位于不同的层中。您可以通过套接字选项设置的缓冲区是套接字级别的缓冲区,它们不能直接控制TCP窗口大小。如果不设置这些缓冲区,则会在套接字级别获得默认的缓冲区大小。TCP是否在排队,取决于是否接收到窗口大小不正确的数据包。如果它接收到的数据是有序的,它将触发套接字级别,然后才将数据推入套接字级别的缓冲区中,然后再推入足够的可用空间。如果TCP无法将其收到的所有数据推送到套接字缓冲区中,那么这将对计算TCP窗口大小的算法产生影响。此计算机制基于TCP缓冲区中剩余的字节数。
服务器和客户端都不会崩溃。
在客户端,可以高速发送的客户端发生了类似的事情,这是因为TCP将基于服务器的通告窗口大小看到它无法在网络上放置大量数据。因此客户端发送缓冲区将被填满。如果已满,则客户端套接字将以发送状态(阻塞模式)阻塞或返回一个错误消息,表明它将阻塞(非阻塞模式)。
因此,这不仅说明发生了什么,而且我还试图解释了为什么发生这些事情以及如何实现这些事情。
| 归档时间: |
|
| 查看次数: |
1891 次 |
| 最近记录: |