zoukankan      html  css  js  c++  java
  • 网络通信基础笔记

    前言

    现代社会可以说网络在我们日常生活中犹如水电般重要了,它是所有联网生态的基础,也是这些生态从业者必须熟悉甚至掌握的一项学科。

    说实话,我以前对网络并没有投入很大精力去学习,毕竟不了解OSI七层模型、不了解TCP协议建立连接中三次握手的细节、以及诸如“网络拥塞”等这些基础知识概念都不会影响我在实际编码中创建一个Tcp连接对象是否成功(当然,这个想法是极其幼稚和错误的 )。

    庆幸几年后的自己,对计算机领域越来越感兴趣,脑海中另一个求知欲旺盛的自己不断抛出问题,不断对完结的编码工作提出质疑。通常这些质疑会伴随我计算机领域薄弱的基础知识而不得其解,其中当然不乏计算机网络这一相关领域。

    OSI七层模型

    要讲网络,必然绕不开OSI七层模型,下图是直接从百度百科中抠的一张OSI七层模型图

    上图左侧是发送方,发送方从模型的高层到低层进行数据转发,最终都是通过物理层将最终数据以比特为媒介传输至接收方。接收方再从低层向高层一层一层转发,在自己层级将数据处理后封装成上级所需的格式。

    小结

    • 发送方发送流程均是从上至下,最终物理层负责数据的传输;
    • 接收方接收流程是自下向上的,在本层会对下层传入数据进行解析,完本本层工作后再根据上一层接收格式封装好传递上去;

    网络的演变

    说到计算机网络,以语义来分解就是计算机加网络,前者是菱角分明的物理设备,后者是具备指定特性的抽象对象。
    通常要深入理解一项技术,我们需要了解此项技术产生的背后原因,以及实现它的成本,甚至是它的历史迭代。

    OK,在了解计算机网络之前,先让我们自己在不同场景下试用下不同的技术方案实现数据互通。

    网线直连

    不妨想象下在拥有两台计算机硬件设备前提下,要让他们数据互通,我们该怎么办?
    答案是将计算机通过网线直连,我们设定好两台计算机的IP地址在同一网段,直连后两台计算机便可以互通了。

    如下图:

    那么,我们得到一个结论,计算机互通的前提是需自身提供身份标识符(Identity),可能你现在会认为,IP地址就是这个在计算机网络世界里面畅行无阻的标识符了。
    实际上,我们是要通过IP地址去查找对应的MAC地址,因为数据链路层是只允许采用MAC地址互通。且IP地址除非静态IP,否则同一网络下IP地址可以是动态分发的,离线后再上线IP地址会有不同。而MAC地址则是硬件设备网卡的唯一标识,不受离线和上线影响。

    MAC地址获取方法

    MAC地址是ARP协议获取的,ARP协议需要目标机器的IP地址(可以把ARP协议想象成一个需提供目标IP地址的函数)。通过ARP获取到目标机器的MAC地址后会写将其入到本机的ARP缓存表中,方便下次寻址(MAC地址)。

    下图可以看出IP地址和硬件地址(MAC地址)的重要性,以及他们在OSI模型中被相应的层级使用。

    Hub(网络集线器)扩容

    继续上面的例子,假设实际场景演变成了一个工作室(5~10)台计算机需要实现互通。这时候还想采取上面网线互通方案则明显是痴人说梦了。那这时候,想让工作室计算机互通又要投入怎样的技术方案呢?

    这时候,带着多个物理端口嚣张的Hub向你张开了怀抱~

    上图是一个带有16个RJ45标准端口的网络集线器,每台计算机在与HUB直连后就行程了一个小型的数据互通网络。

    Hub(网络集线器特点)
    • 遵循CSMA/CD协议;
    • 主要在OSI7层模型中的最底层物理层工作;
    • 消息传输采取广播方式;
    Hub(网络集线器)如何工作

    Hub从指定端口接收信号后再放大此信号,并采取广播形式分发到其他端口(不包含原信号发送端口)。
    Hub使用广播的方式对接收的信号进行传输是因为它内部遵循的协议CSMA/CD只支持多路访问,且Hub设备在网络环境下缺少标识,没有标识则无法进行点对点定向传输。

    下图是Hub接收信号再进行中转的场景图

    可以看到,PC1终端发送了数据,Hub接收后一次性广播到其他终端上(除了数据发送端PC1)。其他终端对Hub发来的消息可进行接收或拒绝处理。那终端是如何对消息进行校验是否应该接收还是拒绝呢?

    下图是集线器广播的消息对象,其他终端通过消息头的接收方MAC地址与本机MAC地址对比即可得出消息是采取接收还是拒绝操作。

    Hub(网络集线器的弊端)

    泛洪转发(广播风暴)

    泛洪通俗理解就是指对一条消息进行广播,当我们使用多台集线器接入多台终端设备则会导致一条消息在多个集线器上转发。
    因为集线器的特性就是广播,而实际接收方接受消息是带有条件的,即消息头必须是指定MAC地址才接受。但是无论终端机器是否接受还是拒绝,对于集线器发送的消息必须做出反应,当我们集线器接入的终端越多,消息越多时,广播消息会导致接收方浪费很多资源去处理这些消息。可能十条消息对于实际接收方而言只需要接受其中一条。

    扩容=性能下降

    本身集线器的产生就是为了网络扩容,还是由于广播特性导致消息转发处理响应变慢。试想一下,现在是3个工作室电脑想互通,如果继续采取集线器模式则一条消息发送完毕后需要等所有在线的终端做出响应后集线器才发送下一条消息。延迟性的提升是我们不能接受的;

    交换机定向传播数据

    还是基于上面的情况,需要将多个工作室(多个小的局域网)网络实现互通,我们知道了使用集线器会导消息致泛洪转发。所以理想的网络扩容不能使用集线器充当网络中转站的角色,这个时候交换机出现了。

    交换机和集线器一样具备数据中转功能,我们使用它来替换集线器的原因是它可以针对目的端口定向传输数据。相对于集线器,这无疑是重大的进步。做到定向传输功能是因为交换机内部有一张路由表,默认路由表是一张空表,每次从发送端口得到转发数据后,交换机先在路由表查看目的端口是哪一个,没有则进行广播,在广播发送完毕后目的端口反馈接收结果后,交换机会在路由表写入目的端口的地址,方便后续传输时可以直接定向传输。

    下图是交换机的数据传输工作流程

    从上图得知只要在交换机路由表存储了目标机器的MAC地址后我们就不需要再执行广播操作,也通过交换机的工作流程得知它是一个“爱记笔记的好职员”,在岗位上兢兢业业做好了自己中转站的工作。

    交换机特点
    • 工作在OSI七层模型中的数据链路层;
    • 根据中转过程中不断更新自身的内部路由表信息,方便定向传输数据;
    • 可以同时支持多个端口进行通信;

    嗯,说了这么多貌似都在夸交换机的厉害之处, 那单纯使用交换机做扩容(桥接)是否真的很完美了么?答案当然是否定的。
    1、桥接某种程度上还是会造成泛洪转发(广播风暴),相比于集线器只是阀值变高了一些而已;
    2、无法跨网络通讯,客户端无法与外界其他网络通讯;

    路由器

    路由器可以解决跨网段通讯,同时也能降低相比桥接带来的广播风暴几率。
    路由器自身就拥有了一套操作系统(一般是Linux),它不再是单纯的中转站工作员了,当然交换机能做的路由器都能做~~

    上图是一个带Wifi功能的路由器,路由器工作在网络层,它自身拥有IP地址、MAC地址,当然最振奋人心的是它拥有一套网络配置系统,我们可以在系统内对接入的终端进行配置。
    下图是我家里的路由器后台管理系统界面,不同厂家和版本的路由器开放的功能也各不相同。

    路由器工作在网络层,主要目的是根据现有网络架构下寻找最优的交互路径。

    路由器特点

    • 路由器可以跨网段通信;
    • 通过路由算法更新路由表;
    • 提供对网络更多个性化的配置系统;

    小结

    • IP地址不能直接通信,需要通过ARP协议查找目标机器的MAC地址,数据链路层是根据MAC地址进行身份证认证;
    • 引入交换机的核心目的在于局域网内的扩容,属于桥接范畴,结果是同一网段下可以加入更多的连接终端;
    • 引入路由器核心目的在于跨网段通讯;
    • 集线器只有广播这一种数据传输方式;
    • 交换机和路由器通过路由表的缓存得以点对点传输数据;

    本篇内容是本人对计算机网络的浅薄理解,还未涉及到OSI七层模型上的应用层到传输层。然而实际工作中的HTTP、TCP都是在上面的层级中。这一篇文章也算是自己对网络底层的一个总结,如有大神有更准确的见解也请不吝赐教。

    最后,最近创立了一个公众号,想在后续工作休息时间内记录下IT知识总结以及一些生活趣事。感兴趣的小伙伴可以关注下,希望有朋友可以多多互动。

  • 相关阅读:
    什么是脚本语言?什么是解释性语言?什么是编译性语言?
    自己写的java excel导出工具类
    httpclient模拟post请求json封装表单数据
    git 远程库命令
    git 常用命令及解析 由浅入深
    图书馆借书(年,月,日)
    线索二叉树
    AxB Proplem(大数乘法)
    简易版最长序列(map映射)
    小黑跳地毯减肥(递推)
  • 原文地址:https://www.cnblogs.com/hunanzp/p/13414317.html
Copyright © 2011-2022 走看看