Linux网络编程基础(一):从计算机网络发展、通信协议到OSI七层与TCP/IP分层模型

文章目录
- Linux网络编程基础(一):从计算机网络发展、通信协议到OSI七层与TCP/IP分层模型
- 一、计算机网络的发展背景
- 二、局域网与广域网
- 三、初识网络协议
- 四、计算机之间为什么必须遵守协议?
- 五、谁负责制定网络协议标准?
- 六、为什么网络协议需要分层?
- 七、OSI七层网络模型
- 八、OSI七层分别解决什么问题?
- 九、OSI七层模型的意义与局限
- 十、TCP/IP协议族
- 十一、TCP/IP五层模型
- 十二、TCP/IP四层模型与五层模型有什么区别?
- 十三、不同网络设备主要工作在哪一层?
- 十四、再次理解:为什么需要TCP/IP协议?
- 十五、TCP/IP协议与操作系统有什么关系?
- 十六、从C/C++程序员角度理解协议
- 十七、网络购物与快递单:再次理解协议
- 十八、本篇知识总结
- 十九、下一篇将解决什么问题?
前言:为什么计算机需要网络?
在学习 Linux 系统编程时,我们已经接触过进程、线程、文件 IO 和进程间通信等内容。
例如,可以通过管道让两个进程交换数据,也可以通过共享内存让不同进程访问同一块内存区域。
但是,这些实验主要发生在同一台计算机内部。
假设现在有两个程序:
- 程序 A 运行在计算机 A 上。
- 程序 B 运行在计算机 B 上。
它们不属于同一台主机,却需要相互交换数据。
那么,计算机 A 怎样把数据发送到计算机 B?两台计算机如何识别对方发送的数据?如果中间存在交换机、路由器,又应该由谁负责数据转发?
这些问题都需要计算机网络来解决。
本文从计算机网络的发展背景出发,逐步理解网络协议为什么存在、为什么需要协议分层,以及 OSI 七层模型和 TCP/IP 模型的基本结构。
最后,我们还将从 C/C++ 程序员的角度,通过一个简单的结构体案例,重新理解网络协议的本质。
一、计算机网络的发展背景
1.1 独立模式:计算机之间相互独立
计算机最初可以独立完成数据处理任务。
例如,某个公司有三台计算机:
计算机 A:负责业务1
计算机 B:负责业务2
计算机 C:负责业务3
每台计算机都拥有各自的数据和程序。
假设:
业务 1 需要业务 2 中的数据
但两台计算机没有任何通信连接。
此时,可能需要人工将数据从计算机 B 转移到计算机 A。
例如:
计算机 B
|
v
人工复制数据
|
v
计算机 A
这种方式存在明显的问题。
首先,数据交换效率较低。
其次,当计算机数量增加、业务之间联系更加频繁时,人工传递数据的成本会不断提高。
因此,人们自然希望:
能否让计算机之间直接交换数据?
这就推动了计算机网络的发展。

1.2 网络互联:让多台计算机交换数据
如果把多台计算机连接起来,就可以在它们之间传递信息。
例如:
计算机 A
|
|
共享通信网络
|
|
计算机 B
计算机 A 可以通过网络向计算机 B 发送数据。
计算机 B 也可以通过网络向计算机 A 发送数据。
这意味着:
原来需要人工完成的数据传递
可以转变为:
计算机通过网络自动完成数据传递
网络互联的价值不仅是连接设备,更重要的是让设备能够协作。
例如,一个公司的多台计算机可以共同使用某台服务器上的业务数据。
1.3 为什么网络互联是必然趋势?
计算机本质上是帮助人们处理信息的工具。
而人与人之间的工作往往需要协作。
例如:
部门 A 处理订单
部门 B 处理库存
部门 C 处理物流
这些业务彼此相关。
如果不同部门的计算机之间无法交换数据,就会影响整个业务系统的效率。
因此:
只要不同计算机承担的业务之间存在协作需求,就需要建立相应的数据通信机制。
二、局域网与广域网
随着计算机数量的增加,网络规模也不断扩大。
根据覆盖范围和使用场景,可以认识两类基本网络。
2.1 局域网 LAN
LAN 是:
Local Area Network
中文称为:
局域网。
例如,一个家庭、办公室或校园内,可能存在多台联网设备。
计算机 A ──┐
│
计算机 B ──┼── 交换机 ── 路由器
│
计算机 C ──┘
这些设备可以通过局域网交换数据。
局域网通常具有覆盖范围相对有限、便于统一管理等特点。
在局域网中,经常会接触到:
交换机 Switch
路由器 Router
这两类网络设备。
现阶段先知道它们能够帮助网络设备连接与通信,后面再结合协议分层理解它们的作用。
2.2 广域网 WAN
WAN 是:
Wide Area Network
中文称为:
广域网。
当两台计算机相距很远时,例如位于不同城市,它们仍然可能需要进行通信。
这时就需要将不同地区的网络互联起来。
例如:
北京局域网
|
v
WAN
|
v
上海局域网
|
v
其他地区网络
广域网能够跨越较大的地理范围连接不同网络。
2.3 LAN 与 WAN 是绝对划分吗?
不是。
局域网和广域网的划分具有一定的相对性。
例如,一个企业的内部网络可能覆盖多个建筑,甚至多个地区。
因此:
局域网和广域网主要帮助我们理解网络的规模与组织方式,而不是根据某一个固定距离严格划分。
2.4 从局域网到互联网
可以将不同局域网通过路由设备连接起来:
LAN A ── Router A ──┐
│
互联网络
│
LAN B ── Router B ──┤
│
LAN C ── Router C ──┘
这样,不同局域网中的计算机就有机会进行跨网络通信。
这也提出了新的问题:
不同厂家生产的计算机、操作系统和网络设备,怎样保证彼此能够理解对方的数据?
这就需要网络协议。

三、初识网络协议
3.1 什么是协议?
协议(Protocol)的基本含义是:
通信参与者共同遵守的一组约定。
先不考虑计算机,举一个生活中的例子。
假设两个人通过电话联系,并提前约定:
电话响一声就挂断:
表示计划正常进行。
电话响两声就挂断:
表示需要重新安排。
只要双方都理解这个约定,就能够通过电话铃声传递简单信息。
其中:
响一声
和:
响两声
相当于两种不同的消息格式。
而:
响一声代表什么
响两声代表什么
就是双方共同约定的规则。
这就是一个非常简单的通信协议。
3.2 如果双方没有约定,会发生什么?
假设发送方认为:
响一声:成功
响两声:失败
但是接收方认为:
响一声:失败
响两声:成功
虽然双方都能够听到铃声,但会对信息产生不同理解。
因此:
能够收到数据,不代表能够正确理解数据。
协议就是为了解决通信双方对信息的解释必须一致的问题。

四、计算机之间为什么必须遵守协议?
4.1 计算机传输的最终是信息
计算机内部使用二进制数据:
0
1
表示信息。
而在实际传输介质中,这些信息可以通过不同的物理信号进行承载。
例如:
电信号
光信号
无线电磁波
不同通信技术会使用相应的信号变化和编码规则传递比特信息。
例如:
01010110
需要通过发送端和接收端共同理解的编码方式,才能正确恢复数据。
4.2 只要双方约定数据格式就可以了吗?
先思考一个问题。
假设有两台计算机:
计算机 A
计算机 B
计算机 A 采用某种规则,把电压变化解释为:
0和1
计算机 B 却采用另一种不兼容的规则解释信号。
那么,即使双方已经约定:
前4个字节表示长度
后面的字节表示消息内容
也可能无法正确通信。
原因是双方连最基本的信号编码都没有统一。
这就像:
一个人使用中文
另一个人使用葡萄牙语
即使双方约定了“先介绍姓名,再介绍年龄”,仍然不能保证互相理解。
因此,完善的通信协议不能只规定某个消息的格式。
还需要对通信所依赖的各个方面作出约定。
4.3 不同厂家为什么需要统一标准?
实际计算机网络中,存在大量不同的参与者。
例如:
计算机生产厂商
操作系统开发者
网卡生产厂商
交换机和路由器生产厂商
应用软件开发者
假设:
厂商 A 有一套协议
厂商 B 有另一套协议
厂商 C 又有另一套协议
如果它们彼此不兼容,就很难构建开放的计算机网络。
因此需要由相关标准化组织制定并推广共同遵守的通信规范。
这就是网络标准的重要意义:
让不同软硬件系统能够按照相同规则进行通信。
五、谁负责制定网络协议标准?
网络协议并不是由某一家企业随意决定以后,所有设备就必须自动遵守。
很多重要协议由国际标准组织、行业组织以及开放技术社区共同推动。
5.1 IEEE
IEEE 全称:
Institute of Electrical and Electronics Engineers
即电气电子工程师学会。
在计算机网络领域,我们经常遇到:
IEEE 802
系列标准。
例如:
IEEE 802.3
与以太网技术有关。
IEEE 802.11
与无线局域网技术有关。
因此,以后学习以太网和 Wi-Fi 时,经常会遇到 IEEE 制定的标准。
5.2 ISO
ISO 是:
International Organization for Standardization
即国际标准化组织。
它在计算机网络基础学习中非常重要的一个概念是:
OSI
也就是开放系统互连参考模型。
后面会专门介绍它的七层结构。
5.3 ITU
ITU 是:
International Telecommunication Union
即国际电信联盟。
它主要在电信和信息通信技术领域推动国际协调与标准化工作。
例如:
ITU-T
就是 ITU 中负责电信标准化的重要部门。
5.4 ETSI
ETSI 全称:
European Telecommunications Standards Institute
即欧洲电信标准协会。
它在欧洲地区的电信及通信标准化方面发挥重要作用。
5.5 ASTAP
ASTAP 是面向亚太地区电信标准化协作的组织。
其作用主要体现在推动相关地区信息通信标准化工作的交流与协调。
5.6 IETF
IETF 全称:
Internet Engineering Task Force
即互联网工程任务组。
它与互联网协议的标准化密切相关。
例如很多互联网协议都以:
RFC
文档的形式进行记录、讨论和规范。
RFC 全称:
Request for Comments
以后接触:
IP
TCP
UDP
HTTP
等协议时,经常会看到 RFC 文档。
5.7 企业与监管机构
除了上述组织,企业也可以设计自己的通信协议,并参与相关标准制定。
某些企业开发的协议或技术,也可能进一步形成行业标准。
另外,通信领域还存在:
FCC
等监管机构。
监管机构与标准化组织的职责有所不同,前者主要负责相关通信领域的监管。
5.8 为什么要认识这些组织?
不需要记住每个组织的全部职责。
当前最重要的是建立一个认识:
现代计算机网络依赖大量公开、可共同实现的技术规范。
不同厂商只要按照兼容的规范实现设备和软件,就能够在相应条件下交换数据。

六、为什么网络协议需要分层?
现在我们已经知道:
通信需要协议
但接下来还有一个问题:
能否把计算机通信所需的全部功能都写进一个巨大的协议中?
理论上可以设计非常复杂的整体方案。
但实际工程中,这样会产生大量问题。
例如:
通信介质改变
可能影响上层的数据组织。
应用程序改变
又可能迫使底层设备修改实现。
如果所有功能高度耦合,就难以维护和扩展。
因此,我们需要进行:
协议分层(Protocol Layering)。
6.1 从电话通信案例理解分层
继续使用两个人打电话的例子。
假设:
A和B使用中文交流
那么整个通信过程可以先抽象为两个部分。
第一部分:
语言层
负责双方使用什么语言、怎样理解消息内容。
第二部分:
通信设备层
负责通过电话设备传递声音。
可以画成:
用户 A 用户 B
语言层 <------------------> 语言层
| |
v v
通信设备层 <----------------> 通信设备层
两层解决的问题不同。
6.2 如果更换电话设备,需要更换语言吗?
不一定。
例如:
原来使用有线电话
后来改成:
使用无线电话
只要底层仍然能够正确传递语音,上层就不需要因此改用另一种语言。
同样,如果双方从中文改用英语,底层的电话设备也不一定需要修改。
这正体现了:
不同层负责不同问题,能够降低相互依赖。
6.3 软件分层的好处
降低耦合
每层主要关注自己的职责,不需要掌握所有其他层的内部实现。
便于维护
某层实现发生变化,只要它提供的接口仍然符合约定,就可以减少对其他层的影响。
便于扩展
可以在相同接口下替换某层的实现。
方便分工
不同开发者可以分别负责不同层的功能。
6.4 分层不能消除所有联系
需要注意:
协议分层不表示每一层都完全独立。
因为上层仍然需要使用下层提供的服务。
例如:
上层需要发送数据
|
v
调用下层提供的发送服务
所以更准确地说:
分层是在明确依赖关系的前提下,使每层拥有相对独立的职责。

七、OSI七层网络模型
7.1 什么是OSI?
OSI 全称:
Open Systems Interconnection
中文称为:
开放系统互连。
OSI 七层模型是一种用于理解网络通信的分层参考模型。
它将网络通信划分为七个层次。
从高到低依次为:
7. 应用层
6. 表示层
5. 会话层
4. 传输层
3. 网络层
2. 数据链路层
1. 物理层
7.2 为什么有七层?
因为网络通信包含不同类型的问题。
例如:
应用程序怎样交换信息?
数据格式怎样表示?
通信会话怎样管理?
数据怎样进行端到端传输?
跨网络怎样确定路径?
相邻设备怎样交换数据?
比特怎样通过介质传递?
这些问题并不完全相同。
因此可以由不同层分别负责。
八、OSI七层分别解决什么问题?
8.1 第一层:物理层
物理层(Physical Layer)负责通过通信介质传递比特信息。
例如:
电信号
光信号
无线信号
它关注:
信号怎样表示?
使用什么传输介质?
怎样传递基本比特?
在基础模型中,集线器通常作为物理层设备的代表。
8.2 第二层:数据链路层
数据链路层(Data Link Layer)主要负责相邻网络节点之间的数据帧传输。
例如:
以太网帧
就是后面需要学习的概念。
典型的数据链路层设备是:
交换机 Switch
但现代交换机也可能具备更高层的功能。
8.3 第三层:网络层
网络层(Network Layer)主要解决:
网络地址管理
跨网络转发
路径选择
例如:
IP协议
就是网络层的重要协议。
典型的网络层设备是:
路由器 Router
8.4 第四层:传输层
传输层(Transport Layer)负责为主机上的通信端点提供传输服务。
例如:
TCP
UDP
都属于传输层协议。
两者提供的传输特性有所不同。
8.5 第五层:会话层
会话层(Session Layer)主要用于描述通信会话的建立、管理和结束等职责。
例如:
通信会话的组织与控制
可以归入这一抽象层的讨论范围。
8.6 第六层:表示层
表示层(Presentation Layer)主要处理信息的表示方式。
例如:
数据格式转换
数据编码表示
它强调通信双方对数据表示形式的理解。
8.7 第七层:应用层
应用层(Application Layer)面向应用程序之间的通信需求。
例如:
电子邮件
文件传输
远程访问
可以使用相应的应用层协议完成。
常见协议包括:
SMTP
FTP
Telnet
8.8 OSI七层总结
| 层次 | 名称 | 核心职责 |
|---|---|---|
| 7 | 应用层 | 应用程序之间的通信 |
| 6 | 表示层 | 数据表示及格式相关处理 |
| 5 | 会话层 | 通信会话管理 |
| 4 | 传输层 | 端到端传输服务 |
| 3 | 网络层 | 网络地址、路由与转发 |
| 2 | 数据链路层 | 相邻节点间的数据帧传输 |
| 1 | 物理层 | 比特信号传输 |

九、OSI七层模型的意义与局限
9.1 OSI模型的意义
OSI 的重要价值,在于它将复杂的通信过程抽象为多个层次。
例如:
应用层不需要直接控制网线上的电信号
因为中间已经有其他协议层负责相关问题。
同时,不同层可以通过接口提供服务。
这种结构对于理解网络通信非常有帮助。
9.2 为什么实际网络学习经常使用TCP/IP模型?
OSI 七层模型在理论上比较完整。
但是互联网实际采用的协议组织方式并不是严格按照 OSI 七层一一落地。
例如,实际的互联网协议体系中,并不一定存在一个与 OSI 表示层、会话层严格对应的独立实现层。
因此,在实际网络编程中,更常使用:
TCP/IP分层模型。
它与互联网协议族的实际组织方式更加接近。
十、TCP/IP协议族
10.1 TCP/IP不是只有两个协议
看到:
TCP/IP
很容易认为:
TCP/IP = TCP + IP
但这里的 TCP/IP 通常用于称呼一组相互配合的网络协议。
也就是:
TCP/IP协议族。
其中包含多种协议。
例如:
TCP
UDP
IP
ICMP
ARP
HTTP
FTP
这些协议分别负责不同的网络通信问题。
10.2 为什么叫协议族?
因为不同协议之间存在分工与协作关系。
例如:
应用程序需要交换消息
|
v
使用传输层协议
|
v
使用网络层协议
|
v
使用底层网络传输机制
因此,网络通信不是由一个协议单独完成的,而是多个协议共同完成。
十一、TCP/IP五层模型
从方便学习和工程理解的角度,可以将 TCP/IP 网络通信分成五层。
从上到下:
应用层
|
v
传输层
|
v
网络层
|
v
数据链路层
|
v
物理层
下面依次认识。
11.1 物理层
物理层负责底层信号传输。
例如:
双绞线
光纤
无线电磁波
物理层关注:
信号如何传播
传输速率
传输距离
抗干扰能力
等因素。
这里主要从软件编程角度学习网络,因此暂时不深入物理信号处理。
11.2 数据链路层
数据链路层负责相邻设备之间的数据帧传输与识别。
典型技术是:
以太网 Ethernet
还有:
无线局域网
等。
以后学习 MAC 地址时,会进一步认识数据链路层怎样标识相邻通信节点。
11.3 网络层
网络层负责:
地址管理
路由选择
跨网络转发
典型协议:
IP
可以通过 IP 地址等信息,帮助数据跨越不同网络到达目标。
11.4 传输层
传输层位于应用层与网络层之间。
典型协议包括:
TCP
UDP
TCP 可以提供面向连接的可靠字节流传输服务。
UDP 则提供无连接的数据报传输服务,不自行保证消息可靠到达。
这里暂时只了解两种协议的基本区别。
11.5 应用层
应用层面向应用程序的通信需求。
例如:
HTTP
FTP
SMTP
Telnet
不同应用层协议规定不同类型消息的格式和处理规则。
例如文件传输与电子邮件的业务不同,它们使用的应用层协议也可以不同。
11.6 五层模型汇总
| 层次 | 主要职责 | 典型协议或技术 |
|---|---|---|
| 应用层 | 应用程序通信 | HTTP、FTP、SMTP |
| 传输层 | 传输服务 | TCP、UDP |
| 网络层 | 地址管理与路由转发 | IP、ICMP |
| 数据链路层 | 数据帧传输 | Ethernet、Wi-Fi链路机制 |
| 物理层 | 比特传输 | 双绞线、光纤、无线信号 |
十二、TCP/IP四层模型与五层模型有什么区别?
在很多网络编程资料中,还会看到四层模型:
应用层
传输层
网络层
网络接口层
可以理解为:
四层模型通常把五层模型中的物理层与数据链路层合并为网络接口层。
因此:
TCP/IP五层教学模型
和:
TCP/IP四层模型
并不是两套完全无关的通信体系。
它们主要是抽象层次有所不同。
12.1 OSI、TCP/IP五层与四层的对应关系
| OSI七层 | TCP/IP五层 | TCP/IP四层 |
|---|---|---|
| 应用层 | 应用层 | 应用层 |
| 表示层 | 应用层 | 应用层 |
| 会话层 | 应用层 | 应用层 |
| 传输层 | 传输层 | 传输层 |
| 网络层 | 网络层 | 网络层 |
| 数据链路层 | 数据链路层 | 网络接口层 |
| 物理层 | 物理层 | 网络接口层 |
这是方便理解的抽象对应关系,并不是说所有实际协议都能严格划分到唯一的一层。
12.2 为什么学习网络时常用五层模型?
因为把:
物理层
和:
数据链路层
区分开,更容易分别理解:
信号怎样传输
与:
数据帧怎样组织和交换
所以初学网络时,五层模型通常更加直观。

十三、不同网络设备主要工作在哪一层?
协议分层以后,我们可以重新认识交换机与路由器。
13.1 普通计算机
普通计算机能够运行应用程序,并使用完整的网络通信功能。
例如:
浏览器
|
v
应用层
|
v
传输层
|
v
网络层
|
v
数据链路层
|
v
物理层
从软件实现角度看:
应用程序实现应用层功能
操作系统网络协议栈实现多种网络协议功能
网卡及其驱动负责相应链路与硬件处理
13.2 路由器
路由器的典型任务是:
在不同网络之间转发数据。
因此,路由器通常需要处理网络层地址及路由信息。
概念上:
网络层
数据链路层
物理层
与其转发功能密切相关。
13.3 交换机
普通二层交换机主要根据数据链路层信息转发数据帧。
因此:
数据链路层
物理层
是理解它的主要入口。
13.4 集线器
传统集线器主要用于物理层信号的转发与连接。
它通常不理解复杂的网络层转发规则。
13.5 这种分层是不是绝对的?
不是。
现代网络设备可能同时具有多层功能。
例如:
三层交换机
可以具有网络层转发能力。
部分路由器还可能具备防火墙、地址转换等额外功能。
因此,设备的分层归类主要是帮助理解其典型功能,不代表实际设备只能实现某一层。
十四、再次理解:为什么需要TCP/IP协议?
前面已经介绍了协议、协议分层和 TCP/IP 模型。
现在从另一个角度继续思考。
14.1 单机内部有没有协议?
有。
例如计算机内部的不同硬件之间也需要遵守通信规范。
可以接触到:
SATA
SCSI
等接口与协议技术。
它们服务于设备连接和数据交换等问题。
这说明:
协议并不是计算机网络出现以后才有的概念。
只要存在不同组件之间的通信,就可能需要共同约定。
14.2 网络通信带来了什么变化?
最直观的变化是:
通信双方可能相距很远。
例如:
计算机A在北京
计算机B在上海
它们不能依靠单机内部的硬件通信方式直接完成全部数据交换。
中间可能经过:
不同链路
多个路由器
不同类型的网络设备
因此通信环境变得更加复杂。
14.3 新的通信环境需要解决新的问题
例如:
如何标识目标主机?
如何跨越多个网络?
如何选择转发路径?
如何让不同网络技术互相配合?
如何把最终收到的数据交给应用程序?
这些问题都需要相应规则。
因此可以从一个朴素角度理解:
TCP/IP协议族是为了解决互联网络通信中一系列不同问题而形成的协议体系。
14.4 为什么TCP/IP能够分层?
因为需要解决的问题本身就存在不同层次。
例如:
如何表达应用消息
与:
如何选择网络路径
明显不是同一个问题。
又例如:
如何传递物理信号
与:
如何向应用程序提供传输服务
也属于不同职责。
因此:
协议之所以能够分层,是因为网络通信问题本身就可以进行职责划分。
十五、TCP/IP协议与操作系统有什么关系?
15.1 网络协议最终需要软件实现
协议首先规定通信双方应该遵守的规则。
但计算机想要真正使用协议,就必须通过软件、固件或硬件实现相关功能。
例如:
应用程序
|
v
操作系统网络接口
|
v
内核网络协议处理
|
v
网卡驱动与网络设备
这是一种简化的实现模型。
15.2 网络通信为什么离不开操作系统?
因为应用程序通常不能直接任意控制网卡硬件。
应用程序需要通过操作系统提供的网络接口进行通信。
而操作系统负责管理相应资源,并完成网络协议处理。
所以可以先形成以下认识:
应用程序提出通信需求,操作系统网络协议栈与网络设备共同完成实际传输。
15.3 同一层之间为什么也存在协议?
例如:
主机A应用层
与:
主机B应用层
需要按照相同的应用协议理解消息。
类似地:
主机A传输层
和:
主机B传输层
也要按照对应的传输协议解释相关数据。
因此网络分层中,经常使用:
对等层通信。
即相互对应的协议层遵守相同的协议规范。
但实际的数据传递并不是跳过中间层直接完成的。
发送数据时仍然需要经过本机的下层协议。
接收端则由下层逐步向上交付数据。
这个过程会在第二篇展开。

十六、从C/C++程序员角度理解协议
前面已经建立一个抽象认识:
协议是一组共同遵守的通信约定
现在尝试从编程角度理解它。
16.1 假设需要传输三个整数
计算机A希望发送:
a = 10
b = 20
c = 30
那么计算机B收到数据以后,怎样知道:
哪一部分是a?
哪一部分是b?
哪一部分是c?
如果没有共同的数据组织方式,就无法可靠提取这些字段。
16.2 使用结构体描述数据格式
例如:
struct Protocol
{
int a;
int b;
int c;
};
计算机A:
Protocol data = {10, 20, 30};
如果计算机B同样知道这些字段的定义与顺序,就能够按约定解释收到的数据。
例如:
Protocol received;
然后根据字段含义得到:
received.a = 10
received.b = 20
received.c = 30
这就是一个非常朴素的协议设计思想:
通信双方对数据有哪些字段、字段按什么顺序组织,以及各字段代表什么,必须具有共同认识。
16.3 协议能理解成结构化的数据格式吗?
在学习初期,可以将协议理解为:
通信双方共同认可的数据格式和处理规则。
例如:
字段1:a
字段2:b
字段3:c
双方需要约定:
字段的含义
字段的类型
字段的顺序
但还需要特别注意:
相同的C结构体定义,不代表可以在任意两台主机之间直接发送结构体内存并保证兼容。
因为实际机器还可能存在:
字节序差异
结构体对齐和填充差异
字段类型大小差异
因此真正的网络协议需要进一步规定其在线路上传输时的格式。
这里主要用结构体帮助理解协议字段的组织思想,暂时不深入二进制编码细节。
16.4 为什么每一层都需要自己的协议?
假设:
应用层需要描述业务数据
传输层需要描述传输信息
网络层需要描述目标地址
链路层需要描述相邻节点之间的数据传递
那么,不同层所关注的字段也不同。
因此每层都可以定义自己的数据格式。
例如:
应用层协议格式
传输层协议格式
网络层协议格式
数据链路层协议格式
这样,每个层次都按照自己需要解决的问题组织协议。
16.5 为什么称为对等层能够相互识别?
例如:
主机A的应用层
发送符合某种应用协议的数据。
主机B的应用层
按照相同规范解释它。
类似地,其他协议层也按照对应协议处理数据。
这就是我们希望建立的认识:
每一层有自己的协议,对等层按照共同的协议解释对应层的数据。
十七、网络购物与快递单:再次理解协议
可以使用网购寄快递的过程建立类比。
假设在网上购买一件商品。
商家准备发货时,需要填写:
收件人
联系电话
收件地址
寄件人
物品信息
这些字段的顺序与含义不是由快递员随意猜测的。
而是由相关业务系统规定。
快递公司按照这些字段处理包裹。
因此,可以把快递单理解为一种结构化的业务信息格式。
例如:
收件地址:北京市某地
收件人:张三
联系电话:某号码
快递系统能够识别对应字段,并据此完成业务处理。
这与网络协议的数据字段组织方式具有相似之处。
但是需要注意:
快递单只是帮助理解协议的一种生活类比。
它并不能完整对应计算机网络中的每一项技术细节。

十八、本篇知识总结
现在把本文内容连起来:
计算机最初独立工作
|
v
需要交换数据
|
v
建立计算机网络
|
v
局域网与广域网
|
v
不同设备需要共同规则
|
v
网络协议
|
v
复杂协议需要分层
|
v
OSI七层模型
|
v
TCP/IP四层与五层模型
|
v
操作系统中的网络协议栈
|
v
共同的数据格式与对等层协议
可以得出几个关键结论。
第一,网络的出现源于设备之间的协作需求
计算机不仅需要独立处理数据,还需要与其他计算机交换数据。
第二,网络通信必须遵守协议
通信双方不仅需要能够收到信号,还需要按照相同规则解释数据。
第三,协议分层能够降低系统复杂度
不同层分别处理不同类型的问题,通过明确的接口协作。
第四,TCP/IP是一个协议族
它并不是只有TCP和IP两个协议,而是包含多个相互配合的网络协议。
第五,网络协议可以从结构化数据的角度理解
协议规定数据字段及相关处理规则,使通信双方能够按照共同规范解释信息。
十九、下一篇将解决什么问题?
到目前为止,我们已经知道:
网络通信需要协议
协议采用分层设计
通信双方的对应层具有共同的协议规则
但还没有真正解释:
一台主机的数据究竟怎样通过网络发送到另一台主机?
因此,下一篇将继续学习:
局域网通信
|
v
MAC地址
|
v
数据封装与解包
|
v
跨网络转发
|
v
IP地址
|
v
端口号
|
v
Socket
并进一步介绍网络字节序和 Linux Socket 编程的基本接口。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Face_FeaR/article/details/168851503




