31.网络基础------协议与网络传输
文章目录
协议
第一层认识
-
协议是什么:协议的本质是一种约定。计算机之间的通信需要类似的约定,计算机相当于打电话的人和接电话的人,网络通信必须有对应的约定。
计算机体系中的协议无处不在
在计算机体系中,协议无处不在。即使不涉及网络,计算机内部也存在协议,比如CPU和内存之间的协议、内存和磁盘之间的协议。
- 磁盘设备有自己的协议,比如通过LBA地址读取或写入数据。磁盘需要知道二进制序列中的哪些位表示读或写,哪些位表示要访问的内存地址或磁盘的LBA地址。这些二进制序列的格式和含义就是磁盘的协议。
网络协议
在网络中,不同的计算机硬件、操作系统和软件厂商非常多,要让这些不同的计算机之间能够通信,必须有一套共同遵守的标准。这套标准就是网络协议。网络协议的作用是将不同变为相同,确保所有设备都能遵守同样的规则。
协议不仅存在于网络通信中,也存在于计算机内部的各个硬件设备之间。每种硬件设备都有自己的协议,网络协议只是其中之一。
-
协议分层:这些约定分为很多层级,比如硬件层面上如何识别光电信号,有的计算机用光电信号的强弱表示0和1,有的用有无信号表示0和1,计算机设备在硬件层面上必须先做好对应的约定,才能进行通信。除了硬件上的约定,还有软件上的约定,比如数据的编码格式、类型、大小、存储方式等。计算机内部存在若干协议,包括硬件和软件上的协议。
-
软件分层的好处
软件分层是为了更好地进行模块化解耦,协议作为软件的一部分,也被设计成层状结构。分层使得层与层之间的调用关系清晰,耦合度低,便于上层调用下层接口,下层支撑上层功能。软件分层的好处在于可以独立修改或替换某一层而不影响其他层,提高了代码的可维护性。分层是解耦的有效方式,层与层之间只有接口调用关系,数据结构上相互独立,实现了高内聚低耦合的设计原则
- 在面向过程的语言中,函数调用体现了软件分层的思想,函数调用的栈帧嵌套式调用就是分层的结果。
- 继承和多态是面向对象语言中支持软件分层的特性,继承体系本身就是分层的体现。
-
OSI七层模型
OSI(Open System Interconnection, 开放系统互连) 七层网络模型称为开放式系统互联参考模型, 是一个逻辑上的定义和规范。OSI模型将网络协议分为七层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。尽管OSI模型理论上完善,但实际工程中因其复杂性,通常采用TCP/IP四层模型(链路层、网络层、传输层、应用层)。定标准与实现标准的人可能不同,但遵循同一套协议能确保不同系统(如Windows、Linux、手机)之间的兼容性。


TCP/IP五层(或四层)模型
TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇。TCP/IP 通讯协议采用了 5 层的层级结构,物理层------负责光/电信号的传递方式;数据链路层: 负责设备之间的数据帧的传送和识别;网络层: 负责地址管理和路由选择;传输层: 负责两台主机之间的数据传输;应用层: 负责应用程序间沟通

- TCP/IP协议的存在源于主机间通信距离变长带来的问题。TCP/IP协议的本质是网络通信的解决方案,其分层设计的根本原因是通信距离的增加导致的问题分层
第二层认识
要对协议有更进一步的认识,我们需要知道:
- 网络通信的根本目的不是单纯的两台主机之间的数据传输,而是主机上的用户或应用程序之间的交互。网络通信不仅需要解决数据传输问题,还需要确保应用程序能够正确处理数据。应用层协议的存在就是为了实现这一目标。应用层协议确保数据在用户或应用程序之间能够被正确理解和处理。
- 操作系统与网络协议栈之间存在紧密的关系。网络协议栈的实现必须遵循统一的标准,例如tcpip协议。不同操作系统(如linux和windows)虽然内核实现不同,但网络协议栈的部分必须保持一致,以确保主机之间的通信。网络协议栈的分层结构与操作系统的分层结构相对应。物理层由硬件实现,数据链路层由驱动程序实现,网络层和传输层由操作系统内核实现,应用层由用户程序实现。

-
协议本质上是操作系统之间为网络通信约定的数据结构,即结构体。
-
网络协议是操作系统内核的一部分,传输层和网络层协议在操作系统内核中实现。不同操作系统之间可以进行网络通信,如Linux和Windows平台可以互相通信。协议本质上是操作系统之间为网络通信约定的数据结构,即结构体。操作系统和网络协议大部分使用C语言编写,不同操作系统的网络部分标准必须相同以确保通信。协议分层结构中,同层协议可以互相识别对方的结构体类型。
-
协议在计算机中表现为结构体,Windows和Linux主机通信时使用相同的数据结构。主机A定义结构体并填充数据后发送给主机B,主机B能准确提取数据因为双方有相同的结构体类型。网络协议代码相同确保了结构体类型的一致性,这是通信的基础。协议的结构体本质使得双方主机在数据通信时能正确解释数据内容。
-
以快递和快递单子比喻:
发货时需要填写包含发货方、收货方信息等字段的单子,这相当于对结构体进行实例化。收货方收到的物品比实际需要的多了一个快递单子,这个单子就是协议结构体的体现。快递单子可以被发货方和收货方共同理解,就像通信双方都能识别相同的协议结构体。虽然收货方最终只需要物品本身(相当于应用数据),但必须通过包含协议信息(快递单子)的完整包裹来传递。网络通信过程中,发送信息时需要在前端附加一个称为协议报头的结构体变量,这个结构体双方都认识,使得接收方能够正确解析和处理报文。协议报头类似于快递单,发货方和收货方都理解单子上各个字段的含义。
-
网络传输的基本流程
局域网传输的基本流程
MAC地址
-
局域网内的主机可以直接通信,不需要经过复杂的网络路由。例如在家庭网络中,电脑、手机等设备连接同一个路由器就属于同一个局域网,使用手机热点时,连接该热点的设备也属于同一个局域网。
-
在局域网中,每台主机都有一个唯一的MAC地址作为标识。
-
MAC地址是网卡出厂时内置的48位固定序列值,用于在局域网中唯一标识每台主机。
-
在局域网通信时,发送的报文中会包含源MAC地址和目标MAC地址。所有主机都能收到这个报文,但只有目标MAC地址与自身匹配的主机才会处理,其他主机会丢弃该报文。
-
可以通过ifconfig命令查看Linux系统的MAC地址,通常显示为以太网接口eth0或ens3的硬件地址。Windows系统则使用ipconfig命令查看,显示为以太网适配器的物理地址。
-
局域网通信的原理类似于教室场景,当老师点名时,虽然所有人都能听到,但只有被叫到名字的学生会回应。类似地,在局域网中,所有主机都能收到传输的报文,但只有目标主机会处理。每台主机通过比较报文中的目标MAC地址与自身地址来决定是否处理该报文。
-
MAC的唯一性:MAC地址内嵌在网卡中,出厂时即确定,一般不能修改,具有唯一性。虚拟机使用的MAC地址并非真实,而是通过虚拟化技术构建的。MAC地址的唯一性只需在局域网内保证即可,因此可以在局域网内自行构建48比特位的16进制值,只要不与局域网内其他地址冲突即可。
-
局域网通信的碰撞检测
早期使用集线器(Hub) 构建的共享式以太网:局域网通信中,任何时刻只允许存在一份有效报文,否则会发生数据碰撞。例如,主机A和主机B同时发送报文会导致光电信号干扰,称为碰撞。发生碰撞后,主机会执行碰撞检测和碰撞避免机制,随机休眠一段时间后重发报文。这种机制可以避免持续冲突,让其他主机在休眠期间正常通信。休眠期间,其他主机可以正常通信,从而释放网络资源。这种机制类似于在教室中多人同时说话导致混乱,通过轮流发言避免干扰。
以太网局域网被定义为一个碰撞域,其中多台主机共享通信资源。当多台主机同时发送数据时会发生数据碰撞,导致互相干扰。发送主机需要进行碰撞检测和碰撞避免来确保通信可靠性。
从互斥的角度理解碰撞机制:碰撞检测和避免的本质是保证以太网使用的唯一性。以太网被视为一种临界资源,所有主机以互斥方式访问,但采用的是特殊的不加锁方式,即直接使用并在碰撞出错后再处理。主机发送数据时执行的代码被称为临界区,通过碰撞检测和避免算法来保证临界资源使用时的数据读写原子性。
局域网通信中的数据封装与解包过程


-
数据通信是由用户层触发的自上而下的过程。当主机A要给主机B发送消息时,消息从应用层开始,经过传输层、网络层、数据链路层,最终到达网卡。在这个过程中,每一层都会添加自己的报头,这个过程称为封装。报文从应用层开始,每经过一层就添加该层的报头,最终形成完整的链路层帧。接收数据时,从链路层开始,逐层剥离报头并向上交付。同层协议能够相互识别报头,因为使用的是相同的结构体定义。
-
报文的组成是报头加有效载荷,其中有效载荷包含上层传递下来的完整信息(包括上层报头)。当主机B收到数据时,需要从下往上进行解包处理。解包的第一步是将报头和有效载荷分离,这个过程称为解包。每一层协议都能识别同层的报头,因为使用的是相同的结构体类型。
-
链路层在向上交付时需要确定将有效载荷交给网络层的哪个协议处理,如IP、ICMP、IGMP等。每一层的报头都必须包含两个关键信息:一是帮助分离报头和有效载荷的字段,包括报头自身大小和有效载荷长度;二是指示上层协议类型的字段,这样接收方才能正确地将有效载荷交付给对应的上层协议处理。这些是几乎所有报头的共性特征。报头中必须明确标识上层协议的身份,以便将有效载荷正确交付给上层协议。这个过程被称为"分用"。
下图为数据分用的过程:

整体复盘

跨网络传输流程
IP地址
-
IP地址分为IPv4和IPv6两种,通常默认指IPv4。IPv4地址是一个四字节32位的整数,通常以点分十进制表示,用点分隔成四部分,每部分取值范围0-255。点分十进制表示法虽然直观,但在实际网络编程中,IP地址通常以32位二进制数或网络字节序的四字节形式处理
-
IP地址用于标识网络中的不同主机
-
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器

- IP地址分为公网IP和私有IP两种类型。云服务器提供的IP地址通常是公网IP,而本地查看到的可能是内网或私有IP。云服务商会对IP地址进行转换,使得用户看到的可能不是机器的真实IP地址。虚拟机的情况有所不同,其IP地址通常与入网IP地址一致。公网IP是全球唯一的,用于互联网上的通信,而私有IP用于内部网络,需要通过NAT转换才能访问互联网。
IP地址与MAC地址的区别
-
IP地址和MAC地址都能标识主机唯一性,但两者有本质区别。通过唐僧西天取经的比喻来解释:唐僧身上有两套地址,一套是长期不变的"东土大唐到西天"(类比IP地址),另一套是阶段性变化的"当前所在城池到下一站"(类比MAC地址)。
-
IP地址用于跨网络通信的路由选择,而MAC地址用于本地网络内的设备寻址。路由决策基于目的IP地址,而不是MAC地址。路由就是路径选择的过程,类似于唐僧每到一个城池询问下一站方向。网络中的路由器相当于城池,路由算法相当于国王给出的方向建议。
-
IP地址具有层次结构,便于路由聚合和寻址,而MAC地址是扁平化的,只在本地网络有效。在实际通信中,源和目的IP地址在整个传输过程中保持不变,而MAC地址则在每一跳都会变化。这种设计使得IP层能够实现全球范围的寻址和路由,而MAC层负责本地网络内的实际数据传输,MAC地址只在局域网内有效,一旦离开局域网就会被替换。
总结:
特性 | IP地址 | MAC地址 |
---|---|---|
工作层次 | 网络层 | 数据链路层 |
地址性质 | 逻辑地址,由网络管理员或DHCP服务器分配 | 物理地址,由设备制造商固化在网卡中 |
可变性 | 可变,取决于所在的网络环境 | 基本不变(除虚拟化等特殊情况) |
作用范围 | 全局,用于在不同网络之间进行寻址和路由 | 局部,只在同一个局域网内有效 |
在路由过程中的行为 | 目的IP地址在整个通信过程中保持不变,它定义了通信的最终目的地 | 源和目的MAC地址在每一跳(经过每个路由器)都会改变,它只标识当前链路的两个端点 |
核心功能 | 路径选择 的主要依据。类似于快递包裹上的最终收件人地址(城市、街道、门牌号) | 局域网内设备标识 的直接依据。类似于把包裹交给下一站快递员这个动作 |

路由器在网络通信中的角色与功能
-
路由器作为连接不同子网的关键设备,必须能够处理两个不同子网的通信需求。路由器必须同时具备连接两个不同子网的能力和相应的通信协议支持。从主机A的视角,路由器就像是一台普通主机,通信时数据发送到路由器的网卡一;而从主机B的视角,数据则发送到路由器的网卡二。
-
任何具有网络层功能的主机都具备基本的路由能力。路由器不仅提供路由功能,还能构建子网。家庭或宿舍中的路由器会自动为连接设备分配IP地址,用户通常不需要手动配置。
-
当主机A需要与不同子网的主机B通信时,它首先会将数据发送给路由器。这个决策是由主机A的网络层做出的,基于目的IP地址与本地IP地址的比对结果。如果目的地址不在同一子网,主机A就知道需要通过路由器转发。主机A无法直接知道目的主机的具体位置,但能判断出目的地址不属于本地子网。这种判断基于IP地址的结构差异。路由器作为子网的出口,负责将数据转发到其他网络。

总结
IP网络通过分层设计有效屏蔽了底层网络的差异。IP网络成为全球跨网络通信的统一标准,IP层之上的通信完全一致,而IP层之下可以保持多样性。这种设计既尊重了历史发展形成的各种局域网标准,又满足了跨网络通信的需求。虽然从技术上讲可以只用IP地址而取消MAC地址,但为了保持向后兼容性,MAC地址仍然被保留下来。这种设计使得现有的各种局域网设备能够继续工作,同时支持跨网络通信