当前位置: 首页 > news >正文

Linux-网络基础

一.网络背景

        网络的起源与20世纪中期的冷战背景密切相关。美苏争霸期间,美国国防部担心传统集中式通信系统(如电话网络)在核战争中容易被摧毁,因此急需一种去中心化、高容错的通信方式。1969年,美国国防部高级研究计划局(ARPA)主导开发了ARPANET,这是第一个采用分组交换技术的实验性网络,实现了不同计算机之间的数据传输。ARPANET的设计核心是分散控制,即使部分节点被破坏,信息仍能通过其他路径传输,为现代互联网奠定了技术基础。

        1970—1980年代,网络技术的关键突破加速了发展。分组交换技术(将数据拆分为小块传输)取代了传统的电路交换,提高了效率;TCP/IP协议(1983年正式成为ARPANET标准)解决了不同网络之间的互联问题,成为互联网的通用语言。同时,学术界和科研机构(如大学、实验室)对资源共享的需求推动了网络扩张。例如,电子邮件(1971年)和文件传输协议(FTP)的发明,使得跨机构协作成为可能。这一时期,NSFNET(美国国家科学基金会网络)的建立进一步将网络从军事用途转向科研与教育领域。

        1990年代,互联网迎来大众化转折点万维网(WWW)的发明(1989年蒂姆·伯纳斯-李提出)通过超文本链接和浏览器技术,让普通用户也能轻松访问网络信息。美国政府逐步放开对互联网的商业限制,私营企业开始投入建设基础设施(如光纤、ISP服务)。随着个人电脑的普及和Windows 95等操作系统内置网络功能,互联网用户数量激增。社交网络、电子商务等应用的出现(如亚马逊、eBay)彻底改变了社会生活方式,标志着网络从技术工具转变为全球性的信息与社交平台。

        因为计算机是人的工具,最初计算机虽然没有网络。但人在完成任务时通常需要分工协作,人们使用计算机时,避免不了需要进行计算机数据的交换。所以最初的网络是由人力代行的。显然这种方式效率极低。于是为了方便小区域的通信,便拥有了局域网。随着通信距离的需求变远,就有了广域网。也就是说,计算机网络的发展是由局部到整体的。

        计算机是人的工具, 人要协同工作, 注定了网络的产生是必然的。

二.协议

        我们先来思考一个问题。数据在计算机世界中均是二进制方式传输的。数据传输的方式我们已经有所了解。但数据为什么能被远端主机所识别呢,这是最重要的。因为数据的传输只是目的,而数据的内容才是结果。数据通过协议来被双方识别,那么,什么是协议呢?

举一个现实中的例子--快递:

        在一张快递单子上,往往会详细记录收取人各自的姓名与联系方式,以及快递的内容和其他信息等。快递公司如何知道这件快递是谁发的,要发往哪里。就可以从快递单上得知。而快递到中转站时,也是如此获取消息发往下一个站点。这就是卖家,买家与快递公司之间所约定的一种协议,而网络之间数据识别的方式,也是通过协议完成的,我们发现,协议的本质,就是约定。

        所以, 完善的协议, 需要更多更细致的规定, 并让参与的人都要遵守。而计算机网络硬件设备, 有很多很多。如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是网络协议。

2.1协议分层

        协议本质也是软件, 在设计上为了更好的进行模块化, 解耦合, 所以也是被设计成为层状结构的。
        软件分层的好处一是各层分工明确,便于维护。软件分层架构的核心优势在于职责分离。以外卖App为例,用户界面层(UI)仅负责展示菜品和收集用户输入,业务逻辑层专注于处理订单规则(如优惠计算),数据访问层则独立管理数据库操作。这种明确的分工使得修改某一层时不会影响其他部分。例如,当需要优化App界面时,开发者只需调整UI层的代码,无需担心业务逻辑或数据存储受到影响。这种隔离性大幅降低了维护成本,尤其适合长期迭代的大型项目,团队成员可以并行开发不同层级而不会互相干扰。

        二是复用性强,减少重复代码。分层设计显著提升了代码的可复用性。在分层架构中,每一层的功能模块可以被其他部分多次调用。例如,数据访问层的“用户认证”功能既能用于登录场景,也能用于订单验证;业务逻辑层的“运费计算”规则可以被PC端和移动端共享。这种复用性不仅减少了重复代码,还确保了逻辑的一致性。此外,当需要替换底层技术(如更换数据库)时,只需重写数据访问层,上层业务代码无需改动,极大降低了迁移成本。

        三则是分层架构使测试和调试更加高效。每一层可以独立测试:数据访问层通过单元测试验证数据库操作,业务逻辑层检查算法正确性,UI层进行交互测试。这种隔离性让问题定位变得简单——如果订单提交失败,可以快速确定是数据连接异常、业务规则错误,还是界面逻辑缺陷。相比之下,未分层的“ spaghetti code”(面条代码)中,故障可能涉及多个混杂的功能点,排查难度成倍增加。分层后的系统更符合自动化测试的需求,适合持续集成(CI/CD)等现代开发流程。

        总而言之,分层可以实现解耦合, 让软件维护的成本更低。那么网络协议有哪些主要的分层模型呢?

2.1.1OSI七层模型

        OSI(Open System Interconnection, 开放系统互连) 七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范。

        把网络从逻辑上分为了 7 层. 每一层都有相关、 相对应的物理设备, 比如路由器, 交换机。其最主要的功能使就是帮助不同类型的主机实现数据传输。它的最大优点是将服务、 接口和协议这三个概念明确地区分开来, 概念清楚,理论也比较完整。 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

        OSI模型设计的十分完美。但为什么广泛应用的却是TCP/IP五层模型呢?第一个原因则是因为对于上三层应用层,表示层,会话层。实际开发中这三层功能往往交织,很难将三者区分为不同的三层。第二个也是因为历史原因,TCP/IP协议早在1970年代由美国国防部研发,1983年成为ARPANET(互联网前身)的官方协议。OSI模型在1984年才推出,此时TCP/IP已在全球大学、军方和科研机构中广泛部署。第三个原因则是OSI七层模型实现过于复杂,标准化流程冗长,而且协议设计追求理论完美,不注重实用性。

        上面的原因我们此时了解即可,后面我们会通过介绍TCP/IP模型一步步的解释上面的原因。

2.1.2TCP/IP五层(四层)模型

        TCP/IP 通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求:

        物理层我们考虑的比较少, 我们只考虑软件相关的内容。 因此很多时候我们直接称为TCP/IP 四层模型。

一般而言:

  1. 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容
  2. 对于一台路由器, 它实现了从网络层到物理层
  3. 对于一台交换机, 它实现了从数据链路层到物理层
  4. 对于集线器, 它只实现了物理层

        但是并不绝对. 很多交换机也实现了网络层的转发; 很多路由器也实现了部分传输层的内容(比如端口转发)。

2.2对协议的进一步理解

2.2.1为什么要有TCP/IP协议

        首先, 即便是单机, 你的计算机内部, 其实都是存在协议的, 比如: 其他设备和内存通信, 会有内存协议。 其他设备和磁盘通信, 会有磁盘相关的协议, 比如: SATA, IDE, SCSI 等。 只不过我们感知不到罢了。 而且这些协议都在本地主机各自的硬件中, 通信的成本、 问题比较少。

        其次, 网络通信最大的特点就是主机之间变远了。 任何通信特征的变化, 一定会带来新的问题。如何在确保数据可以传递远的距离的同时又确保数据的完整性呢,这就是TCP/IP协议存在的原因。

2.2.2什么是TCP/IP协议,宏观上是怎么实现的

        TCP/IP存在的原因解释了其本质是一种问题的解决方案。而为什么TCP/IP能够分层,是因为通信远这个问题本身能够分层。它在操作系统上宏观上的实现大致如下图:

 我们再来直白的认识下协议,它在操作系统层面具体是什么样子的呢?

        对于主机 B 能识别 data, 并且准确提取 a=10, b=20, c=30 吗?答案无疑是可以的,因为双方都有同样的结构体类型 struct protocol。 也就是说,用同样的代码实现协议, 用同样的自定义数据类型, 天然就具有”共识“, 能够识别对方发来的数据,这不就是两台主机通信时的约定吗。

        所以我们说,所谓协议, 就是通信双方都认识的结构化的数据类型。因为协议栈是分层的, 所以, 每层都有双方都有协议, 同层之间, 互相可以认识对方的协议。

三.网络传输的基本流程

3.1局域网

        局域网相信经常玩我的世界的朋友都知道,和距离近的人想要快速联机,通常需要各自的设备连接同一个网络。然后就可以直接连接进行游戏了。也就是说,两台主机只要在同一个局域网内便可以直接通信。而每台主机在局域网上, 要有唯一的标识来保证主机的唯一性:mac 地址。

        MAC地址(Media Access Control Address)是固化在网卡(NIC)中的48位(6字节)物理地址,通常以十六进制表示(如`00:1A:2B:3C:4D:5E`),用于在数据链路层唯一标识网络设备,实现局域网内的直接通信。前24位是厂商标识(OUI),后24位由厂商分配,具有全球唯一性。MAC地址通过ARP协议映射到IP地址,是设备间数据传输的基础(如交换机通过MAC地址转发数据帧),但不可跨网络路由(仅作用于本地网络)。

后面我们详细谈论数据链路层的时候, 会谈 mac 帧协议, 此处我们做一个了解即可。

3.1.1局域网的通信标准及流程

        局域网中常见的通信标准有以太网,LAN网和令牌环网。我们这里仅介绍以太网的通信流程,便可以理解后面的两种通信标准了。

        主机A想给主机E发一句"你好",但它不知道E在哪,于是扯着嗓子(广播)喊:"MacE!你的快递!"(带着自己的地址MacA和E的地址MacE)。

        结果整个办公室(局域网)的主机B、C、D全听到了。B看了眼包裹单:"收件人是MacE?不是我(MacB),扔了!" C和D也直接拒签。只有主机E跳起来:"是我地址!签收!"

        这就是以太网最基础的通信方式——吼一嗓子,谁的名字对谁领,其他人自动无视。简单粗暴,但浪费流量(所有机器都得听一遍)。

而以太网的特点如下:

  1. 以太网中, 任何时刻, 只允许一台机器向网络中发送数据
  2. 如果有多台同时发送, 会发生数据干扰, 我们称之为数据碰撞
  3. 所有发送数据的主机要进行碰撞检测和碰撞避免
  4. 没有交换机的情况下, 一个以太网就是一个碰撞域
  5. 局域网通信的过程中, 主机对收到的报文确认是否是发给自己的, 是通过目标mac地址判定的

         有没有发现,以太网的的数据传递方式,这种"竞争+精准认领"的机制,本质上就是用简单规则避免多人同时说话乱套,和多线程里用锁防止数据冲突的思路一模一样。

        所以我们再来简单的认识下令牌环网和LAN网。LAN(局域网)就像一个小办公室里的同事用对讲机聊天——谁想说话就直接喊,但万一两个人同时开口就会撞车(以太网用"听线等重试"解决)。而令牌环网更像传话筒:只有一个"发言令牌"在同事间轮流传递,拿到令牌的人才能说话,说完就传给下家,绝对不抢麦(这不就是线程安全中锁的机制吗?!)一个像自由辩论(可能吵架),一个像轮流发言(秩序井然),但目标都是让本地设备有序通信。

初步明白了局域网通信原理, 再来看同一个网段内的两台主机进行发送消息的过程:

而其中每层都有协议, 所以当我进行进行上述传输流程的时候, 要进行封装和解包

下面我们明确一下概念:

        报头部分, 就是对应协议层的结构体字段, 我们一般叫做报头。除了报头, 剩下的叫做有效载荷故, 报文 = 报头 + 有效载荷。

接下来我们再来明确下不同层完整报文的叫法:

  1. 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
  2. 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
  3. 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息.
  4. 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理

 

        在网络传输的过程中, 数据不是直接发送给对方主机的, 而是先要自定向下将数据交付给下层协议, 最后由底层发送, 然后由对方主机的底层来进行接受, 在自底向上进行向上交付:

对于每层数据还要有分用的过程:

所以从今天开始, 我们学习任何协议, 都要先宏观上建立这样的认识:

  1. 1. 要学习的协议, 是如何做到解包的? 只有明确了解包, 封包也就能理解
  2. 2. 要学习的协议, 是如何做到将自己的有效载荷, 交付给上层协议的?

下一篇文章我们再来理解IP地址,并直接上手UDP的ECHO服务的简单实现 


 

 


 



 

相关文章:

  • mindspeed-rl使用注意事项
  • 【ESP32】【微信小程序】MQTT物联网智能家居案例
  • Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
  • 相机标定(输出相机内参和畸变参数)
  • 前端实现数据导出成excel
  • RIP动态路由(三层交换机+单臂路由)
  • 【Markdown】【HTML】在Markdown中实现康奈尔笔记模式(右侧留白)
  • 百度暑期实习岗位超3000个,AI相关岗位占比87%,近屿智能携AIGC课程加速人才输出
  • ASP.NET Core 分层项目中EFCore的使用
  • 完美解决Microsoft Edge浏览器无法同步/一直在同步中/更新失败等问题
  • 神经网络直接逆控制:神经网络与控制的结合入门级结合
  • 【C#】.net core 6.0调用MVC API接口时,提示Unsupported Media Type,状态码415
  • 穿透数据迷雾:PR 曲线与 ROC 曲线的深度剖析+面试常见问题及解析
  • spring security +kotlin 实现oauth2.0 认证
  • 加油站小程序实战教程12显示会员信息
  • 【Django】设置让局域网内的人访问
  • 忽略 CS8616 警告在 Visual Studio 2022 中【C# 8.0 】
  • Halcon应用:相机标定之应用
  • AI助理iOS开发:Copilot for Xcode 下载与安装全指南
  • Spark-SQL与Hive集成及数据分析实践
  • 金价新高不断,上金所再发风险提示,黄金能否持续闪耀?
  • 内部敏感文件遭万人共享,特朗普政府又曝安全漏洞
  • 中办、国办印发《农村基层干部廉洁履行职责规定》
  • 义乌女老板对CNN霸气喊话:美国要货就给,不要就分给其他客户
  • 人民日报:当阅读成为“刚需”
  • 海南开展药品安全“清源”行动,严查非法渠道购药等违法行为