Github

本系列文章旨在向程序员分享一些网络基本知识,让程序员具备基本的网络常识,以便与网络工程师沟通。本系列文章不会涉及如何配置交换机、路由器等网络设备的内容,所以不适合想考CCNA/HCNA证书的人士。

网络模型及网络设备

网络分层模型

相信所有的程序员都听说过网络分层模型,那我们说说最常提到的OSI参考模型与TCP/IP模型。

很多人常说的7层网络就是指OSI参考模型,其模型一共分为7层,自下而上分别是:物理连接层、数据链路层、网络层、传输层、会话层、表现层、应用层。

而TCP/IP模型可以被认为是对OSI参考模型的简化,其一共有4层,自下而上分别是:网络接入层、网际互联层、传输层、应用层。

下图对这两种模型做了一个比较:

下面简单讲一下2-4层PDU所包含的关键信息(不是所有信息):

  1. L2:Data Link,PDU:Frame,包含:源MAC地址、目标MAC地址
  2. L3:Network,PDU:Packet,包含:源IP地址、目标IP地址
  3. L4:Transport,PDU:Segment,包含:源端口、目标端口

网络设备

用于建网的网络设备一般有交换机(Switch)和路由器(Router)。其中交换机工作在OSI模型第二层,所以也被称为二层设备(L2 Device),路由器工作在OSI模型第三层,所以也称为三层设备(L3 Device)。

交换机

回顾上图,L2有一个用途是MAC Addressing,所谓MAC Addressing即MAC寻地,每一块网卡(NIC)都有一个MAC地址,比如在Linux运行ifconfig能够看到NIC的MAC地址,注意看下面的HWaddr:

ens33     Link encap:Ethernet  HWaddr 00:0b:29:2b:25:10inet addr:192.168.1.246  Bcast:192.168.1.255  Mask:255.255.255.0inet6 addr: fe80::20c:29ff:fe2b:2510/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:5253258 errors:0 dropped:0 overruns:0 frame:0TX packets:6680389 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:2384306523 (2.3 GB)  TX bytes:9150388800 (9.1 GB)

MAC地址是网卡的物理地址,该地址理论上是全世界唯一的,不过现实生活中只需要保证在同一个LAN(局域网,或称二层网络)中唯一即可。

交换机是一个工作在L2的设备,即它是依靠MAC地址来使处于同一个LAN中的两个NIC相互通信的。

交换机是一个有很多端口(Port)的设备,每个NIC通过网线连接到其中的一个端口,比如PC-1(假设只有一个网卡)连接在Port-1、PC-2(假设只有一个网卡)连接在Port-2。交换机内部会维护一张“MAC地址表”,它存储来MAC地址->Port的对应关系。

交换机在某个端口收到数据后,会查看Frame(上图中Data Link层的PDU)中的目的地MAC地址,然后根据“MAC地址表”找到对应端口,然后将数据转发到这个端口。

但是我们在现实生活中从来没有使用MAC地址来通信对不对?我们都是使用IP来通信的,比如:ping 192.168.1.20。这是因为操作系统会使用ARP协议来获知192.168.1.20的MAC地址,而交换机在此过程中会学习到这个信息,并且记录到“MAC地址表”中(具体过程本文不做详述)。

关于ARP协议、以及交换机的其他功能细节本文不做详述,读者朋友只需知道交换机是一个二层设备,它维护了一张“MAC地址表”并运用此表让处于同一个二层网络的两个网卡通信就可以了。

路由器

交换机只能让处于同一个二层网络的两个网卡进行通信,如何让处于不同二层网络的设备是通信呢?

答案是使用路由器(Router),路由器是一个三层设备(L3 Device),它的作用是将两个二层网络连接起来,使其能够互相通信。

下图是一个将两个二层网络连接起来的例子:

在这张图中可以看到有两个子网——192.168.1.0/24和192.168.2.0/24(如果你不知道这是什么,不要紧张,我们会在子网分割章节详细讲解),它们是两个独立的二层网络。路由器1有两个端口,一个端口连接在交换机1上,IP是192.168.1.1;另一个端口连接在交换机2上,IP是192.168.2.1。

当PC1要和PC3通信的时候,比如ping 192.168.2.10,它会发现PC3和自己不在同一个子网中(究竟是如何知道的你现在不用关心,我们会在子网分割章节中详细讲解),那它数据交给路由器1,路由器1它会读取Packet(Network层的PDU)中的目的地IP地址,发现是192.168.2.10,结合其内部的路由表(关于路由表本文不做讲解)决定将其转发到交换机2,交换机2再转发到PC3.

我们再考虑一个更贴近现实的问题,我们的电脑是如何访问到baidu.com的呢?

实际上当访问baidu.com的时候你的数据是经过多层路由器,最终到达baidu服务器的,如下图:

你也许会问,路由器是一个L3设备,它是通过IP来转发数据的,那它是怎么知道baidu.com的IP地址呢?实际上路由器并不知道baidu.com的IP地址,操作系统在发送请求的时候会将baidu.com转化为IP地址放到Packet中传递给路由器。关于这个我们会在DNS章节中做详细说明。

为何程序不能获得源MAC地址?

实际上这个问题本身存在一个错误的假设,我们已经知道在同一个二层网络中是直接通过MAC地址来通信的,在这种情况下我们是可以获得MAC地址的。但这只是极少的一种情况,因为大部分时候我们都必须经过路由器才能访问网络的。

我们再来看这张图:

在列出详细步骤前先补充一个知识:路由器的每个端口都是一个独立的网卡,有独立的MAC地址。

如果PC1要和PC3通信,其详细步骤是这样的:

  1. PC1发送数据

    1. 封装Packet P,源IP地址:PC1的IP地址,目标IP地址:PC3的IP地址
    2. 封装Frame F1,源MAC地址:PC1的MAC地址,目标MAC地址:路由器1左侧端口的MAC地址,它的载荷是P
  2. 路由器1转发数据

    1. 左侧接口收到数据,提取P,获得目标IP地址
    2. 查找路由表,发现应该将数据转发到右侧端口
    3. 封装Frame F2,源MAC地址:路由器1右侧端口的MAC地址,目标MAC地址:PC3的MAC地址,它的载荷是P
  3. PC3收到数据

所以当PC3收到数据的时候,它收到的Frame已经不是PC1当初发出的Frame了,但是Packet还是PC1发出的Frame。因此PC3是不可能获取PC1的MAC地址的,它能收到的只是路由器1右侧端口的MAC地址。

参考资料

  • OSI模型
  • NetworKing CCNA: OSI - TCP/IP Model
  • ARP协议

面向程序员的网络基本知识 - 网络模型及网络设备相关推荐

  1. 面向程序员的数据库访问性能优化法则

    面向程序员的数据库访问性能优化法则 特别说明: 1.   本文只是面对数据库应用开发的程序员,不适合专业 DBA , DBA 在数据库性能优化方面需要了解更多的知识: 2.   本文许多示例及概念是基 ...

  2. 【转】面向程序员的数据库访问性能优化法则

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  3. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  4. 好程序员分享Web前端知识之HTML

    今天好程序员分享Web前端知识之HTML.Web前端技术由HTML.CSS和Javascript三大部分构成,而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者 ...

  5. Feep! search:一款面向程序员的搜索引擎,收录信息超 2900 万页!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 想让检索代码不再「大海捞针」?就用「Feep! search」. 一款专门面向程序员的搜索引擎,2021年9月才开 ...

  6. 面向程序员的数据挖掘指南-----第一章:简介

    内容: 寻找事物 本书结构 阅读完本书后你可以做些什么? 为什么数据挖掘很重要?哪些内容可以为我所用? 标题里的"Numerati的古老艺术"是什么意思? 序 如果你每天都能重复做 ...

  7. BookChat学习软件—(面向程序员的 IT 互联网开源编程书籍免费阅读)

    ▌BookChat https://www.bookchat.net/ 优点 开源:基于 Apache 2.0 开源协议进行开源,对商业友好 秀气:简洁.美观,没那么多花里胡哨 丰富:注册.登录.搜索 ...

  8. 计算机中央处理器相关知识,软考程序员考点计算机硬件基础知识之中央处理器CPU...

    下面希赛小编为大家整理的软考程序员考点计算机硬件基础知识之中央处理器CPU,希望能帮助学友们.具体内容如下: 中央处理器 中央处理器(CPU,Central Processing Unit)是一块超大 ...

  9. 程序员谈网络改变我们的生活

     前出塞的程序员今天写个网络改变生活的文章,大家共勉!二十一世纪,网络已经成为了人们生活中必不可少的东西了,没有了网络,我们的衣.食.住.行都有可能陷入全面瘫痪.可见网络在我们的生活中起到了多大的 ...

最新文章

  1. android 布局翻页,安卓APP_ 布局(8) —— 基于 RecyclerView 的 ViewPager2翻页
  2. 【错误记录】Google Play 上架报错 ( 我们检测到您的应用程序包含未经认证的广告SDK或未经批准用于儿童导向服务的SDK )
  3. RunLoop的学习
  4. 程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26
  5. MySQL(七)关于MySQL不同版本下临键锁锁定范围不同
  6. 20应用统计考研复试要点(part36)--概率论与数理统计
  7. 缺少linux内核,Linux内核缺页
  8. Android图片上传和下载,android 上传/下载 图片
  9. 中国水下照明行业市场供需与战略研究报告
  10. JFreechart 在linux下不显示及中文乱码问题
  11. ppp lcp协商报文有哪些_PPP 点到点协议
  12. 【20181031T2】几串字符【数位DP思想+组合数】
  13. linux --- 启动过程
  14. atomic原子类实现机制_原子操作CAS及其实现类
  15. STM32 - L4系列芯片手册: 总线架构
  16. java使用itext实现把数据库中查到的数据转换成pdf
  17. ubuntu16.04+cuda8.0安装pytorch
  18. python word转pdf图片格式_Python将Word转成PDF
  19. win10分屏快捷键无法使用_Win10 1909碰上多任务如何快速四分屏 Win10 1909分屏快捷键无效怎么办...
  20. php学生评价系统,学生综合素质评价系统

热门文章

  1. linux分区合并不损坏系统,一次Linux磁盘损坏导致系统不可用恢复实例
  2. java mysql insert_MySQL中INSERT的一般用法
  3. Java DecimalFormat 用法 小数位的处理 公司内部处理小数位
  4. java 策略模式会员_七:策略模式(不同等级会员打折算法)
  5. apm最高的记录_2020年秋季APM专业课推荐
  6. lua mysql insert_Lua MySQL操作
  7. 无电路板的微型电路制作
  8. 智能车竞赛视觉AI组总结 西南科技大学 – 西科二队
  9. 大咖云集!航天智慧物流创意组-技术培训第三期
  10. 几款不同颜色LED的伏安特性