请网络高手解答 有关ping的疑问
有关ping的疑问??在使用相同网络模型的网络中(比如tcp/ip),ping命令用来检测对方网络与自己是否相通,至少是在ip级;
因此有这个疑问:如果两主机在ip级能够通讯,那怎么在上层协议中不能通讯呢;反之,如果在ip级不能通讯,那怎么能在上层协议中通讯呢??
请高手解答,并举个例子!!
[[i] 本帖最后由 DUT_girl 于 2007-10-26 15:09 编辑 [/i]] telnet 来判断 [quote]原帖由 [i]9命怪猫[/i] 于 2007-10-26 15:14 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=36686&ptid=11729][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
telnet 来判断 [/quote]
我的问题是两个方面的阿。 第一方面:IP层能通信,检查上层。
猫从前的办法是,如果检查某个服务(即application)是不是开启了运行了,telnet port,看返回结果;或者有其它工具程序/软件来探测。
第二方面:IP层之上的能通信,IP层不能
这个猫认为不可能!有点儿类似空中楼阁的感觉。
楼下达人欢迎拍砖指正! + +
| 应用层 | <---- HTTP/FTP/SMTP......
+-------------+
| 传输层 | <----IP (路由器工作在这一层)
+-------------+
| 网络层 | <----MAC地址 (二层交换机工作在这一层)
+-------------+
| 接口层 | <----全是硬件,以太网...
+-------------+
TCP/IP协议栈类似上面这样的(画得不好,LZ凑合看)。我再补充一贴。
TCP/IP协议的基本传输单位是数据包(datagram),发送数据时候从上到下加包头,接收时候从下到上解包。如果网络层断了,如何发送到目的地址?反正猫认为不可能!
或者猫落伍了,不知道如今科技发展到可以跳过一层来传输数据。——毕竟偶刚从火星回来,很多事情不晓得。
[[i] 本帖最后由 9命怪猫 于 2007-10-26 16:55 编辑 [/i]] 几年前我们还可以作出这样没有限定的断言,如果不能P i n g到某台主机,那么就
不能Te l n e t或F T P到那台主机。随着I n t e r n e t安全意识的增强,出现了提供访问控制清单
的路由器和防火墙,那么像这样没有限定的断言就不再成立了。一台主机的可达性可
能不只取决于I P层是否可达,还取决于使用何种协议以及端口号。[color=Red]P i n g程序的运行结果
可能显示某台主机不可达,但我们可以用Te l n e t远程登录到该台主机的2 5号端口(邮件
服务器)[/color]
这是从TCP/IP详解卷1 中拿来得一段话
标注的那段话怎么解析阿
[[i] 本帖最后由 DUT_girl 于 2007-10-26 17:19 编辑 [/i]]
大家一起讨论
猫的理解:ping 工具依赖于ICMP协议。远程主机可以拒绝ICMP包,以前安装的“天网”就有这个功能,不让别的机器ping本机。这样做可以在一定程度上防止通过ICMP的flood攻击——个人理解!
此外,Cisco路由器上也可以设置丢弃ICMP包。
然而,ping 结果不能说明是不是确实不可达。ping不通不代表第三层通信中断了。
只不过大多数情况下,对ICMP是不禁止的,因此我们在多数情况下可以通过ping来判断到目标主机是不是通。 [quote]原帖由 [i]9命怪猫[/i] 于 2007-10-26 17:25 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=36711&ptid=11729][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
猫的理解:
ping 工具依赖于ICMP协议。远程主机可以拒绝ICMP包,以前安装的“天网”就有这个功能,不让别的机器ping本机。这样做可以在一定程度上防止通过ICMP的flood攻击——个人理解!
此外,Cisco路由器上也可以 ... [/quote]
对了,大家一起讨论,首先前提是不屏蔽icmp包(或者这样认为就是两主机在ip级不能通讯)
[[i] 本帖最后由 DUT_girl 于 2007-10-26 17:30 编辑 [/i]] 请知道的解释一下 阿 ping 不通并不表示IP层不能用,只是包被防火墙或路由器上的策略给屏蔽或丢弃了。 不错,赞,我理解清楚了,但是我使用函数getnamebyhost时候,有些host返回为null,是否与被路由屏蔽有关?返回为null的主机是可以访问的。
比如:130w.cn [quote]原帖由 [i]cnangel[/i] 于 2007-10-31 09:39 发表 [url=http://linuxpk.linuxpk.com/redirect.php?goto=findpost&pid=37105&ptid=11729][img]http://linuxpk.linuxpk.com/images/common/back.gif[/img][/url]
不错,赞,我理解清楚了,但是我使用函数getnamebyhost时候,有些host返回为null,是否与被路由屏蔽有关?返回为null的主机是可以访问的。
比如:130w.cn [/quote]
路由屏蔽分很多种,具体可以google一下。
getnamebyhost返回有些host为null 不一定是icmp包被毙的关系。
猫记得此函数和DNS有些关系。建议你查查DNS解析。
说得哪里不对,请达人们指正! [quote]原帖由 [i]cnangel[/i] 于 2007-10-31 09:39 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=37105&ptid=11729][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
不错,赞,我理解清楚了,但是我使用函数getnamebyhost时候,有些host返回为null,是否与被路由屏蔽有关?返回为null的主机是可以访问的。
比如:130w.cn [/quote]
并没有 getnamebyhost(),你是想說 gethostbyname() 吧。gethostbyname() 需要 DNS 客户端正常运作。
惭愧!
学艺不精,对于gethostbyname只是有个皮毛印象,没看出来cnangel拼错了…… :Lto NEO,
偶怎么记得有个类似getnamebyhost的函数?还是脑子又出现断路了?
大家都来学习一下
gethostbyname将返回一个struct hostent的指针,这个结构定义如下:struct hostent
{
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
};
#define h_addr h_addr_list[0] /* for backward compatibility */
它的使用注意点是:
这个指针指向一个静态数据,它会被后继的调用所覆盖。简单的说,它是多线程或者多进程不安全的。
我们最好使用h_addr代理直接使用h_addr_list,这样能够提高日后的兼容性。
h_addr是指向一个长度为h_length的主机地址,它不是网络格式,所以在赋值给struct in_addr时,应该通过htonl来转化。我们可以通过下面一个学习程序来说明这种情况。
如果我们使用GNU环境,我们可以使用gethostbyname_r或者gethostbyname2_r来替换掉gethostbyname函数。它们能够良好的解决多线程或多进程安全性问题,并且提供选择地址族参数。
可以通过inet_pton或者inet_ntop函数来解决从"ddd.ddd.ddd.ddd"《=》ddd ddd ddd ddd之间的有效转换,简化了日后对struct sockaddr_in中 sin_addr的设置。比如说:
对于IPV4而言
struct sockaddr_in in;
memset( &in, 0, sizeof( struct sockaddr_in ) );
in.sin_family = AF_INET;
in.sin_port = htons( 13 );
inet_pton( AF_INET, "109.119.20.48", &in.sin_addr ); ping是程序,或者说是个小的应用软件,是应用层的东西.只是他使用的是icmp协议而已,是一个网络检查工具
ping不通,至多说明这个软件返回的信息,并不能代表下层就一定是坏的啊..换言之一个程序出了问题,不能怪网络吧...
页:
[1]