我可以丢失套接字接收缓冲区中的数据报吗?当我使用UDP时它怎么会发生?

时间:2014-06-24 22:06:19

标签: sockets networking udp ethernet tcp-ip

我想在我的C-programm中使用可靠传输的UDP套接字,我想知道更多数据包丢失的地方。

我们知道UDP不是可靠的协议。这意味着:

  • 如果数据包在任何低级协议中丢失,则不会再次发送
  • 数据包可能在接收缓冲区中丢失,例如,如果接收缓冲区溢出

我对第二种情况感兴趣 - 它是如何工作的? 在接收缓冲区中,数据报与数据报的大小一起记录, 因为UDP保证了消息边界的保留。当接收缓冲区溢出时,第一个数据报删除:

  1. 从环形缓冲区(接收缓冲区)的头部读取前8个字节 包含数据报大小
  2. 移动环形缓冲区的头部,其数量等于 消息 - 即移动到下一个数据报
  3. 如果环形缓冲区中的可用空间足以容纳新接收的数据报, 然后将它写入环形缓冲区并将尾部移动到它的末尾,否则 转到第1步
  4. 即。这意味着当我调用从socket读取时,然后发生系统调用,在内核空间中访问这样的环形缓冲区,在那里它读取数据报大小的前8个字节,然后读取具有这个大小的数据报,不是它?

    是不是?

    操作系统:Linux x86_64(RedHat 6)

1 个答案:

答案 0 :(得分:1)

  

当接收缓冲区溢出时,[第一个数据报[是]删除[d]

没有。当数据报到达且接收缓冲区已满时, new 数据报将被丢弃。根本不会处理缓冲区。