使用 C# 时如何获取传入数据包的 TTL

How do I get the TTL of INCOMING packets when using C#

注意:我更喜欢使用 UDPClient 来解决这个问题,但是 berkley Socket 类 也可以。

问题:我到处搜索如何读取传入数据包的"TTL",但我不能'在任何地方都找不到这个。我知道

Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Ttl; 

让我获取或设置 传出 数据包的 Ttl,但我想读取传入数据包的 ttl 值。我很难解析传入数据包的数据部分之外的任何内容,但我的目标是进行逻辑处理并最终记录包含 UDP 和 IP header 以及所有内容的整个数据包。我在这里误解了什么?

TTL适用于IP层。 UDP 没有 TTL。当数据包有效负载传递到 UDPClient(甚至 UDP 套接字)时,TTL 信息已经消失,不幸的是没有保留在套接字中。

UDP 或 TCP 套接字都看不到它。您需要使用 socket.Read() 中包含整个 IP header 的 RAW 套接字,然后处理数据包并提取 TTL。

使用 RAW 套接字在套接字层读取 TCP 数据包的 TTL 将是一项不可能(极其困难)的任务,因为您需要编写自己的 TCP 堆栈。如果您想要 "monitor" TCP TTL,它可能因消息的某些部分而异,那么您最好使用 WFP or PCAP.

这里有一篇关于如何在 c# 中执行 RAW Socket UDP 的好文章link