http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html
http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html
http://blog.sina.com.cn/s/blog_1533e35800102wyqd.html
最近读者反映文章还要普及一下基础知识,比如专业术语,比如网络包是如何从一台电脑发送出去,网络包如何到达目的地,又如何从目的地网卡接收到,再传输到应用程序。如果把专业术语单独拎出来,没有上下文,同学们一定会觉得很突兀、也很枯燥,所以我还是喜欢讲一个例子,在这个例子中用到的专业术语一一解释,今天我们来讲同一网段的两台电脑如何ping通对方,那第一个问题就来了。
Ping是什么?
操作系统里的一种小程序,可以用来检测两台主机的连通性,如果可以ping通,表示网络可达,否则,网络不可达,网络出故障,需要排错了。先来看一个例子,在主机10.0.0.2上ping主机10.0.0.3,从第一个图可以看出可以ping 通,发出4个echo request,返回对应的4个echo reply;第二个图可以看出全部的8个ping报文,第三个图可以看到具体的ping报文的怎么构成的。
同学们一定很好奇,ping 是如何生成这些ICMP报文的,那下一个问题又来了;
什么是ICMP?
Internet Control Message
ICMP协议里有type字段,还有code字段,发送type=3,code=4,MTU=1476的消息就可以了,当这个ICMP消息到达IP包的发起者,发起者知道原来是IP太大了,那最大可以发送多大的呢?消息里有,那就MTU=1476,于是IP包的发起方只要发送小于等于1476字节的就可以了。
好了,那我们继续我们的主题,ping的ICMP报文是如何生成的,这个是软件工程师最擅长的领域,因为这更像编程,好在车小胖做过七年的软件工程师,操纵Motorola
1.
那下面这条命令什么意思?
ping 10.0.0.3 -c 100 -f -l 1500
-c
-f
-l length
意思是发送100次、长度为1500字节、且不能分片ICMP Echo request。
2.
最长匹配!把10.0.0.3和路由表里的每一个表相进行匹配,匹配长度最长的胜出,在这张路由表里最长的匹配就是第二条路由:10.0.0.0
什么是同一网段?
比如一个地址,10.0.0.3/24,也可以写成10.0.0.3
和255.255.255.0“按位与”操作得到网段地址,即10.0.0.0 ,剩下的3为主机地址,操作如下:
IP地址10.0.0.3 的二进制:
00001010.00000000.00000000.00000011
子网掩码255.255.255.0的二进制:
11111111.11111111.11111111.00000000
按位与得到的网段地址:
00001010.00000000.00000000.00000000
换算成十进制就是:
10.0.0.0
所谓按位与运算,就是每一位比对,如果都是1得到的结果是1,否则为0。
那10.0.0.2 和10.0.0.3就属于同一网段,同一网段意味着在一个广播域里,ARP就是工作在广播模式下,那ARP又做些什么呢?
什么是ARP?
Address Resolution
到这里栈有了所有的信息,包括二层以太网目的地址、三层IP目的地址,打包成一个ICMP包发送给网卡,怎么发?当然也是调用网卡驱动程序API,各位同学又看到了API,没错!下层提供给它上层的服务是通过API来实现的,这里相当于调用类似ethernet_send()接口函数,于是ICMP到达网卡。
3.
4.
5.
6. ICMP echo reply 到达10.0.0.2主机,然后ping把这个消息输出到屏幕,这就完成了同一网段主机的通信。