Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1455949
  • 博文数量: 267
  • 博客积分: 3010
  • 博客等级: 少校
  • 技术积分: 3089
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-05 17:09
个人简介

尊天命,尽人事

文章分类

全部博文(267)

文章存档

2017年(6)

2015年(4)

2014年(27)

2013年(52)

2012年(59)

2011年(120)

分类: LINUX

2015-09-09 17:27:37

1、问题
主机1--路由器1--网络--路由器2--主机2
这样的组网模型中,从主机1 ping 主机2,网络通信的基本原理是怎样的?

2、路由基本原理
将整个ping包过程进行分解,步骤如下:
1)主机1发送ping包前,需要先进行arp相关操作,具体包括:

  (1)检查dst ip和local ip,如果不是在同一个网段(本例就不是一个网段),则查看本地arp缓存,确认是否有网关(路由器1)IP对应的mac地址,如果没有,则向网关发送arp请求包。
  (2)本地网关收到其arp包后,回复相应的mac地址。
  (3)主机1收到arp回复,得到网关mac,更新相应的arp缓存。
2)主机向路由器1发送ping数据包,数据包的dst IP仍为主机2的IP,但dst MAC为路由器1的MAC。
3)路由器1收到该ping包后,进行如下处理:
  (1)网卡硬件发现dst MAC就是自己,于是硬件将包收上来,并在链路层拆包后,将包上交到IP层处理。
  (2)IP层发现该包的dst IP不是自己,于是检查是否开启了转发(路由器肯定都开了),然后在路由表中查找相关路由。
  (3)找到相关路由(本案例中为到路由器2的路由)后,将数据包中的dst MAC地址修改为下一条路由(路由器2)的MAC地址(IP仍不动),然后将数据包转发到路由器2.
4)路由器2在收到该数据包后,进行如下处理:
  (1)网卡硬件发现dst MAC就是自己,于是硬件将包收上来,并在链路层拆包后,将包上交到IP层处理。
  (2)IP层发现该包的dst IP不是自己,于是检查是否开启了转发(路由器肯定都开了),然后在路由表中查找相关路由。
  (3)找到相关路由(本案例中就是直连网络(或局域网))后,将数据包中的dst MAC地址修改为目的主机2的MAC地址(IP仍不动),然后通过连接局域网的网卡将数据包转发到主机2.
5)主机2在收到该数据包后,进行如下处理:
  (1)网卡硬件发现dst MAC就是自己,于是硬件将包收上来,并在链路层拆包后,将包上交到IP层处理。
  (2)IP层发现该包的dst IP就是自己,说明包就是发给自己的,于是进一步拆包,发现是ICMP协议。将包上交到ICMP协议进行处理。。
  (3)ICMP协议发现该数据为echo(回应请求数据),就产生一个响应包:echo-reply,封装好后交给IP层。
  (4)IP层确定原来数据包的src IP为响应的dst IP,并将src IP填为自己的IP,同时dst mac填为上层网关(路由器2)的MAC(事先已经缓存,如果没有,还得先走arp请求流程),并封装成IP包交到链路层,最终通过网卡发送出去。
6)路由器2会接收到响应包,然后按相同的流程将包传回到主机1.

注意:
1)网卡收包只检查MAC地址,不检查IP,因为IP是IP层的数据,网卡在链路层,IP对网卡是不可见的,网卡只能依据网络包的目的mac地址是否是自己来判断是否接收此包。
2)网卡对MAC地址的检查,以及决定是否接收包,都是由网卡硬件(或固件)自己做的,跟软件无关。
3)当网卡处于非混杂模式时,当网络包的dst mac不是自己时,网卡硬件会直接将包丢弃,网卡硬件只接收MAC地址是自己或广播包(这里指的是链路层的广播,mac地址为全F,如arp广播包),广播包收上来后在上层进行判断和处理;当网卡处于混杂模式时,网卡硬件会接收所有包。
4)局域网内(或直连),当给网卡配置网内IP地址时,会自动添加一条相应的路由,路由的设备为连接局域网的网卡。

3、混杂模式和集线器模式、交换机模式
1)混杂模式
混杂模式就是接收所有经过包括不是发给本机的包。默认情况下网卡只把发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。简单说,混杂模式就是指网卡能接受所有通过它的数据流,不管是什么格式,什么地址的。事实上,计算机收到数据包后,由网络层进行判断,确定是递交上层(传输层),还是丢弃,还是递交下层(数据链路层、MAC子层)转发。
注意:这里网卡判断数据包是否是发给自己的标准是根据MAC地址,不是IP地址。
2)集线器模式

集线器模式为老的集线器(Hub)采用的模式,在集线器模式下,连接在同一个集线器上的主机1、主机2和主机3,当主机1要向主机3发送数据时,当数据到达集线器后,集线器会向除了源主机“主机1”本身之外的所有主机发送数据,即主机3也可以收到“主机1”所发的数据。主机2判断到该数据是给自己的,就进行处理;主机3判断到所发的数据是给“主机2”的,而不是给自己的,就不进行处理。
3)交换机模式

新的交换机采用交换机模式,在交换机模式下,当主机1要向主机2发送数据时,当数据到达交换机后,交换机会分析目标主机“主机2”所在的端口,然后只向该端口发送数据,这样,其余主机就接不到由源主机“主机1”发出来的。这样,使得别的主机就不需要处理不属于自己的数据,从而减少了负荷。但这样做也有一些缺点,比如新主机的加入和当前在线主机的离开,通常都需要交换机花费一定时间来判断新的变化。当前绝大多数以太网所使用的都是交换机模式。
因此,当交换机使用交换机模式时,即使是将网卡设置成“混杂模式”,网卡通常也是接不到不是发送给自身的数据的,所接到的只是给自己的数据和广播数据(通过MAC地址判断)。

4、公网IP和私网IP
公网IP:需要申请,并由特定的运营商统一分配,每个公网IP都是唯一的,可作为主机的唯一标识。
私网IP:用于私有网络(如公司或家庭内网),可重复使用,由自己分配,但私有IP(和网络)不能直接链接到Internet,也就是不能直接连接到公网,必须通过网关代理、路由器等进行NAT(网络地址转换),将地址转换为公网IP后,才能访问公网。如下网段的IP地址用于私网IP:
  A类私有:10.0.0.1----10.255.255.254
  B类私有:172.16.0.1---172.31.255.254
  C类私有:192.168.0.1---192.168.255.254

4、案例分析
1)案例1
一台主机有两个网卡,一个连内网(私网IP),一个连外网(公网IP)。需要将此主机作为中间节点,将内网的网络包转发到外网中。如何配置。

具体组网如下:
内网主机1--转发(路由)主机2--大网---大网主机3
解决:
该主机需要完成的任务其实为一个标准路由器做的工作,但由于内网使用私网IP,还需要做一次NAT(实质是SNAT)。需要保证该主机上有到两端的路由,同时还需要配置一条SNAT规则。具体要求如下:
(1)内网主机1必须配置到该主机2的路由。由于内网主机1与该主机2直连,在给网卡配置IP时,就会默认添加这样的路由,所以,这个不需要单独配置。
(3)需要在该主机2上配置一条到主机3的路由,并开启转发ip_forward功能。该路由基于的网卡为连接外网的网卡。
(3)需要在主机2上配置SNAT规则,将来自主机1的包的src地址映射为主机2的大网网口地址。

(4)如果内网主机1需要收到外网主机3的包(或ack包),主机3上需要有到转发主机2的路由。ack包到主机2时,主机2会网络包的序号查询之前的SNAT缓存,然后将ack的dst IP映射(修改)为主机1的ip。这样就通了。
如果,需要从主机3主动访问主机1,那么需要在主机2上配置DNAT规则,进行dst地址转换。
SNAT和DNAT的区别在于发起者,如果发起者位于内网,则需要SNAT,如果发起者位于公网,则需要DNAT。


2)案例2
组网情况如下:

主机1--主机2--主机3
主机1、2、3是直连,主机1和主机3属于不同的网段,从主机1 ping 主机3的ip
此时,主机2不需要添加任何路由,只需要在主机2上打开转发功能,同时配置主机1到主机3和主机3到主机1的路由,即能ping通。
因为:直连情况下主机2到主机1、主机2到主机3之间的路由在配置ip时,就是默认创建好的。

5、题外话:协议栈源地址合法性检查
Linux协议栈中,在IP层收到数据包时,会进行数据包的源地址合法性检查,检查的基本原理为:
1、将数据包的src IP和DST IP进行交换,然后在本地的路由表中查找是否存在相关的路由,如果不存在,则判定非法,将包丢弃。
2、如果存在相应的路由,检查该路由基于的设备是否为收到此包的网卡设备,如果不是,也判定非法,将包丢弃。
当上述两个条件都满足时,则判定合法。如此检测可以在一定程度上防止数据包的篡改和地址欺骗相关的攻击。


阅读(2614) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~