【Linux】网络基础概念 (上)
目录

个人主页:矢望
个人专栏:C++、Linux系统编程、Linux网络编程、C语言、数据结构、Coze-AI、MySQL
一、网络基础概念
1.1 网络发展
网络的发展,本质上是一场关于“连接”的扩张史。它始于1969年美国军方阿帕网(ARPANET)的四个节点,最初只为冷战背景下分散指挥系统的科研通信;80年代TCP/IP协议的确立,让它像“通用语言”般统一了全球散落的局域网,迈出走向公众的第一步。90年代万维网(WWW)和浏览器的发明,则用图文界面拆掉了技术高墙,让普通人也能点击冲浪,此时网络仍是“信息高速公路”,主要传递静态页面和邮件。进入21世纪,移动通信与智能手机将网络从桌面解放,渗透进生活每个角落,催生出社交、电商、短视频等动态交互生态,网络变为“生活基础设施”。而如今,云计算、物联网和5G/6G正编织起万物智联的网络,它不再仅是人与人的连接,更是人与物、物与物的智能协同,从传递信息转向重塑社会运行方式,一个虚拟与现实深度融合的数字文明时代已悄然开启。
总结一句话,计算机是人的工具,人要协同⼯作,注定了网络的产生是必然的。
1.2 初识协议
协议是一种约定,例如两个人约定用0表示他不这么认为,用1表示他这么认为,这样就定好协议了。

计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。
想要两台主机相互通信只约定好协议还不够,例如定好了协议,但是你用频率表示01,我用强弱表示01,就好比我用中国话,你用葡萄牙语一样,虽然大家可能遵守⼀套通信规则,但是语言不同,即便是订好了基本的协议,也是无法正常通信的。
所以,完善的协议,需要更多更细致的规定,并让参与的人都遵守。因此,在国际上就会有很多定制协议的组织或者公司站出来,例如IEEE电气电子工程师学会、ISO国际标准化组织、ITU国际电信联盟等等。
1.3 协议分层
协议本质也是软件,在设计上为了更好的进行模块化、解耦合,它也是被设计成为了层状结构。
任何问题都可以通过添加一层软件层来解决。

上图中协议只有两层:语言层和通信设备层。分层可以实现解耦合,让软件的维护成本更低。
当我们的主机A想通过网络向主机B通信的时候会产生很多问题,如下图:
例如你想向某个平台发送消息,那么这个消息至少要先到达你家的路由器吧!
所以就有了问题一:如何把数据在两个相邻设备之间进行传递?
而数据走向目的地的路径不止一条甚至路径繁多,如何保证到达目标主机。
所以就有了问题二:目标主机定位和选择的问题。
如果路上经过某个节点的时候这个节点的设备坏了怎么办。
所以就有了问题三:如果出现数据丢失的情况怎么办?
解决了这三个问题,数据就可以从主机A跨网络到达主机B了。保证数据从主机A跨网络到达主机B是手段,想要到达的目的是使用这个数据。
所以就有了问题四:如何处理这个数据呢?
解决完这四个问题,才能达到网络通信的目的,才能解决"人"的问题!
个人计算机内部也是网络结构,但是它们之间的相互通信为什么不会产生问题呢?因为它们之间的距离近,彼此之间可以直接相连,所以没有这些问题。但是两台主机通过网络通信就会产生这些问题,根本原因就是物理距离变远了。
这些问题的解决可以通过制定协议解决,所以协议本质上是一种解决方案。
如上,一层协议解决一个问题,这样分层就可以解耦合。网卡层解决如何把数据在两个相邻设备之间进行传递的问题;互联网层解决目标主机定位和选择的问题;传输层解决数据丢失的问题;应用层解决处理数据的问题。
1.3.1 OSI七层模型


如上,就是OSI七层参考模型。OSI的七层模型标准定的非常好,只不过有些层在其它技术人员实现的时候没办法做进操作系统所以就减成了四层或五层,典型的如TCP/IP协议栈。
1.3.2 TCP/IP 协议栈
TCP/IP五层(或四层)模型常被叫做TCP/IP协议栈。TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。
数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线LAN等标准。交换机(Switch)工作在数据链路层。
网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网络层。
传输层:负责两台主机之间的数据传输。如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

数据链路层解决如何把数据在两个相邻设备之间进行传递的问题;网络层解决目标主机定位和选择的问题;传输层解决数据丢失的问题;应用层解决处理数据的问题。
1.3 再识协议

TCP/IP协议的本质是一种解决方案,TCP/IP协议能分层,前提是因为问题本身能分层。
1.4 协议和操作系统的关系
操作系统是使用C语言+汇编语言写的,协议栈的部分是被设计到了操作系统内核中的,所以协议栈本身也是C语言写的。因此网络也是操作系统的一部分。

如上图,网卡就是底层硬件,数据链路层在驱动程序中,网络层和传输层这两层是被集成在内核中的,应用层在操作系统上层,由用户实现。
传输层最著名的协议是TCP,网络层最著名的协议是IP,而传输层和网络层这两层是现在内核中,所以TCP、IP是核心,因此把整个协议整体统称为TCP/IP并不过分。
所有的主机上面安装的操作系统可以不同,实际情况也是这样,但是所有的主机上面的协议栈必须按照标准进行相同的实现,这就是为什么不同的系统、主机之间可以相互通信。
1.5 什么是协议

操作系统可以不同但协议必须相同,对于协议的理解我们可以单独抽出一层,如上图,我们抽出传输层,假设在这一层定义一个struct protocol结构体,双方约定都定义这样的结构体类型,这样传输层传递给另一个主机的时候,这个主机就可以分析出里面的数据。
所以协议相同也可以理解成代码相同,数据类型相同。在内核角度,对协议的朴素理解:协议的本质就是结构体!
假如你在快递软件买了一个物品,你想要的是一个物品,但是你收到的是物品+快递单子,这个快递单子将来就叫做协议报头。它上面会记录各种信息,就像快递单子上一样记录着地址,姓名等各种信息。这些信息可以使用结构体存储起来,例如struct protocol header = {...};所以协议报头本质就是结构体变量,将来主机收到的也是协议报头+数据,也就是报文。
下面是Linux内核中的以太网帧报头:
// include/uapi/linux/if_ether.h
struct ethhdr {
unsigned char h_dest[ETH_ALEN]; // 目标MAC地址(6字节)
unsigned char h_source[ETH_ALEN]; // 源MAC地址(6字节)
__be16 h_proto; // 上层协议类型(0x0800=IP, 0x0806=ARP)
};
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。
1.6 网络传输基本流程
1.6.1 局域网通信
以太网和令牌环网就是具体的局域网。
两台主机在同一局域网中是可以直接进行通信的。原理类似上课,同学们上课都可以听到。
每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac地址,它占48比特位,由硬件固定,一张网卡一个mac地址。
Linux上可以通过ifconfig查询,Windows上可以通过ipconfig /all查询。


如上图,主机A想要给主机E发消息,源mac帧是MacA,目的mac帧是MacE,在这个过程中所在局域网的主机都可以收到这个消息,但是这些主机发现目的mac帧和自己的不一样就会将这个消息丢弃掉,这个丢弃的过程发生在物理层和数据链路层下两层,上层根本感知不到。只有mac帧是MacE的主机可以收到消息并将消息传递给上层。
当教室很安静的时候,老师说的话都可以听清楚,但是当教室很乱的时候自己说的话都可能听不清楚,这时候就发生了碰撞。
以太网也存在碰撞,称为以太网碰撞域。任何主机都能进行碰撞检测,原理就像你自己可以听到自己说话,但如果你自己听到你的话和你说的不一样时,就可以判断发生碰撞了。当主机发现发生碰撞之后,就会执行碰撞避免算法,也就是主机在接下来的一段时间不发消息。这个时候其它主机就可以趁空发送了。局域网通信就是基于碰撞检测和碰撞避免的不断重试的过程。
技术没有好坏之分,关键在于如何用,上面的原理也可以被用来瘫痪局域网,也就是通过某种工具绕过协议栈,不停的向局域网中发送垃圾数据,时刻产生碰撞,让那些主机都执行碰撞避免算法。
从系统视角看待,上面的碰撞检测、碰撞避免就是为了保证任一时刻,局域网只能由一个主机使用,也就是局域网就是共享资源、临界资源,我们要保证它的原子性。
令牌环网也一样,它是有一个唯一性的数据,叫做令牌,只有持有令牌的主机才可以在局域网中发消息,没有持有的主机不准发消息,这也保证了局域网的原子性。从系统角度来看这是事先加锁保证原子性的机制。
我们上面的例子中主机A为什么要给主机E发消息呀?是因为用户想要在主机A和主机E之间通信,所以如下图:
用户在上层想要把数据发出去需要贯穿协议栈!
而其中每层都有协议,所以当进行上述传输流程的时候,就要进行封装和解包。
其中上层传过来的数据叫做有效载荷,而本层会在有效载荷前面加上本层的报头。
如上图,封装的过程就是入栈的过程。而解包的过程就是出栈的过程。所以才把TCP/IP协议叫做协议栈。
封装的过程
同层之间,逻辑上认为它们可以直接通信,因为这一层发送的报文,与同层收到的相同。
明确一下在不同层的报文的叫法:数据链路层叫做数据帧,网络层叫做数据报,传输层叫做数据段,应用层叫做请求与应答。
协议本质是一个结构体类型,所以报头也就是结构体变量,每一层都会在报文前添加本层的报头。所以产生的报文需要在内核中找个缓冲区保存起来。
以我们之前的图为例,演示封装的过程:
如上图,当要封装本层的报头的时候,指针就指向报文的前面,然后通过sizeof(结构体变量)提前开辟出空间将结构体变量拷贝进去。
所以封装报头的本质其实就是在报文头部拷贝结构体变量!
下图为数据封装的过程:
解包和分用的过程
从接收报文的主机角度来看,整个过程是自底向上贯穿协议栈的。
在解包和分用的过程中面临的第一个问题就是报头和有效载荷分离的问题。
如上图,每层之间都提前约定好了协议,解包的时候就通过指针加上sizeof(结构体变量)就可以直接分离报头和有效载荷。
当然原理很简单,现实也面临其它问题。有的协议报头是固定的,有的协议报头是可变的,所以这时候就需要在结构体中标注清楚那里是报头那里是有效载荷。
解决了上面的这个问题就解决了解包的问题。
由于协议栈的每一层都有很多的协议,通过之前的图片我们也可以看出来,尤其是应用层协议非常多。所以在自底向上贯穿协议栈时,在本层协议交付给上层时,本层协议是如何知道自己应该把有效载荷交付给上层的哪一个协议呢?
协议内部是会标注自己应该交给上层的哪一个协议的,所以问题就解决了,至于协议是如何知道自己应该交给谁的这个问题,答案是在封装的时候,上层的XXX协议就告诉了下层协议它是谁,因此下层协议就在封装的时候标记了自己在分用时应该交给上层的哪一个协议。
因此这个时候就解决了分用的问题。
下面是数据分用的过程。
是一棵倒转的多叉树。
1.6.2 跨网络通信
认识 ip 地址
IP 协议有两个版本,IPv4 和 IPv6。IP 地址是在 IP 协议中,用来标识网络中不同主机的地址。对于 IPv4 来说,IP 地址是一个 4 字节,32 位的整数。对于 IPv6 来说,IP 地址是一个 16 字节,128 位的整数。以下默认讲述IPv4。
通常也使用 “点分十进制” 的字符串表示 IP 地址,例如 192.168.0.1;,用点分割的每一个数字表示一个字节,范围是 0 - 255。
查询ip地址Linux:ifconfig,Windows:ipconfig /all。

IP侧重点更多的是标识公网中唯一一台主机。IP能够提供主机定位和路径选择的能力,例如通过学生学号找到具体学生。
Mac vs IP
既然Mac地址能够标识主机的唯一性,那为什么还要有IP地址呢?
西游记大家都看过,唐僧一直有一套固定不变的地址:源地址东土大唐,目的地址西天。除此之外,他每经过一个地方都会介绍说上一站地址是哪里,这一站地址就到这里了。这也是一套地址,不过这套地址一直在变化。
在上面的例子中,固定不变的地址就是IP地址,一直在变化的地址就是Mac地址。IP地址的目的地址西天指引着唐僧规划路线合理的改变Mac地址!
所以IP地址提供长远目标,是路径选择的依据;Mac地址是当前或者下一跳的地址,解决的是局域网转发的问题。
跨网络通信流程图:
如上图,主机A封装的过程和局域网相同,不过跨网络通信时就会添加一个路由器角色,它处于网络层,所以封装好的报文会先进行解包分用到达路由器,然后路由器找到目的地址位于的局域网,在对报文进行封装交给目标主机网卡。再次封装时报文可能和之前解包的不同。
然后到达目标主机后,主机B收到的网络层之上的报文和主机A封装的相同。
详细流程:
上层交付下来的数据到达网络层之后,网络层通过检查目的IP地址和本局域网的IP就能够知道这个IP是本局域网的,还是不是本局域网的。对应报文如果不是本局域网的主机,网络层就可以将报文路径选择转发给路由器。网络层具有寻址、路径选择等功能。
如上图,上层交付的报文到达主机A的网络层后发现报文的目的IP地址不是当前局域网,于是在交付给数据链路层后,它封装的报头的目的Mac地址变成了路由器的一端的Mac地址macleft,这样报文就到达了路由器然后经过路由器的解包、寻址就找到了报文要传递的主机的Mac地址,然后路由器就交付给数据链路层,由它封装报头,报头的目的Mac地址就是macB了,这样就在目的局域网中传递给了目标主机。
上面就是详细流程,此时你就会发现:
如上图,网络层大家收发的都是同一种报文!
在早期的时候是局域网先出现的,这个时候各个国家有自己的标准,各自的标准不同,虽说都能标识自己的主机,但也仅限自己所在局域网内通信,但是全球通信是绝对不可能的。
也就是说局域网标准并不统一,标准不同,实现方式也不同。这就阻碍了互联网的发展。但在计算机世界中,任何问题都可以通过添加一层软件层来解决,所以网络层这一软件层屏蔽了底层硬件的差异,让大家都能看到同一种网络:IP网络!
所以**IP网络的意义还有统一互联网的通信标准!!!路由器是实现IP通信的底层的最重要的硬件!**
Mac地址和硬件强相关,所以它不适合用来互联网通信,而使用IP地址进行互联网通信本质上也是一种解耦合!Mac地址全球唯一,这话没错,但是Mac地址不适合用来全球通信,它很难做到,它最大的作用还是在局域网内标识一台主机的唯一性!
IP地址在整个路由过程中一直不变,Mac地址一直在变。
目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据。
总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)