Skip to content

Instantly share code, notes, and snippets.

@chenchun
Created September 16, 2016 01:40
Show Gist options
  • Save chenchun/80b5df795650ec4282be570e9e13ee96 to your computer and use it in GitHub Desktop.
Save chenchun/80b5df795650ec4282be570e9e13ee96 to your computer and use it in GitHub Desktop.
route.md
主机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地址时,会自动添加一条相应的路由,路由的设备为连接局域网的网卡。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment