回 帖 发 新 帖 刷新版面

主题:我发到外网的端口号会变吗?


我在写一个简单的traceroute程序.在学校的局域网里trace 外网比如google,
可是每次路由器返回的超时错误ICMP包里的UDP源端口
跟我发送时设置的端口号不一样,目标端口是一样的,不
知道怎么回事,检查了好几遍,代码没错 
    所以想问达人,我发的UDP数据包通过路由时是不是端口号会变?

THANK YOU!!!

回复列表 (共5个回复)

沙发

学校的局域网里的IP是私有IP地址,Internet上是不认识的,经过路由器的时候,路由器使用了 NAT 穿越,把你的IP换成了路由器的IP(当然是公有),路由器又给随机选择了一个没有被占用的端口,同时把你的地址和端口和现在分配的地址和端口建立映射保存下来,才把数据发送出去,当然数据回来的时候也是路由器的地址加端口(服务器只认数据源的话),路由器查它保存的路由表把数据又发给了你。

可能你的路由表或者路由算法有问题。

板凳

很感谢楼上的帮助.
我的程序基本上是照UNIX网络编程上的抄的,算是一次实验吧.

我要怎么样才能完成traceroute呢?基本原理我懂了,可是我的程序在TTL达到6 或7的时候就阻塞在recvfrom()这个函数上,收不到回来的数据包.这是怎么回事啊?

我的这个问题可能不太好回答,先谢谢了!

3 楼

recvfrom()本身就是阻塞函数,引起阻塞的原因很多,也有可能是信号中断什么的

设置该SOCKET为非阻塞模式试试
fcntl(sockfd,F_SETFL,O_NONBLOCK);

4 楼

Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器...... traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。

5 楼

非常感谢楼上!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册