C#UDP-可以告诉windows在一定时间后丢弃数据包吗?

C#UDP-可以告诉windows在一定时间后丢弃数据包吗?,c#,udp,ttl,C#,Udp,Ttl,我有一个非常高速率的UDP应用程序,我有点好奇这里的具体基础。我使用c#async方法,在EndReceive上,我将工作放在一个新线程上,然后调用BeginReceive 据我所知,即使我目前处于EndReceive和BeginReceive之间的代码,windows仍在该端口上接受UDP数据包-每当我再次调用BeginReceive时,下一个数据包将从堆栈中取出 假设这都是真的(如果不是,请直接告诉我)-我可以在这些数据包上指定一个TTL吗?我需要向发送者发送响应,并且发送者被配置为在几秒钟

我有一个非常高速率的UDP应用程序,我有点好奇这里的具体基础。我使用c#async方法,在EndReceive上,我将工作放在一个新线程上,然后调用BeginReceive

据我所知,即使我目前处于EndReceive和BeginReceive之间的代码,windows仍在该端口上接受UDP数据包-每当我再次调用BeginReceive时,下一个数据包将从堆栈中取出

假设这都是真的(如果不是,请直接告诉我)-我可以在这些数据包上指定一个TTL吗?我需要向发送者发送响应,并且发送者被配置为在几秒钟后忽略响应


感谢您,当数据包太旧时,您需要丢弃数据包,这是特定于应用程序的,UDP无法为您提供(AFAIK)。Windows可能会为您“自动”接收和缓冲数据报,但它如何做到这一点是网络堆栈的一个实现细节

我会把它分成两部分:

  • 在消息到达时尽快接收并排队。
    • 如果您想限制接收队列的大小,可能会在这个阶段开始删除最旧的消息
  • 退出消息队列:
    • 如果它们太老了,就把它们扔到地板上
    • 以其他方式处理和确认它们

  • 第2步可能是并行的,以确保您的消费者跟上进度。

    您在数据包太旧时丢弃数据包的要求是特定于应用程序的,UDP无法为您提供(AFAIK)。Windows可能会为您“自动”接收和缓冲数据报,但它如何做到这一点是网络堆栈的一个实现细节

    我会把它分成两部分:

  • 在消息到达时尽快接收并排队。
    • 如果您想限制接收队列的大小,可能会在这个阶段开始删除最旧的消息
  • 退出消息队列:
    • 如果它们太老了,就把它们扔到地板上
    • 以其他方式处理和确认它们

  • 第2步可能是并行的,以尝试并确保您的消费者跟上。

    当网络接口卡从线路上传送数据报时,操作系统会将其放入套接字的接收队列中。它在那里等待,直到您使用
    recvfrom()
    系统调用或您选择的高级包装器读取它

    您可以通过调用
    SO\u RCVBUF
    getsockopt()
    来确定此缓冲区的大小。默认大小和最大大小因操作系统和版本而异

    网络数据报不携带任何定时信息,因此没有基于时间的内在方式使其过期。您选择如何继续实际上取决于您预期延迟的确切来源

    • 如果您关心从发送到处理的时间,那么您必须协调发送方和接收方之间的时钟,然后让发送方在发送前在每个数据报中放置一个时间戳。这是你知道两件事之间实际时间的唯一方法。但请记住,网络延迟可能会有很大的变化,因此简单地丢弃超过某个时间的所有数据包可能会导致丢弃所有数据包

    • 如果您关心的只是数据包收到和处理之间的时间(忽略网络延迟),那么您需要让一个单独的线程在数据报到达时尽快读取数据报,记下时间,并将其存储在内部线程安全队列中。这需要大量的工作,并且会带来巨大的开销,因此您可能首先要检查处理过程中出现延迟的原因

    • 如果数据包是以相当固定的速率发送的,并且/或者您关心的不是时间问题而是未处理数据包的积压问题,那么您可能只想减小接收队列的大小(
      setsockopt()
      with
      so_RCVBUF
      )。当接收队列已满时,任何到达的数据报都将被悄悄地丢弃


    当网络接口卡从电线上传送数据报时,操作系统会将其放入套接字的接收队列中。它在那里等待,直到您使用
    recvfrom()
    系统调用或您选择的高级包装器读取它

    您可以通过调用
    SO\u RCVBUF
    getsockopt()
    来确定此缓冲区的大小。默认大小和最大大小因操作系统和版本而异

    网络数据报不携带任何定时信息,因此没有基于时间的内在方式使其过期。您选择如何继续实际上取决于您预期延迟的确切来源

    • 如果您关心从发送到处理的时间,那么您必须协调发送方和接收方之间的时钟,然后让发送方在发送前在每个数据报中放置一个时间戳。这是你知道两件事之间实际时间的唯一方法。但请记住,网络延迟可能会有很大的变化,因此简单地丢弃超过某个时间的所有数据包可能会导致丢弃所有数据包

    • 如果您关心的只是数据包收到和处理之间的时间(忽略网络延迟),那么您需要让一个单独的线程在数据报到达时尽快读取数据报,记下时间,并将其存储在内部线程安全队列中。这需要大量的工作,并且会带来巨大的开销,因此您可能首先要检查处理过程中出现延迟的原因

    • 如果数据包是以相当固定的速率发送的,并且/或者您关心的不是时间,而是未处理数据包的积压,那么您可能只想减小大小