一直有一个疑问:局域网的主机之间是如何将数据包发出去的 ? 求细节。

我目前的真实网络环境:

路由器(家用)的IP地址为192.168.1.1;

主机A地址192.168.1.100;

主机B地址192.168.1.102;

主机A的路由表:

主机A的arp表:

当主机A来ping主机B时,数据包是怎么发送到B的呢?

先说说我的理解:因为主机A与网络通信只有一条路径,所以数据包将会被转发给默认路由(192.168.1.1),然后由路由器将该包转发给主机B。具体是:A将数据包转发给路由器,路由器发送一个ARP广播查找主机B的MAC地址,得到MAC地址后,路由器通过链路层将数据发给主机B。(这里有一个ARP广播,我认为这个ARP广播应该由路由器发出,广播中的源地址(包括IP和MAC)地址都应该是路由器本身的,而不是主机A的。)

但抓包结果(见下图)来看,主机A应该是直接将数据包发给了主机B。这是因为,主机A发了一个ARP广播来寻找主机B的MAC地址,且得到了应答。(主机A所发的ARP广播中的源地址(包括IP和MAC)都是主机A本身的)。那么接下来,有了MAC地址后,主机A是怎么直接将数据发给主机B而没有通过路由器的呢? A与B虽然是同一网络,但未直接相连啊。

上面第4个包,ARP的应答包,源MAC地址是主机B,目的MAC是主机A,这个包在链路层是直接由B发给A的呢,还是B发给路由器然后由路由器转发给A的呢?

总结一下,问题应该是:同一局域网中,在链路层,各主机之间是如何发送数据的 ?

从ping的结果看,局域网内主机是直接通信,未经过路由功能,因为ping数据包中的TTL值未改变。如下:

当用主机A来Ping一个外网地址时,如 ping 20.20.30.40

这时就容易理解了,比对了目的IP地址后,选择默认路由,该ICMP数据包(ping包)是通过默认路由(192.168.1.1)来转发出去的。抓包也未发现有ARP广播数据。

---------------------------------------------------------------------------------------    分  割  线   ------ -----------------------------------------------------------------------------------------------

回答:

路由器(非纯路由功能的),具有交换机的功能;局域网内主机间通信的时候,路由器被当做了交换机来使用。

交换机只工作在局域网内,不具有路由器的功能,只能实现数据包的转发,其解包只能解链路层协议,再往上层(IP层及以上)都不会被解析。

路由器工作在网络层,具有路由功能,解包只能解IP层协议(链路层解过之后才解的)。通常,路由器具有交换机的功能。(注意:纯路由功能的路由器不具有交换机的功能)。

家用路由器,忽略wan口以后就成了一个有4个lan口的交换机。事实上家用路由器由一个真路由器和一个交换机组成,路由器由两个端口,一个就是wan口,另一个藏在内部与交换机相连,交换机露出4个lan口。

路由器收到一个数据包后的处理过程

个人理解一:

对于(具有路由和交换功能的路由器)接收到的数据包,首先解链路层协议,根据其上层协议类型(由Type字段标识),决定将该数据包如何处理。

1)  如果其上层协议不是IP协议,则这时路由器被当做交换机使用,根据该包的MAC地址将该包转发出去;

2)  如果其上层协议是IP协议,则交由IP层解析(这时路由器又被当做路由器来使用了,使用其路由功能)。

a)  如果该目的IP地址与源IP地址属于同一局域网内,这时该包将被直接通过交换机口转发出去(TTL不减1,不需要重新计算IP头部校验和,因此Ping局域网内机器时,TTL值与源端发送时设置的相同);

b)  如果不属于同一局域网,则查找路由表进行路由。

注意:上面的过程属于个人理解,未得到验证。另外,上述1)和2)a),描述了属于直接转发数据包到目的地址的情况,其判断是否也可以直接拿数据包中的目的MAC来与路由器中的ARP表项比对呢?如果匹配了一项,则直接转发;如果不匹配,则进行路由。

个人理解二:

对于一个收到的一个数据包,解析其链路层协议,如果链路层中的目的MAC与路由器的MAC不同,则直接转发(其中,包括广播和多播的情况,需要转发到交换机的多个接口);如果链路层中的目的MAC就是路由器的MAC,则需要进行路由。

关于这两种理解,都是个人理解,未得到难。这应该属于路由器和交换机实现上的两种方式。这两种方案,都印证一点:局域网主机间通信时,路由器被当被交换机来使用,而未使用其路由功能,因为数据包的TTL值未改变,说明未经过路由。

在三层交换机(即路由器)上,VLAN之间的互通是通过实现一个虚拟VLAN接口来实现的,即针对每个VLAN,交换机内部维护了一个与该VLAN对应的接口,该接口对外是不可见的,是一个虚拟的接口,但该接口有所有物理接口所具有的特性,比如有MAC地址,可配置最大传输单元和传输的以太网帧类型等。在上述的说明中,我们提到了当交换机接收到一个数据帧时,判断是不是发给自己的,判断的依据便是查看该MAC地址是不是针对接收数据帧所在VLAN的接口MAC地址,如果是,则进行三层处理,若不是,则进行二层处理,按照上述流程进行转发。

(上面这段摘自: http://skyeagle.blog.51cto.com/417071/93338 ,理解二应该是现有的实现方案)

对于上面的问题:

局域网主机A发给主机B数据,

主机A发一个ARP广播到路由器,路由器解析到链路层协议,得到目的地址为全1的MAC地址,然后在每个内网网口(路由器的4个LAN口,相当于交换机的接口)上发一份数据。
主机B收到数据后,给出ARP应答。应答源MAC是B,目的MAC是A。将该应答包发给路由器,路由器收到数据后,同样解包并发给A。

可见,无论A与B直接通信,没有经过路由功能,因为ping的结果显示,TTL值未改变,说明未经过路由功能。

但无论如何,局域网内的主机通信是经过了路由器,只是这时路由器被当做了交换机来使用,而未使用其路由功能。

局域网内主机发送一个数据包时,

(注:局域网内不需要使用路由功能,此时路由器均是被当做交换机来使用的。路由器是运行在网络层的,其在链路层作为交换机来使用

1)  发送端(192.168.1.00)IP层先查看主机的IP地址,通过查找主机上的路由表,选择一条路由。

如上路由表,当ping 192.168.1.101时,选出的表项是红色标注的一条。目的网络是192.168.1.0,通过本地网口192.168.1.100发送出去,但Gateway是On-link。注意,On-link的意思是直接相连,不需要经过路由,可将数据包直接发送至目的地址。这时路由器将被当做交换机来使用。

2)  由于可直接将数据包发送至目的地址,这时需要查找目的IP地址(192.168.1.101)对应的MAC地址。需要查找arp表。

如上arp表,未找到目的IP地址192.168.1.101对应的表项。于是主机发送一条ARP广播(链路层)。

3)  这时路由器被当做交换机来使用,收到arp广播后,转发给交换机上的各个接口(LAN口)。

4)  目的主机(192.168.1.101)回复一条ARP应答,发给路由器(当做交换机来使用),由路由器转发。

5)  发送端得到了目标主机的MAC地址,将ICMP包(ping包)发送出去,同时更新自己的arp表,将目标主机的表项加入进去。加入之后

6)  路由器(这时被当做交换机来使用)接收到发送端的ICMP包,并接其转发给目的主机。

注意:此时发送端已经更新了arp表项,这时如果再和目的主机192.168.1.101通信,就不需要再发送arp广播了。因为,通过arp表已经能够查到目的主机的MAC地址了。只有当通过arp表查不到MAC地址时,才需要链路层发送ARP广播。 但如果一段时间内未与目标主机通信,那么路由表会再次将该表项清除。

局域网主机间发包细节相关推荐

  1. 同网段不同网段主机间通信原理

       在当今的以太网络通信中,在IP数据包中有两个必不可少的地址,那就是IP地址和网卡地址(即MAC地址),在数据包中,无论是IP地址还是MAC地址,都有源地址和目标地址,因为通信是双方的,所以就必须 ...

  2. 关于同网段内主机之间通信细节

    关于同网段内主机之间通信细节 @(计算机网络) 如果主机A向处于同一子网段的主机B(IP地址为172.16.204.89/16)发送一个分组,那么主机A使用的"这个网络上特定主机" ...

  3. FTP网络主机间文件传输指令

    FTP网络主机间文件传输指令 简介 使用方法 指令 登录ftp服务器 进入ftp协议后的常用Linux指令均可正常使用 dir指令 指定文件传输类型 get mget put 关闭与ftp登录后建立的 ...

  4. 同网段及跨网段主机间通信原理

    在当今的以太网络通信中,在 IP 数据包中有两个必不可少的地址,那就是 IP 地址和网卡地址(即 MAC 地址),在数据包中,无论是 IP 地址还是 MAC 地址,都有源地址和目标地址,因为通信是双方 ...

  5. linux centos7 设置主机间时钟同步

    linux centos7 设置主机间时钟同步 安装ntp服务 yum -y install ntp 开启ntp服务 systemctl start ntpd 设置ntp服务开机自启 systemct ...

  6. Hadoop集群搭建(二:集群主机间免密登录配置)

    实验目的及要求: 静态网络地址配置: 主机名的配置: 防火墙的配置,使平台相关软件的常用端口能够远程正常访问: 主机地址映射的配置,使所有主机能够通过主机名相互正常访问: 免密码登录的配置,使所有主节 ...

  7. python3+scapy扫描获取局域网主机ip和mac

    python3+scapy扫描获取局域网主机ip和mac ''' python3 安装scapy-python3 注:linux,可能需要以root登陆,避免出现permission error Sc ...

  8. 利用一根同轴电缆互连主机构成以太网,则主机间的通信方式为( )

    利用一根同轴电缆互连主机构成以太网,则主机间的通信方式为( B ) A. 全双工 B. 半双工 C. 单工 D. 不确定 传统以太网采用广播的方式发送信息,同一时间只允许一台主机发送信息,否则各主机之 ...

  9. MongoDB在不同主机间复制数据库和集合的教程_MongoDB_脚本之家

    MongoDB在不同主机间复制数据库和集合的教程 更新时间:2016年07月04日 15:49:51   作者:lucifercn MongoDB自带了clone一族JavaScript函数来进行数据 ...

最新文章

  1. enyo官方开发入门教程翻译一Layout之Fittables
  2. 【C++】欧几里德算法快速求最大公约数
  3. 关于容器迁移、运维、查错与监控,你想知道的都在这里了
  4. dxf转nc代码软件_FastCAM激光版套料软件
  5. 数十种TensorFlow实现案例汇集:代码+笔记
  6. VS2010打开旧版本MFC工程无对话框
  7. 手把手编写自己的PHP MVC框架实例教程
  8. nginx location正则匹配规则
  9. 数字后端设计流程小结
  10. scala发送邮件设置参数
  11. js获取注册表中应用程序的路径,并通过注册表打开
  12. docker编译speccpu2017
  13. 面试:MySQL篇,详尽知识点总结
  14. 躁!DJ 风格 Java 桌面音乐播放器
  15. msgbox窗口学习总结窗体复合框
  16. 移动测试基础 Android 应用测试总结
  17. 持续集成(第二版)(转)
  18. 网站劫持后通过什么好办法可以修复?
  19. type有字体的意思吗,type用中文怎么说
  20. 制作简易的个人主页(代码笔记)

热门文章

  1. 工具人在Excel使用中经常遇到的几个问题及解决方法的分享
  2. 粉姐个人单曲《0度的死角》发行 个人IP打造咨询师惊喜跨界音乐
  3. 支付宝转账(实现用户提现功能)
  4. JavaScript中将(时间戳)毫秒转化为年月日时分秒格式
  5. 名帖91 宋徽宗赵佶 楷书《千字文》
  6. Python使用QQ邮箱smtp服务发送邮件
  7. 北京-京东-Java实习面经(附答案)
  8. c语言ascii字母比较大小,与ASCII码相关的C语言字符串操作函数
  9. 从零开始构建gRPC的Go服务
  10. 【我的Android进阶之旅】如何在Android中使用ARCore来增强人脸Augmented Faces?