【问题标题】:Checksum checking in UDP using UDP socket使用 UDP 套接字检查 UDP 的校验和
【发布时间】:2020-02-21 11:20:40
【问题描述】:

UDP 套接字 (SOCK_DGRAM) 是否可以从传入的 UDP 数据包访问校验和字段并检查错误?我知道我们可以使用原始套接字(SOCK_RAW)来做到这一点,但我想知道我们是否可以使用数据报套接字来做到这一点。如果是这样,我们如何在 C 中做到这一点?

【问题讨论】:

    标签: sockets network-programming udp raw-sockets rudp


    【解决方案1】:

    如果您创建一个普通的 UDP 套接字,您将无法访问 UDP 标头,因此也无法访问校验和。但是内核已经丢弃了校验和不正确的数据包,所以无论如何你都看不到这些数据包。

    【讨论】:

    • 但是,我们仍然可以访问发送方的源端口号,这是一个传输层字段。我想,也许我们也可以访问校验和。无论如何,感谢您的确认。另外,您确定内核使用校验和丢弃不正确的数据包吗?我记得读过 UDP 在数据包不正确的情况下会警告应用层。所以,我在想可能有一个界面可以捕捉到这个警告。
    • @KarthikChennenupati:见Are UDP Packets dropped when UDP header checksum is incorrect?。我认为您混淆了这是有关截断消息的信息。
    【解决方案2】:

    您不能使用数据报套接字 (SOCK_DGRAM) 来执行此操作,因为 TCP/IP 堆栈会在将接收到的缓冲区中删除这些 UDP 标头字节,然后再将其传递给更高层的 API。您需要使用原始套接字 (SOCK_RAW) 以便保留这些字节。

    【讨论】:

    • 我正在开发基于 UDP 的可靠传输服务。在原始套接字中,没有端口的概念。所以,我认为如果我们使用 UDP 套接字可能更有意义。无论如何,感谢您的澄清。
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多