前言
在当今的数字化世界中,网络已成为计算机系统和应用的核心组成部分。Linux,作为一个开放源代码的操作系统,在服务器、嵌入式设备、以及开发环境中被广泛使用,而其强大的网络能力使其在网络管理和网络编程领域占据了重要地位。
Linux 网络基础知识的掌握,不仅有助于理解操作系统如何管理网络资源,还能够帮助开发者、系统管理员和网络工程师更高效地调试、配置和优化网络服务。在这篇博客中,我们将一起探索 Linux 网络的基本概念、工具和配置方法,帮助你从零开始搭建和管理自己的网络环境。
无论你是初学者还是已有一定基础的读者,本文都将为你提供清晰的概念讲解和实用的操作技巧。让我们一起开始这段关于 Linux 网络基础的探索之旅吧!
一. 计算机网络背景
1.1 发展历程
计算机网络的发展可以追溯到20世纪60年代。当时,美国国防部的高级研究计划署(ARPA)启动了一个名为ARPANET的研究项目,旨在将分布在全美的计算机连接起来,实现资源共享和信息交流。ARPANET于1969年建成,成为了世界上第一个计算机网络
在随后的几十年里,计算机网络经历了从军用到民用、从局域网到广域网的快速发展。20世纪70年代,随着计算机和网络技术的不断进步,计算机网络开始向商业化和民用化方向发展。1974年,ARPANET采用了TCP/IP协议,这成为了今天互联网的基础。到了80年代,局域网(LAN)和广域网(WAN)开始普及,TCP/IP协议也成为互联网的标准协议,标志着互联网的正式建立
1.1.1 独立模式
点对点通信 的模式。每个计算机与其他计算机独立互联,通常用于简单的网络连接。图中描述了多个计算机之间通过业务端口进行数据交换的情形。表示计算机正在处理不同的业务,并且能够在处理完一个任务后,跳转到下一个任务。
在这种架构中,每台计算机的资源(如数据、计算能力)都无法共享,这在小型或非常简单的环境下是足够的。
随着业务需求的增长和计算任务的复杂化,多个计算机之间需要共享数据和资源。这时, 共享服务器结构 应运而生。每台终端计算机通过连接一个公共的服务器来共享数据、存储和计算资源。这种架构允许更多计算机加入网络,同时确保所有计算机都可以访问共享资源(如数据库、文件和应用程序),从而提高了网络的管理性和资源利用率。
1.1.2 网络互联
共享服务器的网络结构。每个终端设备(如计算机)使用独立的计算机进行工作,但它们通过连接到一个共同的服务器来共享数据。通过这种结构,业务之间可以随时切换和共享资源,通常用于资源共享和数据集中管理的场景。
随着网络规模的扩大和多设备之间的数据交换频繁,第二张图的 共享服务器 模式开始出现性能瓶颈,特别是在数据传输速率和网络管理方面。每个计算机通过单一服务器来共享资源,可能导致 服务器成为瓶颈,影响整体网络性能。
为了提高网络效率,引入了 交换机和路由器。这些设备能有效地管理网络流量,减少单一服务器的压力,提供更高的带宽和数据流量转发能力。通过使用交换机,计算机可以直接与交换机进行数据交换,减少了多设备间的数据传输延迟。
此外,路由器的引入为网络提供了更好的 拓扑结构,能够灵活地连接不同子网,提高了网络的扩展性和管理性。
1.1.3 局域网LAN
局部网络(LAN)结构 的一个发展阶段,使用了 交换机 和 路由器 设备进行连接。多个计算机和交换机通过路由器连接,从而形成了一个小型的局部网络。在这种结构中,各设备之间的通信更加高效,特别是在局域网络中,交换机和路由器的使用大大提高了数据传输的速度和效率。
随着网络应用的普及,局部网络的规模逐渐无法满足跨地域、跨城市甚至跨国家的需求。计算机和服务器不再仅仅存在于一个物理位置,而是分布在不同的城市和国家之间。此时,需要通过 路由器 和 交换机 连接不同的局部网络,形成一个更大范围的 广域网(WAN)。
跨地域连接,通过不同的 LAN(局部网络)通过路由器和交换机相连接,形成一个全球范围的计算机网络。这种结构适用于需要多个地理位置之间共享数据、应用和服务的情况。
在这种结构下,网络不仅要提供高效的数据交换能力,还要满足安全性、数据冗余、容错性等复杂要求,以应对企业在全球范围内的运营需求。
1.1.4 广域网WAN
广域网(WAN)架构。图中的多个局部网络(如大阪、东京、名古屋等)通过路由器和交换机相互连接,形成一个跨越多个城市的大型网络。这种结构展示了网络如何连接不同的地理位置和数据中心,代表了较为复杂的网络拓扑。
1.2 总结
计算机网络在现代社会中发挥着举足轻重的作用。它打破了数据的孤立状态,使得不同计算机之间能够高效地交换信息和共享资源。无论是工作、学习还是生活,计算机网络都已经成为人们不可或缺的一部分。它让人们能够随时随地访问互联网,获取各种信息和服务,极大地提高了工作效率和生活质量
二. "协议"
2.1 什么是协议
协议(Protocol)是一种约定,是指一组用于规定计算机之间进行通信时,如何传输数据和处理信息的规则和约定。协议是网络通信的基础,它定义了数据传输、错误检测、数据压缩、数据加密等多个方面的细节,以确保不同设备能够顺利、高效地进行通信。
生活中的"协议":比如你是南方的,但是你考上了北方的大学,你为了给家里节省话费,你就跟家人做个约定,如果电话响了1声就是报平安,2声就是记得打生活费,3声就是有事情需要当面聊…… 而这种基于约定某种信号的决策,就是协议。
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息.要想传递各种不同的信息, 就需要约定好双方的数据格式.
不同的人会规定不同的协议,比如去上学,就是上学协议,去上班就是上班的协议,该结婚了,也有结婚协议。协议是用来解决通讯问题的。
读到这里,你肯定也会有一些疑惑:
1. 你怎么保证你的数据能准确的到达下一个设备?- 数据链路层的协议解决,会有各种各样的字段表示这个数据就是发给你的
2. 如何定位主机的问题,比如说你想给你爸妈发消息,那为什么就能准确发给你爸妈呢,而不发给你的弟妹,老师呢?- IP协议,协议就要涵盖报文,原IP是谁,目的IP是谁,主机都有自己的IP地址,没有IP地址主机是通信不了的。
3. 长距离传输的数据丢失了怎么办?- TCP协议
4. 如何处理发来的数据? - https http ftp smtp...应用层协议
5. 所以每层都要有自己的协议?
为什么会有上述的问题发生呢?归根结底就是单纯因为传输距离变长了,就会考虑到了各种问题了
- 当我们邮寄快递的时候需要填写快递单,当你拿到了一个空快递单的时候 你是能认识的,对方也认识,这就是给单子做了约定。然后你就知道要填地址,姓名,手机号...了
- 当收快递的时候,快递员给你快递的时候,你的快递盒子上面贴的有纸(快递单),你要根据这个盒子上的快递单来确实这个东西是否发给我的。所以我们收快递不止收到快递本身,还收到更多的信息字段(快递单),这个信息字段就是我们规定的协议,更准确的是叫做报头。由此可知,协议的表现形式就是结构体对象!(双方能够认识是因为做了一个规范,网络使用的是TCP,IP...,就意味着源代码层面上都是约定好的,这样A主机定义的结构体对象,B主机就也能知道啥意思了)!
解决了上面的问题,我们再想一个更深层的问题:
- 计算机生产厂商有很多;
- 计算机操作系统, 也有很多;
- 计算机网络硬件设备, 还是有很多;
- 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准, 大家都来遵守, 这就是 网络协议;
2.2 网络协议的理解
网络协议,简称为协议,是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。这些规则详细规定了如何建立连接、如何互相识别、如何发送和接收数据等
网络协议是两台计算机或设备之间进行通信时遵循的一组规则。这些规则决定了数据如何在网络中传输、如何格式化、如何保证数据的可靠性、如何进行错误检测等。可以类比为一种“语言”,它使得不同设备之间能够理解彼此并交换信息。
然而,随着网络环境的复杂性增加,单一的协议已经无法满足各种需求。比如,我们需要不同协议来处理不同的功能:有些协议关注数据的传输可靠性,有些则处理数据如何在网络中路由等等。
仅仅依赖一个单一的协议来处理所有的通信需求会非常复杂和低效。不同类型的设备、不同的网络技术、不同的需求,都可能需要不同的协议来分别解决。比如,物理层需要协议来定义硬件设备的连接方式,而应用层需要协议来定义如何格式化数据。这种复杂性促使我们需要分层来把通信任务分成多个相互独立、负责不同功能的模块。
2.3 网络协议的分层结构
网络协议的分层不仅让网络通信更加灵活、模块化、可维护,还确保了网络的标准化、可扩展性和易于管理。通过分层,我们能够清晰地理解和解决网络中的各个层次问题,提升了网络的稳定性、可靠性与性能。同时,这也为不同技术和设备间的互操作性提供了基础,使得全球的设备能够通过统一的协议进行有效的通信。
这张图通过展示不同语言和通信设备之间的协议协作,强调了协议分层的重要性。图中体现了在通信中,语言协议和通信设备协议可以独立变化而不相互影响。无论是切换语言(如汉语到英语)还是更换设备(如从有线电话到无线电话),协议分层确保了通信的灵活性和兼容性。语言协议处理语言层面的转换,而设备协议则负责设备之间的连接与数据传输,从而实现了不同设备和语言用户之间的有效沟通。
真实的情况是人在和电话沟通,在逻辑上,是人与人沟通,认为AC是在同一层的。层和层直接是高内聚、低耦合的
层状结构的好处:通过高内聚、低耦合的,好维护。一层出现问题,只会影响这一层本身,不会影响上一层,比如说电话机层坏了,只需要把电话机修好了就能恢复正常了,甚至把一层干掉,换成类似的(电话机换成无线电),照样不影响上一层
这时候我们肯定会有疑惑?我们该怎么分层呢
三. OSI七层模型(理论标准)
- OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;
- 把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;
- OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
- 它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;
- 但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解.
对于学软件的咱们来说,物理层可以暂不关心。学软件只需要先考虑五(四)层协议
四. TCP/IP五层模型(工程标准)
TCP/IP四层(或五层)模型:将OSI七层模型中的表示层、会话层合并为应用层,从而形成了四层(或五层)结构。从高到低依次为应用层、传输层、网络层、数据链路层和物理层(五层模型还包括一个会话层)。TCP/IP协议簇就是基于这种分层结构设计的
OSI七层模型理论是好的,但是工程角度既复杂又不实用,所以我们把他变成了5层(其实7层都是需要的,只不过把上三层压缩成了一层) 名字叫做TCP/IP是因为这两层最重要!!
物理层(Physical Layer):
- 功能:物理层负责在物理介质(如电缆、光纤、无线电波等)上传输数据的比特流。它定义了硬件设备之间的电气、机械、功能等接口标准,确保比特在网络中能够被传输。
- 设备:网卡、集线器、交换机(物理设备)、路由器等。
数据链路层(Data Link Layer):
- 功能:数据链路层负责在物理链路上可靠地传输数据帧,解决数据传输中的错误检测、流量控制和帧的封装与解封装等问题。它使用MAC地址来标识设备,确保在相邻设备之间进行通信。
- 设备:网卡、交换机(数据链路层设备)。
- 协议:Ethernet(以太网)、PPP(点对点协议)等。
网络层(Network Layer):
- 功能:网络层负责将数据包从源设备路由到目的设备,处理设备间的寻址与路由选择。它通过IP地址来标识设备,并通过路由协议确保数据能够跨越多个网络进行传输。
- 设备:路由器。
- 协议:IP(Internet Protocol)、ICMP(Internet Control Message Protocol)等。
传输层(Transport Layer):
- 功能:传输层负责提供端到端的通信,确保数据的可靠性和完整性。它为应用程序提供不同的传输服务,包括面向连接的服务(TCP)和无连接的服务(UDP)。
- 协议:TCP(Transmission Control Protocol)、UDP(User Datagram Protocol)等。
应用层(Application Layer):
- 功能:应用层直接与用户的应用程序交互,提供网络服务,如电子邮件、文件传输、网页浏览等。它处理数据的格式化、协议的实现和数据的交互。
- 协议:HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)、DNS(Domain Name System)等。
在整个网络通信里,站在操作系统层面,最重要的两层协议是传输层和网络层,传输层最具代表性的协议是TCP,网络层最具代表性的协议是IP
名字叫做TCP/IP是因为这两层最重要!!
了解了那么多,我们学习这些和之前学习OS的有什么关系呢?
五. OS和网络协议栈的关系
上述图片说明,传输层,网络层都是属于Linux内核,这也就是我们之前为什么要深入了解内存,文件,进程,驱动等等
这其实就相当于一台主机,而两台主机之间做交互比如得通过网卡(硬件),所以发送方要通过用户层贯穿协议栈到物理层,而接收方又要从物理层贯穿协议栈到用户层
由上述可知,网络通信的本质就是贯穿网络协议栈的过程!!
六. 网络传输基本流程
6.1 两种形式的流程图
同一个网段内的两台主机进行文件传输.
跨网段的主机的文件传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
6.2 封装和解包/分用
- 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame)
- 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)
- 首部信息中包含了一些类似于首部有多长, 载荷(payload)有多长, 上层协议是什么等信息
- 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部, 根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理
下图为数据封装和解包的过程
(1)用户层:需要版本号
因为很可能对方虽然跟你使用的是同一个软件,但是版本并不一定一样(有的人可能并不会经常更新),而版本不同的话可能功能也不一样,所以我们需要一个能够标识版本的字段,来让另一方做出区分从而根据不同的版本推送不同的信息!!
(2) 传输层:需要序号
同时传输的时候,可能我们说话的顺序会导致不同的意思,所以我们消息传输的可靠性其中之一必须得保证有序!!所以我们传输信息的时候需要有序号信息。
(3) 网络层:需要知道当前ip和目标ip
信息在传输的时候总得知道自己从哪来,且该去往哪里吧,这样对方在接受的时候才能知道当前的信息是发给自己的。
(4) 链路层:需要有当前mac地址和目标mac地址
这样才能知道我当前的局域网内有那么多主机,我怎么知道要去往哪个主机呢?? mac地址是每个网卡出厂的一个唯一标识,机器启动的时候OS会读取网卡的属性信息就可以获得,他存在的意义就是保证在局域网内具有唯一性!!
每一层都会需要不同的协议报头! 层层往下其实就是对有效载荷进行封装,而当传送给另一端的时候,又会自下而上贯穿协议栈,每一层都之后认得自己的那部分报文信息,识别之后丢弃自己的那部分再往上传递(如何得知交给哪一层 是通过分用决定的),直到用户层就可以变成我们需要的有效信息了,所以层层往上就是在进行解包!
最后再拓展两个思考问题:
问题1:把一碗水倒入桶里,可是将来让你必须要把水分开,结果是分不开了。
所以几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力,即在封装的时候,要考虑未来怎么更好的解包。
问题2:实际上,整个网络协议栈想一个倒的多叉树,所以网络层不止有IP,还有ICMP IGMP..., 当自下而上贯穿协议的时候,抬头一看,发现每一层都有很多协议
所以还要有个能力,即几乎任何层的协议, 都要在报头中提供,决定将自己的有效载荷交付给上层哪一个协议的能力,把这种能力,叫做分用的过程
有了这两个问题和答案,我们才能更加理解封装和解包,才不会困惑
6.3 以太网通信
思考一下,多台主机是在以太网怎么通信的?
或者说,一个主机,怎么把数据交给另一台主机呢?
下面先讲一个故事:老师在班级上课的时候,叫张三站起来交作业,此时其实其他同学也听到了,但是最后只有张三理会了。
本质上:大家都收到了这个声音(报文),大家都把这个声音提取了信息(报头和有效载荷),并且进行了对比(分离)。提取到报头叫的是张三,把自己的名字和张三做对比,在对比报文信息的时候发现该报文不是自己的于是就丢弃了!
注意:当班级里的同学很吵闹的时候,可能张三就无法听到老师在叫他了。因为一些垃圾的噪音会把正确信息给顶掉。
再比如:你正在打游戏,另一个人在和你连接一个局域网下载视频,那么就会挤压局域网带宽,进而和你的数据发生碰撞,然后打游戏就会卡顿
所有发送的信息是有可能被其他非目标主机捕捉的,只不过一般情况下都会被丢弃,但是如果有人刻意为之的话还是可以被上层看到的,所以我们一般来说要对数据进行一定的加密保护,如果没有任何保护就发送数据就可能会泄漏信息!!
以太网通信的原理:
因为所有主机都可能会发送信息,所以有可能会发生数据碰撞问题!!尤其是如果有人不断往局域网发送垃圾数据的时候。
以太网通信的结论:
- 发送主机都要执行碰撞避免算法,他的算法原理就是每个主机在发送的时候都会等上随机的延迟时间,相当于是错峰发送!!
- 局域网越大碰撞概率就越大,所以一般不建议太大,否则会影响传输效率,但是如果实在需要这种场景,就需要用交换机来划分碰撞域!!
- 局域网是属于多台主机的共享资源,因为任何时刻都只能有一个主机发送消息,所以我们必须保证他的互斥性,只不过不是用加锁完成的,以太网是用碰撞避免算法来控制每个时刻都只有一个主机在发送信息,而还有一种令牌环网他所使用的方法就是通过持有某种标识(有点像令牌)才能具备发送的能力,且该资源只有一份!