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

从网络实现 实现层面 网络可以划分为以太网、令牌环、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

时间: 2024-12-31 05:49:31

程序员学网络之集线器和交换机的相关文章

网络编程程序员看网络协议

网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协议簇, 所以对于初学者来说去读大部头的<TCP/IP协议>也不是一件很合适的事情,因为深入了解TCP/IP协议是网络编程提高阶段,也是深入网络编程底层时才需要做的事情.对于一般的网络编程来说,更多的是关心网络上传输的逻辑数据内容,也就是更多的是应用层上的网络协议,所以后续的内容均以实际应用的数据为基础来介绍网络协议的概念. 那么什么是网络协议呢,下面看一个简单的例子.春节晚会上"小沈阳&

致敬程序员日,盘点云计算的天才程序员

10月24日是程序员日,在这个特殊的日子里笔者为大家盘点几位云计算技术背后的天才程序员.在过去的大半个世纪中,计算机科学界涌现出了一批不世出的天才:阿兰·图灵(Alan Turing).高纳德(Donald Knuth).艾兹赫尔·戴克斯特拉(Edsger Dijkstra),这些振聋发聩的名字背后是建立了彻底改变人类生活的现代计算机工业,这些人的影响力是如此之大,不但改变了整个世界,同时也赢得了全球的尊重. Martin Casado,人们往往尊称其为软件定义网络之父,当然除此之外,Marti

全球程序员流入量最大的五座城市中印度占四席

一个顶级程序员能够对脸谱.苹果或谷歌有所贡献,但不可能从根本上改变这些大公司,而这位程序员如果加盟某个小企业,他要么失败,要么 就会成为百万富翁.在印度软件猎头公司骇客排名的联合创建人维维克拉夫森克看来,尽管美国硅谷正开出远超以往的高薪吸引印度顶级软件人才,但现如今印度才应是全球信息技术精英的向往之地.他在最近结束的一次网上程序员招募大赛后表示,目前全球程序员流入量最大的五座城市中,印度占四席,印度程序员不再 一心向往美国.印度软件人才市场近几年正在经历残酷的优胜劣汰.目前,印度有超过400所大

程序员成长规划

引言 我的程序员成长之路 程序员的成长经历往往很相似,大部分的人走过了最前面相同的一段路,而有的人则走得更远.总结自己这些年来的历程,这也许能让年轻的程序员少走一些弯路,成长得更快:或许更好一些,能让大家从中得到一些启发,早日进入优秀程序员的阶段,实现梦想,释放激情. 第一阶段,最初是在学校里学习计算机基础知识,学习经典的程序设计语言,编写测试用的小程序.这个过程可以说是对计算机和程序设计的入门阶段.这个阶段主要是培养了自己对计算机软件的兴趣,打下了良好的计算机基础知识. 第二阶段,而后参加工作

我想对所有新手程序员说些肺腑之言

我编程的时间,已超过 20 年了.截至目前,我开的编程入门课,也有六七门了.传授编程的总时间,大约也有 1000 小时了.下面这些话,没有特别的前后顺序,我对自己学员不止说过一次. 欢迎来编程. 编程真的的很难 无论你是多么擅长编程,能拖慢你脚步的唯一因素是你学习和解决问题的能力.随着你的编程愈发提高,你更能体会我这句话了.编程还有个有趣的地方,永远不会觉得枯燥.如果你觉得枯燥,那估计你在什么地方做错了,你应当对在写的代码,做一下抽象,或者优化. 编程同样也会是最让你沮丧的事情之一 正常的编程经

我是一名老程序员!如何学习java-web

问题描述 我是一名老程序员!今年34,我想学习java-web,以前有些基础做过VB项目.也做过一些简单的java-web项目,也就是用JDBC连接数据库,认识JAVA的一些基本元素,不知道从那里学起,还来得及吗. 解决方案 解决方案二:servletjsp然后再结合自己需求再看看哪些需要解决方案三:如果你搞开发多年,你应该懂得怎么学习了,不应该彷徨了.呵呵.VB9和c#基本差不多少.学java也快.主要是多练习,熟悉就好了.解决方案四:兄台,你的工作经验比我们多得去,对于久混于IT的人,却对新

c-自学成基础网络程序员

问题描述 自学成基础网络程序员 我是一名大二生,希望能去实习,做网络程序员,需要学哪些基础技能呢?谢谢 解决方案 建议你先打好基础,你什么都不会,即使去实习,也只能安排你在非技术岗位,你能学到什么?关键看自己用功. 解决方案二: 建议学习WAP或者java 解决方案三: 先学习一个编程语言,然后就是tcpip网络协议,计算机网络知识.操作系统等等. 解决方案四: 你可以参考一下网络工程师考试所需要掌握的知识.这样方向性更明确. 解决方案五: 基础还是很重要,先打好基础吧 解决方案六: 看你对哪方

程序员之路——一个老程序员对刚上大学的学弟学妹的忠告

始终认为,对一个初学者来说,IT界的技术风潮是不可追赶. 我时常看见自己的DDMM们把课本扔了,去买些价格不菲的诸如C#, VB.Net 这样的大部头,这让我感到非常痛心. 而许多搞不清指针是咋回事的BBS站友眉飞色舞的讨论C#里面可以不用指针等等则让我觉得好笑. C#就象当年的ASP 一样,"忽如一夜春风来,千树万树梨花开",结果许多学校的信息学院成了"Web 学院". 96, 97级的不少大学生都去做Web了.当然我没有任何歧视某一行业的意识. 我只是觉得如果他

黑马程序员 十一、网络编程

Java帮帮-IT资源分享网  十一.黑马程序员-网络编程 第 11 天:网络编程(1)  1.什么是网络编程? 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算 机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后 接受另外一个设备反馈的数据.现在的网络编程基本上都是基于请求/响应方式的,也就是 一个设备发送请求数据给另外一个,然后接收另一个设备的反馈.在网络编程中,发起连接 程序,也就是发送第一次请求的程序,被称作客户端(Client)