c# - 使用 C# 时如何获取传入数据包的 TTL
问题描述
注意:我更喜欢使用 UDPClient 来解决这个问题,但是 berkley Socket 类也可以。
问题:我一直在到处寻找如何读取传入数据包的“TTL”,但我在任何地方都找不到。我知道
Socket s = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
s.Ttl;
让我获取或设置传出数据包的 ttl,但我想读取传入数据包的 ttl 值。我很难解析传入数据包的数据部分之外的任何内容,但我的目标是执行逻辑并最终记录包含 UDP 和 IP 标头以及所有内容的整个数据包。我在这里有什么误解?
解决方案
TTL 适用于 IP 层。UDP 没有 TTL。当数据包有效负载被传递到 UDPClient(甚至是 UDP 套接字)时,TTL 信息已经消失,不幸的是没有保留在 Socket 中。
UDP 或 TCP 套接字都看不到这一点。您需要使用一个 RAW Socket,它在 socket.Read() 中包含整个 IP 标头,然后处理数据包并提取 TTL。
使用 RAW 套接字在 Socket 层读取 TCP 数据包的 TTL 将是一项不可能(极其困难)的任务,因为您需要编写自己的 TCP 堆栈。如果您想“监视”可能因消息的某些部分而异的 TCP TTL,那么您最好使用WFP或PCAP来查看。
这是关于如何在 c# 中执行 RAW Socket UDP 的一个很好的链接
推荐阅读
- python - 弹丸不会变成图像错误如何修复?
- garbage-collection - 在 valgrind 和 jvm 中测量经过的时间
- javascript - javascript this 在方法中未定义
- java - 如何将具有一对一关系 pojo(ROOM 实现)与 safeArgs 的 List<> 传递到目的地
- git - GitAhead:意外的 HTTP 状态代码:404
- java - 如何让按钮适应 Android Studio 中的任何屏幕尺寸
- python - 在 Windows 10 x64 上从命令行运行 GDAL
- html - 将不透明度添加到行的背景颜色
- python - Python Pandas DataFrame - 数据由索引而不是行显示
- scala - 在 scala 中返回自定义集作为函数的扩展