UDP数据包是短暂的还是服务器会在读取之前保留收到的数据包?

时间:2014-03-24 20:58:28

标签: networking udp

我有一个可以在我的数据库上运行的后端进程。这是在一台单独的计算机上使用,这样前端就能创造奇迹(至少在速度方面)。该后端进程创建一个UDP服务器并在其上侦听数据包。

在前端计算机上,我从服务器创建子进程。每个孩子都可以在数据库中创建需要后端做更多工作的数据。为了让后端知道,我使用UDP客户端连接发送PING。

  Front End / Backend Setup                        Processing

+-------+         +---------+                     +----------+
|       |         |         |                     | Internet |
| Front |  PING   | Backend |                     | Client   |
|  End  |-------->|         |                     +----------+
|       |         |         |              HTTP Request | 
+-------+         +---------+                           v
    ^                  ^                          +----------+
    |                  |                          | FrontEnd |--------+
    |                  |                          +----------+   PING |
    v                  v                  HTTP Response |             v
+---------------------------+                           v         +---------+
|                           |                     +----------+    | Backend |
|    Cassandra  Database    |                     | Internet |    +---------+
|                           |                     | Client   |
+---------------------------+                     +----------+

如果没有PING,后端将结束其工作并入睡,直到下一个PING将其唤醒。虽然存在故障保护,但我将超时时间设为5分钟,因此无论如何,后端都会偶尔唤醒。

我的问题是关于UDP堆栈,我知道它是一个FIFO,但我想知道两个参数:

  1. 在FIFO充满之前,我可以收到多少PING?

  2. 如果我不能尽快阅读,我可能会收到PING并丢失吗?

  3. 这些问题的答案可以帮助我调整后端服务器的当前等待循环。到目前为止,我假设FIFO有一个限制,我可能会丢失一些数据包,但我没有实现允许数据包消失的方法(即有人发送PING,但后端需要太长时间再次检查UDP堆栈因此,网络决定数据包现在已超时,并将其从我的脚下移除。)


    更新:我添加了一个简单的处理来显示当(从上到下的时间)时会发生什么

2 个答案:

答案 0 :(得分:1)

您可以使用sysctl在系统上设置默认缓冲区大小,或使用带有SO_RCVBUF选项的setsockopt为每个套接字设置它。

int n = 512 * 1024; // 512K
if (setsockopt(my_socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) {
   perror("Failed to set buffer size, using default");
}

系统上还有一个您无法检查的最大设置。在我的机器上,默认接收缓冲区大小为208K,最大值为4M:

# sysctl net.core.rmem_max
net.core.rmem_max = 4194304
# sysctl net.core.rmem_default
net.core.rmem_default = 212992

答案 1 :(得分:1)

  

在FIFO充满之前,我可以收到多少PING?

这取决于套接字接收缓冲区的大小。

  

如果我不能尽快阅读,我可能会收到PING并丢失它吗?

是和否。已经接收到并且适合套接字接收缓冲区的数据报保持不变,直到它们被读取或套接字关闭为止。您可以在限制范围内调整套接字接收缓冲区的大小。但是,当套接字接收缓冲区已满时到达的数据报将被丢弃。