Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 我可以在套接字接收缓冲区中丢失数据报吗?当我使用UDP时,它是如何发生的?_Sockets_Networking_Udp_Ethernet_Tcp Ip - Fatal编程技术网

Sockets 我可以在套接字接收缓冲区中丢失数据报吗?当我使用UDP时,它是如何发生的?

Sockets 我可以在套接字接收缓冲区中丢失数据报吗?当我使用UDP时,它是如何发生的?,sockets,networking,udp,ethernet,tcp-ip,Sockets,Networking,Udp,Ethernet,Tcp Ip,我想在我的C程序中使用可靠传输下的UDP套接字,我想知道更多数据包可能丢失的地方 众所周知,UDP协议是不可靠的。这意味着: 如果数据包在任何低级协议中丢失,则不会再次发送 数据包可能在接收缓冲区中丢失,例如,如果接收缓冲区溢出 我对第二种情况感兴趣——它是如何工作的? 在接收缓冲区中,数据报与数据报的大小一起记录, 因为UDP保证了消息边界的保留。当接收缓冲区溢出时,首先删除数据报: 从环形缓冲区(接收缓冲区)的头部读取前8个字节 包含数据报大小 移动环形缓冲区的头部,移动量等于缓冲区的大

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

众所周知,UDP协议是不可靠的。这意味着:

  • 如果数据包在任何低级协议中丢失,则不会再次发送
  • 数据包可能在接收缓冲区中丢失,例如,如果接收缓冲区溢出
我对第二种情况感兴趣——它是如何工作的? 在接收缓冲区中,数据报与数据报的大小一起记录, 因为UDP保证了消息边界的保留。当接收缓冲区溢出时,首先删除数据报:

  • 从环形缓冲区(接收缓冲区)的头部读取前8个字节 包含数据报大小
  • 移动环形缓冲区的头部,移动量等于缓冲区的大小 消息-即,将头部移动到下一个数据报
  • 如果环形缓冲区中的可用空间足以容纳新接收的数据报, 然后将其写入环形缓冲区,并将尾部移动到其末尾,否则 转到1步
  • 也就是说,这意味着当我调用从套接字读取时,会发生一个系统调用,可以访问内核空间中的这种环形缓冲区,它读取数据报大小的前8个字节,然后读取这个大小的数据报,不是吗

    是这样吗

    OS:Linux x86_64(RedHat 6)

    当接收缓冲区溢出时,则第一数据报[is]remove[d]


    否。当数据报到达且接收缓冲区已满时,新数据报将被丢弃。缓冲区的处理根本不会发生。

    您对操作系统内部结构感兴趣吗?在这种情况下,您需要指定操作系统。这是一个不遵循UDP规范的实现细节。我认为第二种情况应该是不言自明的。如果接收缓冲区已满,它将无法接收新数据包,因此新数据包将被忽略,直到应用程序读取缓冲区以腾出空间容纳新数据包。就这么简单。@usr OS Linux x86_64(例如RedHat6)谢谢!这对任何操作系统都是真的吗,或者通常是真的,但不是必然的?我没有关于不同操作系统的任何信息,但我看不出有任何理由相信任何操作系统会选择以您描述的费力的方式处理输入缓冲区,而他们可以简单地丢弃传入的数据包。