Visual C++ 2017网络编程实战
上QQ阅读APP看书,第一时间看更新

1.5 网络层

网络层向上层提供简单灵活、无连接、尽最大努力交付的数据报服务。该层重要的协议有IP、 ICMP(Internet控制报文协议)、IGMP(Internet组管理协议)、ARP(地址转换协议)、RARP(反向地址转换协议)等。

1.5.1 IP协议

IP(Internet Protocol,网际协议)是TCP/IP协议簇中最为核心的协议。它把上层数据包封装成IP数据包后进行传输。如果IP数据包太大,还要对数据包进行分片后再传输,到了目的地址处再进行组装还原,以适应不同物理网络对一次所能传输数据大小的要求。

1.5.1.1 IP协议的特点

(1)不可靠

不可靠的意思是它不能保证IP数据包能成功地到达目的地。IP协议仅提供最好的传输服务。发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据包,然后发送ICMP消息包给信源端。任何要求的可靠性必须由上层协议(如TCP)来提供。

(2)无连接

无连接的意思是IP协议并不维护任何关于后续数据包的状态信息。每个数据包的处理是相互独立的。这也说明,IP数据包可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据包(先是A,然后是B),每个数据包都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

(3)无状态

无状态的意思是通信双方不同步传输数据的状态信息,无法处理乱序和重复的IP数据包;IP数据包提供了标识字段,用来唯一标识IP数据包,用来处理IP分片和重组,不指示接收顺序。

1.5.1.2 IPv4数据包的包头格式

IPv4数据包的包头格式如图1-8所示。

图1-8

这里主要说IPv4的包头结构,IPv6结构与之不同。图1-8中的“数据”以上部分就是IP包头的内容。因为有了选项部分,所以IP包头长度是不定长的。如果选项部分没有,那么IP包头的长度为(4+4+8+16+16+3+13+8+8+16+32+32)bit=160bit=20字节,这也就是IP包头的最小长度。

·版本(Version):占用4个比特,标识目前采用的IP协议的版本号,一般的值为0100(IPv4)后0110(IPv6)。

·首部长度:IP包头长度(Header Length)。该字段占用4比特,由于在IP包头中有变长的可选部分,为了能多表示一些长度,因此采用4字节(32 bit)为本字段数值的单位。比如,4比特最大能表示为1111,即15,单位是4字节,因此最多能表示的长度为15×4=60字节。

·服务类型(Type of Service,TOS):占用8比特,可用PPPDTRC0这8个字符来表示。其中,PPP定义了包的优先级,取值越大,表示数据越重要,含义如表1-1所示。

表1-1 PPP取值及含义

D:时延,0表示普通,1表示延迟尽量小。

T:吞吐量,0表示普通,1表示流量尽量大。

R:可靠性,0表示普通,1表示可靠性尽量大。

M:传输成本,0表示普通,1表示成本尽量小。

0:这是最后一位,被保留,恒定为0。

总长度:占用16比特空间,表示以字节为单位的IP包的总长度(包括IP包头部分和IP数据部分)。如果该字段全为1,就是最大长度了,即216-1= 65535字节≈63.9990234375KB,有些书上写最大是64KB,其实是达不到的,最大长度只能是65535字节,而不是65536字节。

标识:在协议栈中保持着一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。注意,这个“标识符”并不是序号,IP是无连接服务,数据报不存在按序接收的问题。当IP数据包由于长度超过网络的MTU(Maximum Transmission Unit,最大传输单元)而必须分片(分片会在后面讲到,意思就是把一个大的网络数据包拆分成一个个小的数据包)时,这个标识字段的值就被复制到所有小分片的标识字段中。相同的标识字段的值使得分片后的各数据包片最后能正确地重装成为原来的大数据包。该字段占用16比特。

标志(Flags):占用3比特,最高位不使用,第二位称DF(Don't Fragment)位,DF位设为1时表明路由器不要对该上层数据包分片。如果一个上层数据包无法在不分段的情况下进行转发,那么路由器会丢弃该上层数据包并返回一个错误信息。最低位称MF(More Fragments)位,为1时说明这个IP数据包是分片的,并且后续还有数据包,为0时说明这个IP数据包是分片的,但已经是最后一个分片了。

片偏移:该字段的含义是某个分片在原IP数据包中的相对位置。第一个分片的偏移量为0。片偏移以8字节为偏移单位。这样,每个分片的长度一定是8字节(64位)的整数倍。该字段占13比特。

·生存时间也称存活时间(Time To Live,TTL):表示数据包到达目标地址之前的路由跳数。TTL是由发送端主机设置的一个计数器,每经过一个路由节点就减1,减到为0时,路由就丢弃该数据包,向源端发送ICMP差错报文。这个字段的主要作用是防止数据包不断在IP互联网络上永不终止地循环转发。该字段占8比特。

协议:该字段用来标识数据部分所使用的协议,比如取值1表示ICMP、取值2表示IGMP、取值6表示TCP、取值17表示UDP、取值88表示IGRP、取值89表示OSPF。该字段占8比特。

首部校验和(Header Checksum):用于对IP头部的正确性检测,但不包含数据部分。前面提到,每个路由器会改变TTL的值,所以路由器会为每个通过的数据包重新计算首部校验和。该字段占16比特。

起源和目标地址:用于标识这个IP包的起源和目标IP地址。值得注意的是,除非使用NAT(网络地址转换),否则在整个传输的过程中,这两个地址不会改变。这两个地址都占用32比特。

选项(可选):这是一个可变长的字段。该字段属于可选项,主要是给一些特殊的情况使用。最大长度是40字节。

填充(Padding):IP包头长度(Header Length)这个字段的单位为32bit,因此必须为32bit的整数倍,因此在可选项后面IP协议会填充若干个0,以达到32bit的整数倍。

在Linux源码中,IP包头的定义如下:

    struct iphdr {
    #if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8      ihl:4,
          version:4;
    #elif defined (__BIG_ENDIAN_BITFIELD)
    __u8      version:4,
              ihl:4;
    #else
    #error    "Please fix <asm/byteorder.h>"
    #endif
    __u8      tos;
    __be16    tot_len;
    __be16    id;
    __be16    frag_off;
    __u8      ttl;
    __u8      protocol;
    __sum16   check;
    __be32    saddr;
    __be32    daddr;
    /*The options start here. */
    };

这个定义可以在源码目录的include/uapi/linux/ip.h中查到。

1.5.1.3 IP数据包分片

IP协议在传输数据包时,将数据包分为若干分片(小数据包)后进行传输,并在目的系统中进行重组。这一过程称为分片(fragmentation)。

要理解IP分片,首先要理解下MTU(最大传输单元,后面数据链路层还会讲到),物理网络一次传送的数据是有最大长度的,因此网络层的下层(数据链路层)的传输单元(数据帧)也有一个最大长度,这个最大长度值就是MTU,每一种物理网络都会规定链路层数据帧的最大长度,比如以太网的MTU为1500字节。

IP协议在传输数据包时,若IP数据包加上数据帧头部后长度大于MTU,则将数据包切分成若干分片(小数据包)后再进行传输,并在目标系统中进行重组。IP分片既可能在源端主机进行,也可能发生在中间的路由器处,因为不同的网络的MTU是不一样的,而传输的整个过程可能会经过不同的物理网络。如果传输路径上某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据包再次进行分片。分片数据的重组只会发生在目的端的IP层。

1.5.1.4 IP地址的定义

IP协议中有个概念叫IP地址。所谓IP地址,就是Internet中主机的标识。Internet中的主机要与别的主机通信,必须具有一个IP地址。就像房子要有一个门牌号,这样邮递员才能根据信封上的家庭地址送到目的地。

IP地址现在有两个版本,分别是32位的IPv4和128位的IPv6,后者是为了解决前者不够用而产生的。每个IP数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由。

这里以IPv4为例,IP地址是由4个数字组成的,数字之间用小圆点隔开,每个数字的取值范围在0~255之间(包括0和255)。通常有两种表示形式:

(1)十进制表示,比如192.168.0.1。

(2)二进制表示,比如11000000.10101000.00000000.00000001。

两种方式可以相互转换,每8位二进制数对应一位十进制数,如图1-9所示。

图1-9

实际应用中多用十进制表示,比如172.16.100.2。

1.5.1.5 IP地址的两级分类编址

因特网由很多网络构成,每个网络上都有很多主机,这样便构成了一个有层次的结构。IP地址在设计的时候就考虑到地址分配的层次特点,把每个IP地址分割成网络号(NetID)和主机号(HostID)两部分,网络号表示主机属于互联网中的哪一个网络,而主机号则表示其属于该网络中的哪一台主机,两者之间是主从关系,同一网络中绝对不能有主机号完全相同的两台计算机,否则会报出IP地址冲突。IP地址分为两部分后,IP数据包从网际上的一个网络到达另一个网络时,选择路径可以基于网络而不是主机。在大型的网际中,这一点优势特别明显,因为路由表中只存储网络信息而不是主机信息,这样可以大大简化路由表,方便路由器的IP寻址。

根据网络地址和主机地址在IP地址中所占的位数可将IP地址分为 A、B、C、D、E 5类,每一类网络可以从IP地址的第一个数字看出,如图1-10所示。

图1-10

A类地址的第一位为0,第二至八位为网络地址,第九至三十二位为主机地址,这类地址适用于为数不多的主机数大于2的16次方的大型网络。A类网络地址的数量最多不超过126(2的7次方减2)个,每个A类网络最多可以容纳16777214(2的24次方减2)台主机。

B类地址前两位分别为1和0,第三至第十六位为网络地址,第十七至三十二位为主机地址,此类地址用于主机数介于2的8~16次方之间的中型网络,B类网络数量最多16382(2的14次方减2)个。

C类地址前三位分别为1、1、0,四到二十四位为网络地址,其余为主机地址,用于每个网络只能容纳254(2的8次方减2)台主机的大量小型网,C类网络数量上限为(2的21次方减2)个。

D类地址前四位为1、1、1、0,其余为多目地址。

E类地址前五位为1、1、1、1、0,其余位数留待后用。

A类IP的第一个字节范围是0到126,B类IP的第一个字节范围是128到191,C类IP的第一个字节范围是192到223,所以看到192.X.X.X肯定是C类IP地址,大家根据IP地址的第一个字节范围就能够推导出该IP属于A类还是B或C类。

IP地址以A、B、C两类为主,又以B、C两类地址较为常见。除此之外,还有一些特殊用途的IP地址:广播地址(主机地址全为1,用于广播,这里的广播是指同时向网上所有主机发送报文,不是指我们日常听的那种广播)、有限广播地址(所有地址全为1,用于本网广播)、本网地址(网络地址全0,后面的主机号表示本网地址)、回送测试地址(127.X.X.X型,用于网络软件测试及本地机进程间通信)、主机位全0地址(这种地址的网络地址就是本网地址)及保留地址(网络号全1和32位全0两种)。由此可见,网络位全1或全0和主机位全1或全0都是不能随意分配的。这也就是前面的A、B、C类网络的网络数及主机数要减2的原因。

总之,主机号全为0或全为1时分别作为本网络地址和广播地址使用,这种IP地址不能分配给用户使用。D类网络用于广播,可以将信息同时传送到网上的所有设备,而不是点对点的信息传送,可以用来召开电视电话会议。E类网络常用于进行试验。网络管理员在配置网络时不应该采用D类和E类网络。我们把特殊的IP地址放在表1-2中。

表1-2 特殊IP地址及含义

当前,A类地址已经全部分配完,B类也不多了,为了有效并连续地利用剩下的C类地址,互联网采用CIDR(Classless Inter-Domain Routing,无类别域间路由方式)把许多C类地址合起来作为B类地址分配,整个世界被分为四个地区,每个地区分配一段连续的C类地址:欧洲(194.0.0.0~195.255.255.255)、北美(198.0.0.0~199.255.255.255)、中南美(200.0.0.0~201.255.255.255)、亚太地区(202.0.0.0~203.255.255.255)、保留备用(204.0.0.0~223.255.255.255)。这样每一类都约有3200万网址供用。

1.5.1.6 网络掩码

在IP地址的两级编址中,IP地址由网络号和主机号两部分组成。如果我们把主机号部分全部置零,此时得到的地址就是网络地址。网络地址可以用于确定主机所在的网络,为此路由器只需计算出IP地址中的网络地址,然后跟路由表中存储的网络地址相比较即可知道这个分组应该从哪个接口发送出去。当分组达到目的网络后再根据主机号抵达目的主机。

要计算出IP地址中的网络地址,需要借助于网络掩码,或称默认掩码。它是一个32位的数,左边连续n位全部为1,后边32-n位连续为0。A、B、C三类地址的网络掩码分别为255.0.0.0、255.255.0.0和255.255.255.0。我们通过IP地址和网络掩码进行与运算,得到的结果就是该IP地址的网络地址。网络地址相同的两台主机处于同一个网络中,它们可以直接通信,而不必借助于路由器。

举个例子,现在有两台主机A和B:A的IP地址为192.168.0.1,网络掩码为255.255.255.0;B的IP地址为192.168.0.254,网络掩码为255.255.255.0。我们先对A做运行,把它的IP地址和子网掩码每位相与:

    IP :     11010000.10101000.00000000.00000001
    子网掩码:11111111. 11111111. 11111111.00000000
    AND运算
    网络号:  11000000.10101000.00000000.00000000
    转换为十进制:      192.168.0.0

再把B的IP地址和子网掩码每位相与:

    IP :     11010000.10101000.00000000.11111110
    子网掩码:11111111. 11111111. 11111111.00000000
    AND运算
    网络号:  11000000.10101000.00000000.00000000
    转换为十进制:      192.168.0.0

A和B两台主机的网络号是相同的,因此可以认为它们处于同一网络。

IP地址越来越不够用,为了不浪费,人们又对每类网络进一步划分出子网,为此IP地址的编址又有了三级编址的方法,即子网内的某个主机IP地址={<网络号>,<子网号>,<主机号>},该方法中有了子网掩码的概念。后来又提出了超网、无分类编址和IPv6。限于篇幅,这里不再叙述。

1.5.2 ARP协议

网络上的IP数据包到达最终目的网络后,必须通过MAC地址来找到最终目的主机,而数据包中只有IP地址,为此需要把IP地址转为MAC地址,这个工作就由ARP协议来完成。ARP协议是网际层中的协议,用于将IP地址解析为MAC地址。通常,ARP协议只适用于局域网中。ARP协议的工作过程如下:

(1)本地主机在局域网中广播ARP请求,ARP请求数据帧中包含目的主机的IP地址。这一步所表达的意思就是“如果你是这个IP地址的拥有者,请回答你的硬件地址”。

(2)目的主机收到这个广播报文后,用ARP协议解析这份报文,识别出是询问其硬件地址。于是发送ARP应答包,里面包含IP地址及其对应的硬件地址。

(3)本地主机收到ARP应答后,知道了目的地址的硬件地址,之后的数据包就可以传送了。同时,会把目的主机的IP地址和MAC地址保存在本机的ARP表中,以后通信直接查找此表即可。

我们在Windows操作系统的命令行下可以使用“arp –a”命令来查询本机arp缓存列表,如图1-11所示。

图1-11

另外,可以使“arp -d”命令清除ARP缓存表。

ARP协议通过发送和接收ARP报文来获取物理地址的,ARP报文的格式如图1-12所示。

图1-12

结构ether_header定义了以太网帧首部;结构arphdr定义了其后的5个字段,其信息用于在任何类型的介质上传送ARP请求和回答;ether_arp结构除了包含arphdr结构外,还包含源主机和目的主机的地址。如果这个报文格式用C语言表述,可以写成这样:

    //定义常量
    #define EPT_IP   0x0800    /* type: IP */
    #define EPT_ARP   0x0806    /* type: ARP */
    #define EPT_RARP 0x8035    /* type: RARP */
    #define ARP_HARDWARE 0x0001    /* Dummy type for 802.3 frames */
    #define ARP_REQUEST 0x0001    /* ARP request */
    #define ARP_REPLY 0x0002    /* ARP reply */
    //定义以太网首部
    typedef struct ehhdr
    {
    unsigned char eh_dst[6];   /* destination ethernet addrress */
    unsigned char eh_src[6];   /* source ethernet addresss */
    unsigned short eh_type;   /* ethernet pachet type */
    }EHHDR, *PEHHDR;
    //定义以太网arp字段
    typedef struct arphdr
    {
    //arp首部
    unsigned short arp_hrd;    /* format of hardware address */
    unsigned short arp_pro;    /* format of protocol address */
    unsigned char arp_hln;    /* length of hardware address */
    unsigned char arp_pln;    /* length of protocol address */
    unsigned short arp_op;     /* ARP/RARP operation */

    unsigned char arp_sha[6];    /* sender hardware address */
    unsigned long arp_spa;    /* sender protocol address */
    unsigned char arp_tha[6];    /* target hardware address */
    unsigned long arp_tpa;    /* target protocol address */
    }ARPHDR, *PARPHDR;

    //定义整个arp报文包,总长度42字节
    typedef struct arpPacket
    {
    EHHDR ehhdr;
    ARPHDR arphdr;
    } ARPPACKET, *PARPPACKET;

1.5.3 RARP协议

RARP(Reverse Address Resolution Protocol,逆地址解析协议)允许局域网的物理机器从网关服务器的 ARP表或者缓存上请求其IP地址。比如局域网中有一台主机只知道自己的物理地址而不知道自己的IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。RARP协议广泛应用于无盘工作站引导时获取IP地址。RARP允许局域网的物理机器从网关服务器ARP表或者缓存上请求其IP地址。

RARP协议的工作过程如下:

(1)主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址。

(2)本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址。

(3)如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用。

(4)如果不存在,RARP服务器对此不做任何响应。

(5)源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通信。如果一直没有收到RARP服务器的响应信息,表示初始化失败。

RARP的帧格式同ARP协议,只是帧类型字段和操作类型不同。

1.5.4 ICMP协议

ICMP(Internet Control Message Protocol,Internet控制报文协议)是网络层的一个协议,用于探测网络是否连通、主机是否可达、路由是否可用等。简单地讲,它是用来查询诊断网络的。

虽然和IP协议同处网络层,但是ICMP报文却是作为IP数据包的数据,然后加上IP包头后再发送出去的,如图1-13所示。

图1-13

IP首部的长度为20字节。ICMP报文作为IP数据包的数据部分,当IP首部的协议字段取值为1时其数据部分是ICMP报文。ICMP报文格式如图1-14所示。

图1-14

其中,最上面的(0 8 16 31)指的是比特位,所以前3个字段(类型、代码、检验和)一共占了32比特(类型占8位,代码占8位,检验和占16位),即4字节。所有ICMP报文前4个字节的格式都是一样的,即任何ICMP报文都含有类型、代码和校验和这3个字段,8位类型和8位代码字段一起决定了ICMP报文的种类。紧接着后面4个字节取决于ICMP报文种类。前面8个字节就是ICMP报文的首部,后面的ICMP数据部分的内容和长度取决于ICMP报文种类。16位的检验和字段是对包括选项数据在内的整个ICMP数据报文的校验和,其计算方法和IP头部校验和的计算方法一样。

ICMP报文可分为两大类别:差错报告报文和查询报文。每一条(或称每一种)ICMP报文要么属于差错报告报文,要么属于查询报文,具体如图1-15所示。

图1-15

从图1-15我们可以看出,每一行都是一条(或称每一种)ICMP报文,要么属于查询,要么属于差错。

1.5.4.1 ICMP差错报告报文

我们从图1-15中可以发现属于差错报告报文的ICMP报文蛮多的,为了归纳方便,根据其类型的不同,可以将这些差错报告报文分为5种类型:目的不可达(类型=3)、源端被关闭(类型=4)、重定向(类型=5)、超时(类型=11)和参数问题(类型=12)。

从图1-15中可以看到,代码字段不同的取值进一步表明了该类型ICMP报文的具体情况。比如类型为3的ICMP报文都是表明目的不可达的,但目的不可达是什么原因呢?此时就用代码字段再进一步说明,比如代码为0表示网络不可达、代码为1表示主机不可达……

ICMP协议规定,ICMP差错报文必须包括产生该差错报文的源数据包的IP首部,还必须包括跟在该IP(源IP)首部后面的前8个字节,这样ICMP差错报文的IP包长度=本IP首部(20字节)+本ICMP首部(8字节)+源IP首部(20字节)+源IP包的IP首部后的8字节=56字节。我们可以用图1-16来表示ICMP差错报文。

图1-16

比如我们来看一个具体的UDP端口不可达的差错报文,如图1-17所示。

图1-17

从图1-17可以看到IP数据包的长度是56字节。为了让大家更形象地了解这五大类差错报告报文格式,我们用图形来表示每一类报文:

(1)ICMP目的不可达报文

目的不可达也称终点不可达,可分为网络不可达、主机不可达、协议不可达、端口不可达、需要分片但DF比特已置为1以及源站选路失败等16种报文,其代码字段分别置为0至15。当出现以上16种情况时就向源站发送目的不可达报文。目的不可达报文的格式如图1-18所示。

图1-18

(2)ICMP源端被关闭报文

也称源站抑制,当路由器或主机由于拥塞而丢弃数据包时,就向源站发送源站抑制报文,使源站知道应当将数据包的发送速率放慢。该类报文格式如图1-19所示。

图1-19

(3)ICMP重定向报文

当IP数据包应该被发送到另一个路由器时,收到该数据包的当前路由器就要发送ICMP重定向差错报文给IP数据包的发送端。重定向一般用来让具有很少选路信息的主机逐渐建立更完善的路由表。ICMP重定向报文只能由路由器产生。该类报文格式如图1-20所示。

图1-20

(4)ICMP超时报文

当路由器收到生存时间为零的数据包时,除丢弃该数据包外,还要向源站发送时间超过报文。当目的站在预先规定的时间内不能收到一个数据包的全部数据包片时,就将已收到的数据包片都丢弃,并向源站发送时间超时报文。该类报文格式如图1-21所示。

图1-21

(5)ICMP参数问题

当路由器或目的主机收到的数据包的首部中的字段值不正确时,就丢弃该数据包,并向源站发送参数问题报文。该类报文格式如图1-22所示。

图1-22

代码为0时,数据报某个参数错,指针域指向出错的字节。

代码为1时,数据报缺少某个选项,无指针域。

1.5.4.2 ICMP查询报文

根据功能的不同,ICMP查询报文可以分为4大类:请求回显(Echo)或应答、请求时间戳(Timestamp)或应答、请求地址掩码(Address mask)或应答、请求路由器或通告。请提起精神,后面ping编程的时候会用到这方面的理论知识。前面提到,种类由类型和代码字段(见表1-3)决定。

表1-3 ICMP查询报文的类型、代码及含义

这里要提一下回送请求和应答,Echo的中文翻译为回声,有的文献用回送或回显,本书用“回显”。请求回显的含义就好比请求对方回复一个应答的意思。我们知道Linux或Windows下有一个ping命令,值得注意的是,Linux下ping命令产生的ICMP报文大小是56+8=64字节,56是ICMP报文数据部分长度,8是ICMP报头部分长度;而Windows(比如XP)下ping命令产生的ICMP报文大小是32+8=40字节。该命令就是本机向一个目的主机发送一个请求回显(类型Type=8)的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回一个回显应答的ICMP报文(类型Type=0),表明这台主机存在。后面章节还会讲到ping命令的抓包和编程。

为了让大家更形象地了解这四类查询报文格式,我们用图形来表示每一类报文。

(1)ICMP请求回显和应答回显报文格式(见图1-23)

图1-23

(2)ICMP时间戳请求和应答报文(见图1-24)

图1-24

(3)ICMP地址掩码请求和应答报文(见图1-25)

图1-25

(4)ICMP路由器请求报文和通告报文(见图1-26、图1-27)

图1-26

图1-27

【例1.1】抓包查看来自Windows的ping包

(1)启动Vmware下的xp,设置网络连接方式为NAT,则虚拟机xp会连接到虚拟交换机VMnet8上。

(2)在Windows 7安装并打开抓包软件Wireshark,选择要捕获网络数据包的网卡是“VMware Virtual Ethernet Adapter for VMnet8”,如图1-28所示。

图1-28

双击图1-28中选中的网卡,就开始在该网卡上捕获数据。此时我们在虚拟机xp(192.168.80.129)下ping宿主机(192.168.80.1),可以在Wireshark下看到捕获到的ping包,图1-29是回显请求,我们可以看到ICMP报文的数据部分是32字节,如果加上ICMP报头(8字节),那就是40字节。

图1-29

我们可以再一看下回显应答,ICMP报文的数据部分长度依然是32字节,如图1-30所示。

图1-30

【例1.2】抓包查看来自Linux的ping包

(1)启动Vmware下的Linux,设置网络连接方式为NAT,则虚拟机Linux会连接到虚拟交换机VMnet8上。

(2)在Windows 7中安装并打开抓包软件Wireshark,选择要捕获网络数据包的网卡是“VMware Virtual Ethernet Adapter for VMnet8”(可参考上例)。

我们在虚拟机Linux(192.168.80.128)下ping宿主机(192.168.80.1),可以在Wireshark下看到捕获到的ping包。图1-31是回显请求,我们可以看到ICMP报文的数据部分是56字节,如果加上ICMP报头(8字节),那就是64字节。

图1-31

我们可以再看一下回显应答,ICMP报文的数据部分长度依然是56字节,如图1-32所示。

图1-32