2008-09-16 138 views

回答

3

Ping目标,逐渐增加TTL并观察“TTL超出”响应发源的位置。

+0

听起来像它会工作,但有点复杂。 – UnkwnTech 2008-09-16 21:02:08

+2

这实际上是traceroute的功能。 – Ferruccio 2008-09-16 21:03:55

+1

如何在不使用C中的原始套接字的情况下增加TTL? – brian 2008-09-16 21:04:32

1

与其使用原始套接字,有些应用程序使用更高编号的tcp或udp端口。通过在一个已知的网络服务器上的端口80上引导该tcp端口,可以对该服务器进行跟踪路由。缺点是您需要知道目标设备上打开了哪些端口才能触发它。

0

您不需要使用原始套接字发送和接收ICMP数据包。至少不在Windows上。

-1

如果你有一个现代化的Linux发行版,你可以看看traceroute(或tracepath,在traceroute去之前没有setuid)和tcptraceroute的源代码。这些都不需要RAW套接字 - 在Fedora 9上进行检查,它们不是setuid,而是使用普通用户的默认选项。

使用tcptraceroute所做的代码可能尤为重要。例如,对于地址的ICMP数据包不一定会与到端口80的TCP连接处于同一位置。

做的traceroute的strace的(作为普通用户)表明它做类似:


int opt_on = 1; 
int opt_off = 0; 

fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) 
setsockopt(fd, SOL_IP, IP_MTU_DISCOVER, &opt_off, sizeof int) 
setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &opt_on, sizeof int) 
setsockopt(fd, SOL_IP, IP_RECVTTL, &opt_on, sizeof int) 

...然后读出CMSG结果的数据。

0

ping and traceroute使用ICMP协议。像UDP和TCP一样,这可以通过普通套接字API访问。只有UDP和TCP端口号小于1024才能被使用,除了root以外。 ICMP可供所有用户免费使用。

如果你真的想看看ping和traceroute是如何工作的,你可以从CodeProject下载他们的示例C代码实现。

简而言之,他们简单地打开一个ICMP套接字,traceroute使用setsockopt改变TTL的增量直到达到目标。

相关问题