【Linux网络】网络编程基础
文章目录
- 网络分层模型
- OSI的网络分层模型
- TCP/IP五层(或四层)模型
- 初识协议
- 操作系统与网络的关系
- 再识协议
- 网络传输的基本流程
- 局域网网络传输流程
- 认识MAC地址
- 数据包封装和分用
- 跨网络传输流程
网络分层模型
网络设计之初,国际标准组织就设计了第一套互联网标准,用于规范互联网,并在全世界推行。这套标准叫做OSI,即(Open System Interconnection)开放式系统互连参考模型
OSI的网络分层模型
分层 | 功能 |
---|---|
应用层 | 直接为用户提供各种网络应用服务,如文件传输、电子邮件、远程登录、网页浏览等。常见的应用层协议有 HTTP、FTP、SMTP、DNS 等 |
表示层 | 主要负责处理数据的表示和转换,确保不同系统之间能够正确地理解和处理数据。它对应用层传来的数据进行加密、解密、压缩、解压缩等操作。 |
会话层 | 主要负责建立、维护和管理会话连接。它在不同主机的应用程序之间建立会话,并提供会话的同步和管理功能。 |
传输层 | 主要负责在不同主机上的应用程序之间提供可靠的端到端通信。它为上层应用提供了两种不同的传输服务:面向连接的 TCP 服务和无连接的 UDP 服务。 |
网络层 | 主要功能是为数据在不同网络之间传输提供路径选择和寻址功能。它负责将数据包从源节点传输到目标节点,跨越多个数据链路。 |
数据链路层 | 负责在相邻节点之间提供可靠的数据传输。它将物理层传来的原始比特流组装成帧,并进行差错检测和纠正。 |
物理层 | 主要负责处理物理介质上的信号传输,包括电缆、光纤、无线等。它定义了物理设备的电气、机械、功能和规程特性。 |
OSI模型通过将网络通信分为七个独立的层,允许每一层专注于特定的功能。这种模块化设计使得开发、测试和维护变得更加容易。每一层可以独立开发、更新或替换,而不影响其他层。
在主流的教材中,把这种模型称为 “法律上的标准”,因为其没有被广泛推行。七层模型有点过于冗余了,实际开发中并不实用。其实七层模型的设计理念是非常优秀的,最后使用的虽然是五层模型,但是在编程时,依然使用七层模型的思想。
TCP/IP五层(或四层)模型
这里为什么说是五层或四层呢,因为我们讲的时候大多都是讲软件层,而物理层属于硬件层,所以就不提了。
分层 | 功能 |
---|---|
应用层 | 直接为用户提供各种网络应用服务,如文件传输、电子邮件、远程登录、网页浏览等。常见的应用层协议有 HTTP、FTP、SMTP、DNS 等 |
传输层 | 主要负责在不同主机上的应用程序之间提供可靠的端到端通信。它为上层应用提供了两种不同的传输服务:面向连接的 TCP 服务和无连接的 UDP 服务。 |
网络层 | 主要功能是为数据在不同网络之间传输提供路径选择和寻址功能。它负责将数据包从源节点传输到目标节点,跨越多个数据链路。 |
数据链路层 | 负责在相邻节点之间提供可靠的数据传输。它将物理层传来的原始比特流组装成帧,并进行差错检测和纠正。 |
物理层 | 主要负责处理物理介质上的信号传输,包括电缆、光纤、无线等。它定义了物理设备的电气、机械、功能和规程特性。 |
相比于OSI的七层模型,该模型将 应用层,表示层,会话层 合为了应用层。这是因为在编程中,这三层的功能都由程序员实现,所以最后干脆都合为应用层了。
对于一个基于 TCP 的网络通信过程,用户首先要建立 TCP 连接,连接建立成功后就可以收到来自其他主机的数据,此时就要对数据的格式进行处理,比如对数据进行解密,最后将解密的数据进行业务处理。
以下是一个程序员进行网络编程的基本流程,在该流程中,每个步骤都对应一个OSI的分层:
- 会话层:建立TCP连接
- 表示层:对数据的格式进行处理,比如对数据进行解密
- 应用层:将解密的数据进行业务处理
就是因为这三层的功能都由自己编码完成,所以最后这三层就被合并成了应用层。
初识协议
协议的定义为:协议是控制两个对等实体进行逻辑通信的规则的集合
协议的目的是为了更加准确高效地在网络传递数据,协议的三要素是:语法,语义,同步
- 语法:规定通信双方交换信息的结构和格式
- 语义:规定通信双方交换信息的含义和目的。
- 时序(同步):规定通信双方的时序关系。
可以用两个人打电话的过程来理解协议的概念:
语法:就像两个人在电话中说话要使用双方都能听懂的语言,比如中文,并且要遵循一定的语言规范,有正确的语序、词汇用法等,这对应于协议中规定的数据格式和结构。
语义:通话时,双方说的话都有特定含义,比如一方说 “我下午三点到”,另一方就知道这是关于时间和事件的信息,需要做出相应理解和回应。这类似于协议中数据每个部分的含义以及通信双方的动作和响应。
时序:打电话时也有一定的顺序和节奏,一方说完后另一方再说话,不能同时抢着说,不然会听不清。如果一方没听清楚,会要求对方重复。这就像协议中规定的事件执行顺序和节奏,确保数据传输的有序和正确。
整个打电话的过程就像网络通信中的协议,通过遵循这些类似语法、语义、时序的规则,双方才能顺利沟通,就像网络中的设备通过协议来实现数据的正确传输和理解。
在实际的计算机网络中,两个主机之间的距离可能是几十公里,几百公里。传递信息的成本非常高,此时协议的重要性就不言而喻了。
操作系统与网络的关系
在这篇博客:操作系统概念中讲过,操作系统的架构一般是这样的:
而在上面所讲的网络的五层模型,与该架构的关系非常大,它们是有对应关系的,如下:
网络层次 | 系统层次 | 关系 |
---|---|---|
应用层 | 用户、用户操作接口、系统调用接口 | 应用层协议由用户自己实现 |
运输层 | 操作系统 | TCP / UDP 协议在操作系统内部实现 |
网络层 | 操作系统 | IP协议在操作系统内部实现 |
数据链路层 | 驱动程序 | 数据链路层协议在网卡的驱动程序实现 |
物理层 | 底层硬件 | 物理层基于操作系统的硬件设备网卡 |
从这张图也可以看出,网络的网络层和运输层也是在操作系统中的,也就是说操作系统的源码中包含了实现TCP/IP等协议。
而操作系统又是用C语言写的,因此计算机运输层以下的网络协议,都是C语言结构体完成的。
目前主流的Windows,Linux,MacOS系统的核心也是C/C++,对应的网络协议栈也就是C/C++完成。假设现在新出现一个操作系统,是其他语言编写的,那么这个操作系统就无法解析C/C++的结构体,进而导致无法理解协议的内容,最后无法联网。
世界上所有操作系统在设计时,可以和主流的操作系统不一样,但想要联网,就必须遵顼TCP/IP协议栈,进而必须使用C/C++完成网络部分内核代码。
总结一下,我们可以将网络分层和操作系统的架构,进行相关联,就是如下这个样子:
再识协议
上面的内容,我们只是懂了一些基本概念,还是达不到我们的目标,下面我们再次重新理解协议和协议分层。为什么要有TCP/IP协议?
- 首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。
- 其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题(比如数据的可靠性,主机的定位,数据报局域网转发的问题),有问题就得解决问题,所以需要新的协议来解决这些问题
从语言角度来理解协议:
问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?
回答:答案是肯定的!因为双方都有同样的结构体类型 struct
protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型。
因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。
网络传输的基本流程
局域网网络传输流程
- 以以太网为例,首先需要明确的是,在同一个局域网内的主机可以直接通信。
- 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址
认识MAC地址
- MAC 地址用来识别数据链路层中相连的节点
- 长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)
以太网中,任何时刻,只允许一台机器向网络中发送数据
- 如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞
- 所有发送数据的主机要进行碰撞检测和碰撞避免
- 没有交换机的情况下,一个以太网就是一个碰撞域
- 局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac 地址判定
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程
而其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包
下面我们明确一下概念
- 每层的第一个字段,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
- 故,报文 = 报头 + 有效载荷
不同的协议层对数据包有不同的称谓,我们在明确一下不同层的完整报文的叫法
- 传输层交数据段
- 网络层叫数据报
- 链路层叫数据帧
数据包封装和分用
下图为数据分用的过程:
 
跨网络传输流程
IP 协议有两个版本, IPv4 和 IPv6. 我们所讲的IP默认都是指 IPv4
- IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址;
- 对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数;
- 我们通常也使用 “点分十进制” 的字符串表示 IP 地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一个字节, 范围是 0 - 255;
跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
首先理解一下 IP 地址的意义
- 标识网络位置:IP 地址是主机在网络中的逻辑地址标识。如图1用户 A 的 IP 地址为 192.168.2.2,用户 B 的 IP 地址为 172.168.2.2,这些地址明确了主机在网络中的位置,如同现实中的门牌号,方便数据在网络中找到目标主机。
- 路径选择依据:在网络层,IP 地址是数据传输路径选择的关键。当用户 A 要给用户 B 发送数据时,网络层根据目的 IP 地址(172.168.2.2)来确定数据的传输路径。如果发现目的主机不在本地局域网,就像图中显示的,会将数据推送给路由器进行转发,路由器依据 IP 地址信息不断地选择合适的路径,使数据朝着目标网络和主机传输。
- 跨网络通信基础:IP 地址使得不同网络之间的主机能够相互通信。图中展示了用户 A 所在网络和用户 B 所在网络通过路由器连接,IP 地址在这个跨网络的通信过程中起到了桥梁作用,屏蔽了不同网络底层的差异,实现了不同网络中主机间的数据交互。
对比 IP 地址和 Mac 地址的区别
- IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)
- Mac 地址一直在变
- 目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依据,mac 地址是局域网转发的重要依据
提炼 IP 网络的意义和网络通信的宏观流程
IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异