开发者社区> nicenelly> 正文

程序员学网络之集线器和交换机

简介:
+关注继续查看

从网络实现 实现层面 网络可以划分为以太网、令牌环、FDDI、ATM,它们都规定了各自的物理介质、网络适配器(网卡)、数据传输协议。从网络 覆盖范围 可以划分为局域网、城域网、广域网。但是 这只是意味着网络的覆盖范围变大了而不是说网络的实现发生了变化。以现在的网络为例,无论是局域网、广域网、还是整个互联网基本上都是以太网 。

网卡

网络适配器即网卡,它是一个插在计算机主板上的(或者集成在主板上)硬件设备。在以太网中每个网卡都有一个全球唯一的48位标识就是我们常说的“MAC地址”(一般用每16进制每字节一组表示,比如:0a:00:27:00:00:06)。 当计算机通讯的时候网卡负责实现带冲突检测的载波监听多路访问技术(CSMA/CD) ,网卡属于OSI参考模型中的物理层和数据链路层。网络层以上的部分则由操作系统中的协议栈实现,所以 TCP/IP协议栈其实只包含了网络层(IP)和传输层(TCP、UDP) 。

程序员学网络之集线器和交换机

集线器

如果仅仅是两台计算机通讯那么通过网络传输介质(比如双绞线)把二者的网卡连接起来,在操作系统中配置网络层信息(配置IP地址)就可以了。如果三台或者多台计算机通讯则必须借助一些额外的设备,其中集线器就是其中一种。 集线器也叫Hub,它本质上是多端口的网卡,为了理解它的工作原理通过GNS3搭建一个网络拓扑:

程序员学网络之集线器和交换机

上面的拓扑中有三个终端,我们要做的实验是当PC1和PC2通讯的时候,在Hub1->PC3这条链路上是否能收到数据包。先配置PC1、PC2、PC3的IP地址

程序员学网络之集线器和交换机

程序员学网络之集线器和交换机

然后开启Hub1到PC3之间的抓包,通过PC1 ping PC2。

程序员学网络之集线器和交换机

ping一共产生了两种数据包:ARP数据包是广播包(目标地址是ff:ff:ff:ff:ff:ff:ff)只有广播域内的终端可以收到;ICMP则是单播(有明确目标地址)包只有处于冲突域中才可能收到数据包。集线器互联起来的机器都属于同一个广播域也属于同一个冲突域,所以无论是什么样的数据包,网络中的每个节点都会收到(即便数据包和自己无关)。

集线器和每个终端都有一个物理链路,当PC1发送数据到PC2的时候首先到达集线器,而集线器则把数据 从自己的每个端口发送出去 。所以 即便这次通讯和PC3没有任何关系但是Hub1到PC3之间的链路还是被占用了 ,如果此时PC3也有数据包要发送那么就会产生冲突(还记得以太网的原理吗?共享介质中会有“碰撞”),而这种冲突对于PC3来说是非常“无辜”的(PC1和PC2通讯和PC3根本没有任何关系)。

交换机

有些交换机的样子和集线器长的很像,但是二者有本质的区别。 交换机转发数据的时候有一定的策略,它是依据mac地址表执行的转发 。

程序员学网络之集线器和交换机

打开Swtich和PC3之间开启抓包,在Swtich和PC2之间开启抓包,然后从PC1 ping PC2(Wireshark会抓到交换机上的STP数据包,这是交换机产生的数据包,可以忽略)。


  1. SW1<->PC3  
  2. SW1<->PC2 

交换机非常“智能”,它“知道”PC1和PC2通讯不涉及到PC3所以只有广播包转发到PC3,而后续的单播数据包是直接发送到PC2所处的端口的。 区别于集线器,分割了冲突域,把一个大冲突域分割成了3个小冲突域(分别是Swtich和PC1、Swtich和PC2、Swtich和PC3),每个冲突域通讯的时候都不会影响另一个冲突域的终端(Swtich和PC1之间的数据包在PC2、PC3上都接收不到);而广播域没有变化三个终端还是属于同一个广播域。 通过描述PC1和PC2的通讯过程来揭示交换机的工作原理:

  • PC1根据PC2的IP地址查询去本地的ARP表中查询对应的MAC地址;
  • PC1没有找到MAC地址,则发送一条广播包;
  • 广播包达到交换机,交换机把PC1的Mac地址和对应端口放入到MAC地址表;

程序员学网络之集线器和交换机

交换机判断是广播包,则发起一次泛洪(从所有和PC1相同VLAN的端口发送出去);

  • 广播数据包分别送到PC2和PC3。PC3发现和自己没关系直接丢弃;PC2发现是发送给自己的数据包则接收数据包,进一步判断是ARP数据包则返回一个ARP回复。PC2的ARP回复是一个单播数据包,目标地址是PC1的MAC地址,源地址是PC2的MAC地址。
  • PC2的ARP回复数据包达到交换机,交换机把PC2的MAC地址放入到MAC地址表;

程序员学网络之集线器和交换机

  • 交换机发现是单播包,目标地址是“00:50:79:66:68:01”,查询得到对应端口是E0/1。则从E0/1把数据包发送出去;
  • PC1收到PC2的ARP回复数据包,把PC2的MAC地址写入到**本地的ARP表**;
  • PC1发送ICMP数据包,根据IP地址查询MAC地址;找到PC2的MAC地址是“00:50:79:66:68:02”。发送单播包,目标地址是“00:50:79:66:68:02”;
  • 单播数据包达到交换机,交换机判断“00:50:79:66:68:02”在端口E0/2,则从E0/2端口发送出去;
  • PC2收到ICMP数据包,产生一条ICMP的回复数据包发送出去;
  • ICMP回复数据包达到交换机,交换机判断目标地址是“00:50:79:66:68:01”(PC1)则从E0/1发送出去;
  • PC1收到ICMP的回复数据包,显示一条 “84 bytes from 192.168.10.12 icmp_seq=1 ttl=64 time=0.649 ms”提示;

通过分析我们看出交换机中最重要的内容就是MAC地址表,它是交换机转发数据包的依据。有了这张表交换机就可以知道数据包应该从哪个端口出去,而不是像Hub一样从所有端口发送出去。 通过分析不难看出和Hub比较交换机中最重要的内容就是 MAC地址表,它是交换机转发数据包的依据 。有了这张表交换机就可以知道数据包应该从哪个端口出去,而不是像Hub一样从所有端口发送出去。 通过在交换机的CLI界面中输入 show mac address-table 查看本台交换机的MAC地址表

程序员学网络之集线器和交换机

交换机中为了读取速度会把MAC地址表保存在一种专用的存储硬件上叫:CAM (Content Addressable Memory) ,这种存储器区别于常见的内存,它的寻址方式是基于“内容”(内存是基于地址)。所以制作工艺上要复杂很多,价格也要贵很多,一般交换机配置的容量都不是特别大。交换机的这个“弱点”导致了一种“无解”的攻击方法——通过向交换机发送大量的ARP信息塞满CAM,让交换机无法正常工作。

虚拟局域网

交换机把以太网的冲突域切分成多个冲突域,提高了线路的利用率,但是所有人还是在同一个广播域,这种网络结构是早期的网络结构,它只有一个广播域,当网络中任何一个终端发送广播数据包其他节点都可以收到,因此而得名平面型网络。这种网络结构会产生如下问题: 1. 安全问题,大家都在同一个广播域任何一个人中了病毒都会影响所有人;更要命的是如果有人非法接入到网络中可以轻而易举的监听到网络中所有的数据包; 2. 带宽利用问题,网络中任何人都可能消耗大量带宽,其他人可能会因此而受到影响——甚至无法正常使用网络; 3. 广播风暴,试想一个上百台终端接入到网络中,各种广播数据包(ARP、DHCP等)会充斥在整个网络中; 把一个大的LAN(广播域)拆分成多个小的LAN不但安全、便于管理而且可以均衡资源利用、提高线路利用率。那么如何拆分呢?划分方法还是体现在交换机上,我们为每个交换机端口设置一个数字标识,相同数字标识的端口属于同一个广播域。比如下图中交换机E0/1、E0/2、E0/4、E0/7有相同的标识100;E0/3、E0/6相同的标识300(下图是交换机的示意图)

程序员学网络之集线器和交换机

这种技术就叫——虚拟局域网(Virtual Local Area Network,VLAN),一个VLAN就代表一个广播域(Broadcast Domain,BD),每个交换机端口都可以设置一个VLAN ID标识广播域,交换机在相同VLAN ID内执行广播数据包叫 泛洪 。

通过在交换机的CLI界面中输入 show vlan 查看本台交换机的所有VLAN(或者叫广播域、BD、在OpenStack之类的系统中叫网络)

程序员学网络之集线器和交换机

第一列VLAN表示VLAN ID,它是一个数字,name是一个备注名,ports表示当前有哪些端口属于这个VLAN

我们做个试验,把PC1和PC2放到VLAN 100,把PC3放到VLAN 200

程序员学网络之集线器和交换机

此时,通过PC1 ping PC2是正常,PC1 ping PC3则失败。

程序员学网络之集线器和交换机

通过在SW1<->PC3之间抓包我们发现ARP数据包根本没有抵达这条链路上,说明SW1已经识别出它们属于不同的VLAN(广播域)所以不会把数据包转发到这条链路上。

为了证明交换机转发只和MAC地址有关系,我们把PC3的IP地址修改成192.168.10.10

程序员学网络之集线器和交换机

发现PC1<->PC2依旧可以正常通讯,证明交换机只查看数据包的MAC地址而完全无视IP地址。

那么如何实现不同的VLAN之间通讯呢?这就需要另一个网络设备——路由器。这是一个非常复杂的课题,可以说它是构建互联网的基础,所以我们需要花费单独的章节讲解。


本文作者:佚名

来源:51CTO

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
程序员的成长路线
工作这么些年了,看到了各种各样的程序员,也看到了各种各样的成长路线,说说自己的一些观点吧。 作为技术人员,在刚起步阶段时,首先需要拓宽自己的技术宽度,对自己所做的项目/产品所涉及的方方面面的技术都应该有所了解,另外对于就是学习工程化,让自己真正具备开发商业软件的能力。 在工程化和知识宽度达到一定
8084 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
30461 0
好程序员web前端培训分享如何理解JS的单线程
好程序员web前端培训分享如何理解JS单线程,JS本质是单线程的。也就是说,它并不能像JAVA语言那样,两个线程并发执行。 但我们平时看到的JS,分明是可以同时运作很多任务的,这又是怎么回事呢? 首先,JS的代码,大致分为两类,同步代码和异步代码。
739 0
网络资源-黑马程序员Java 知识——精华总结
获取更多资源Java帮帮IT资源分享网 一、黑马程序员—java 概述与基础知识.................................................................................6 1、何为编程?..............................................................
2301 0
从三流小公司到一线大厂,聊聊程序员的成长之道
阅读本文大概需要 2.8 分钟。 作者:黄小斜 文章来源:程序员江湖 ​ 我想,没有一个程序员能够一步登天,一下子达到很高的高度,有些路是我们必须要走的,有些阶段是我们必须要经历的。有入门,才有进阶,才有更上一层楼。
1432 0
黑马程序员 十一、网络编程
Java帮帮-IT资源分享网  十一、黑马程序员—网络编程 第 11 天:网络编程(1)  1、什么是网络编程? 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算 机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后 接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是 一个
1328 0
黑马程序员 六、线程技术
Java帮帮-IT资源分享网  六、黑马程序员—线程技术 第六篇  1、进程和线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中 可以有多个线程。比如在 Windows 系统中,一个运行的 xx.exe 就是一个进程。 Java 程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程) 线程是指进程中的一个执行任务(控
1292 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
21380 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23641 0
+关注
716
文章
646
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载