zoukankan      html  css  js  c++  java
  • 网络通信过程

    假定

    A------->B,发送Ping

    过程

    1. A已知信息(A_IP、A_MAC、B_IP),A未知信息(B_MAC)
    2. A通过子网掩码计算自己的IP地址和B_IP是否属于同一网段

    A和B属于同一网段

    l  A发送ARP请求,ARP信息为(A_IP、A_MAC、B_IP、广播MAC:FF-FF-FF-FF-FF-FF)

    l  同网段所有设备均收到A的ARP请求,但是只有B能够解析

    l  B发送ARP回应,ARP信息为(A_IP、A_MAC、B_IP、B_MAC)

    l  A和B开始通信

    A和B属于不同网段

    l  A发送ARP请求,ARP信息为(A_IP、A_MAC、B_IP、广播MAC:FF-FF-FF-FF-FF-FF)

    l  同网段所有设备均收到A的ARP请求,网关收到该ARP请求,给予ARP回应(A_IP、A_MAC、B_IP、网关_MAC)

    l  A发送数据,其中包含信息(A_IP、A_MAC、B_IP、网关_MAC)

    l  网关收到这个数据包后,发现目标MAC是自己,而目标IP却是别人,所以它不可以再往上打开这个数据包,它要做的工作就是把这些数据包发给下一跳路由器(如果网关自身就是一台路由器的话),如果网关是一台普通PC,那么它就发给路由器,让路由器把这些数据包正确传输到远程目标网络,到达远程网络后,它们的网关再将数据包发给数据包中的目标IP,即源主机A苦苦寻找的目标主机B,从而真正结束不同网络之间的通信,回应的数据包也是用同样的方法到达目的地,在这里,还需要注意的是,当网关把数据包发给下一跳路由器时,这个数据包必须由网关把目标MAC改成下一跳路由器的MAC地址(通过ARP得到),否则下一跳路由器收到目标MAC不是自己的数据包,会丢弃不予理睬,下一跳路由器再发给下一跳路由器同样要把目标MAC地址改为下一跳路由器的MAC地址再发出去!

    总结

    在网段通信时,数据包中的地址就是源IP,目标IP,源MAC,目标MAC,根本用不到网关,而当检测到需要把数据包发到远程网络时,这时,目标MAC就必须改变了,在还没有出内网时,目标MAC必须写成网关的MAC地址发出去,当网关收到时,再把目标MAC地址改成下一跳的MAC地址发出去,而源IP和源MAC以及目标IP不曾改变,就算到达了公网上,目标MAC仍然在不断改变着,直到最后,这个数据包到达目标IP的网络,最终通信结束!

    实际举例

    PC0(ip0/mac0)------SW(ip1/mac1)---------ROUTER(ip2/mac2)---------PC1(ip3/mac3)

    假设是第一次通信,有路由器存在,跨网段的通信哦。

    SW:交换机。

    ROUTER:路由器。


    1.PC0开始Ping PC1,因为是跨网段的通信,所以要先发ARP包请求网关的MAC地址,要拿到网关的MAC地址才能正确封装数据。这时ARP包(注意这里是ARP包,不是你的Ping包)(广播地址:FF:FF:FF:FF:FF:FF)

    {PC0发送arp包:sour--(ip0/mac0),det--(ip3/FF:FF:FF:FF:FF:FF)} (网卡发送)


    2.当Sw收到PC0的ARP包,先学习,将PC1的MAC地址记录下来并和对应的接口绑定,形成CAM表,因为SW没有学习到关于PC0 的网关的任何表项,所以将此ARP包进行泛洪,包的内容并没有修改。

    {SW的cam表:(学习mac0/网卡口}

    {SW发送arp包到ROUTER:sour--(ip0/mac0),det--(ip3/FF:FF:FF:FF:FF:FF)}(每个网卡口泛洪)


    3.当ARP包到达了router,router先记录PC0的IP地址和对应的MAC地址,然后会响应这个ARP包,并作出回应,回应的这个ARP,源IP为router接口IP,源MAC为router接口MAC,目标IP为PC0的IP,目标MAC为PC0 的MAC。。这个ARP回应发回给SW,Sw学习这个MAC地址,并记录到CAM表,然后转发给PC0。

    {ROUTER的cam表:存在(ip3/mac3/网卡口号); 学习(ip0/mac0/网卡口号);}

    {ROUTER发送arp包到sw:sour--(ip2/mac2),det--(ip0/mac0)}

    {SW的cam表:存在(mac0/网卡口号);学习(mac3/网卡口号)}

    {SW发送arp包到PC0:sour--(ip1/mac1),det--(ip0/mac0)}

    {PC0的arp表:学习(ip1/mac1/网卡口号);}


    4.这时 PC0已经有了网关的MAC地址,Ping包就可以正常发送 ,Ping包格式源IP是PC0的IP,源MAC为PC0的MAC,目标IP为PC1的IP,目标MAC为PC0的网关的MAC。

    {PC0发送ping包到SW:sour--(ip0/mac0),det--(ip3/mac1)}

    {SW发送ping包到ROUTER:sour--(ip1/mac1),det--(ip3/mac2)}


    5.

    如果ROUTER没有连接PC1:

      当PC0的Ping包到达路由器,路由器这时就要查看自己的路由表,发现有连接有PC1的这个网段,但是路由器没有PC1的MAC地址,无法将此包进行封装转发,封装失败,就将这个包丢弃


    如果ROUTER连接了PC1:(ROUTER里面arp表中PC1的(ip3/mac3)建立)
      1、路由器这时就从连接PC1网段的这个接口发送ARP包,源IP地址,连接PC1的接口IP地址,源MAC地址,连接PC1的接口MAC地址,目标IP地址,PC1的ip地址,目标MAC地址全F。
      2、当PC1收到这个路由器发送的ARP包,进行相应,将自己的MAC地址返回给路由器。
      3、路由器这个时候就获取了PC1的IP地址和对应的MAC地址。


    当完成了以上的过程,交换机和路由器各个接口连接设备的MAC地址就全部知道了。
    当第二个Ping包过来的时候就可以正常的转发了。
    对于交换机的工作原理一定要弄清楚。
    对于交换机来说,它只能看到2层的东西,它并不能查看到IP地址,只有路由器可以查看IP头部。

    以上全是通过大佬博客的分析总结并非原创:

    https://blog.csdn.net/cy_cai/article/details/44836369

    http://blog.chinaunix.net/uid-20637638-id-70255.html

  • 相关阅读:
    磁盘冗余阵列之RAID 5
    磁盘冗余阵列之RAID10
    Linux常见的命令与vi的介绍
    通过挂在系统光盘搭建本地yum
    Windows 2008 系统安装
    在windows主机中,利用XSHELL生成“密钥”进行虚拟机与物理机的传输
    在VMware下进行的使用ssh服务管理远程主机
    Linux中的快捷方式
    Linux中常用命令
    Linux中vi命令的详细总结
  • 原文地址:https://www.cnblogs.com/sheng-se/p/14309061.html
Copyright © 2011-2022 走看看