博客封面

✨✨所属专栏:Linux✨✨

✨✨作者主页:嶔某✨✨

网络:基础概念

在计算机发展过程中,最开始每个计算机时相互独立的,后来人们需要用计算机合作处理任务,这就牵扯到了数据交换,所以最开始的网络就诞生了。一开始,网络都是局域网LAN,后来技术成熟,计算机设备增多,广域网WAN就来了。这里的局域网和广域网都是一个相对的概念。

计算机作为人的工具,人要协同工作,者注定了网络必然产生。一切都是最好的安排。

协议

协议就是通信双方约定好的通信方式

一开始,计算机都是在局域网中进行数据通信,各个局域网都有自己的通信标准(协议)。后来一些比较权威的组织,开始制定详尽的协议

国际标准化组织

IEEE(电气和电子工程师协会):这是一个由计算机和工程领域专家组成的庞大技术组织,在通信协议领域贡献突出。IEEE 制定了全世界电子、电气和计算机科学领域 30%左右的标准,包括 IEEE 802 系列标准,这些标准涵盖了从局域网(LAN)到广域网(WAN)等多种网络技术。

ISO(国际标准化组织)ISO 是由多个国家的标准化团体组成的国际组织,它在开放系统互连(OSI)模型方面的工作尤为著名。OSI 模型定义了网络通信的七层协议结构,尽管在实际应用中,TCP/IP 协议族更为普遍,但 OSI 模型仍然在学术和理论研究中占有重要地位。

ITU(国际电信联盟)ITU 是联合国下属的专门机构,负责制定电信领域的国际标准。ITU-T 制定的标准涵盖了电话和网络通信,与 ISO 合作确保了通信技术的全球兼容性和互操作性。

区域标准化组织

ETSI(欧洲电信标准学会):由欧洲共同体各国政府资助,是一个由电信行业的厂商与研究机构参加并从事研究开发到标准制定的组织。

ASTAP(亚洲与泛太平洋电信标准化协会):1998 年由日本与韩国发起成立的标准化组织,旨在加强亚洲与太平洋地区各国信息通信基础设施及其相互连接的标准化工作的协作。

公司:某些公司,如泰凌微,也自研各种标准的软件协议栈,包括低功耗蓝牙、zigbeethreadMatter 等,并可进行定制化改动,这是其核心竞争力之一。泰凌微还计划重点发展智能电子价签、智能遥控、智能家居等市场。

民间国际团体

IETF(互联网工程师任务组):这是一个负责开发和推广互联网协议(特别是构成 TCP/IP 协议族的协议)的志愿组织,通过 RFC 发布新的或者取代老的协议标准

官方机构

FCC(联邦通信委员会):美国对通信技术的管理的官方机构,主要职责是通过对无线电、电视和有线通信的管理来保护公众利益。也对包括标准化在内的通信产品技术特性进行审查和监督。

OSI七层网络协议模型

软件分层是为了更好的解耦,降低维护成本

网络协议分层

OSIOpen System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范; 把网络从逻辑上分为了 7 层. 每一层都有相关、相对应的物理设备,比如路由器,交换机

OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输

它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯

为了降低学习成本,我们将它简化,按照 TCP/IP 四层模型来讲解

计算机四层网络模型

在网络角度,OSI定制的七层模型非常完善,但是在实操过程中,会话层,表示层是不可能接入到OS中的,所以在工程实践中,在最终落地的是五层协议,数据链路层下面还有一个物理层

物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的 wifi 无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)工作在物理层。

数据链路层: 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。有以太网、令牌环网,无线 LAN 等标准. 交换机(Switch)工作在数据链路层。

网络层: 负责地址管理和路由选择。例如在 IP 协议中,通过 IP 地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。

传输层: 负责两台主机之间的数据传输。如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机。

应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层。

设备 实现的网络层次(OSI 模型) 核心功能举例
主机(内核) 传输层、网络层、数据链路层(软件) TCP 通信、IP 路由、Ethernet 帧处理
路由器 网络层、数据链路层、物理层 IP 转发、跨网络互联
交换机 数据链路层、物理层 MAC 地址转发、局域网内通信
集线器 物理层 电信号放大与广播

协议的本质

协议就是双方的一种规定,就像摩斯密码就是一种协议,通过规定某些行为来通过这些行为来传递信息。在语言层面,由于从传输层到网卡驱动层都是嵌入在操作系统中的。而操作系统又是C/C++写的,所以协议的本质就是通信双方都认识的结构化的数据类型。

协议是分层的,所以网络中的每层都有协议,同层之间,互相都有可以认识对方的协议。

网络传输基本流程

局域网传输流程

两台主机在同一个局域网内是能够直接通信的,每台主机在局域网中都有一个标识来保证主机的唯一性:mac地址(这货实际上也是全球唯一,但由于历史原因,mac地址是在ip地址后面发明的)

MAC地址

MAC地址用来识别数据链路层中相连的节点

长度位48位,及6个字节,一般用16进制数字加上冒号的形式来表示 08:00:27:03:fb:19

MAC地址在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)

以太网中,任何时刻,只允许一台主机向网络中发送数据,如果有多台同时发送,会发生数据干扰,称之为数据碰撞。所有发送数据的主机要进行碰撞检测和碰撞避免。在没有交换机的情况下,一个局域网就是一个碰撞域(所以现在你知道同一个局域网下设备多了网卡的原因了吗?)局域网通信中主机对收到的报文确认是否是发给自己的,是通过目标MAC地址来判定的

image-20250607225712147

image-20250607230143978

image-20250607230239317

image-20250607230718995

在网络通信过程中,数据不是直接发送给对方主机的,而是先要自顶向下将数据交付给下层协议,最后由底层发送,然后由对方主机的底层接收,再自底向上交付

image-20250607231159705

image-20250607231258168

要学习一种协议,就是学习这个协议是工作在那一层的,它是如何封包,如何解包,如何分用,还有它是如何将自己的有效载荷交付给上层协议的

跨网络传输流程

IP地址

IP协议有两个版本,IPV4IPV6,后者目前应用不多(中国在IPV6技术上是Top)所以我们先学前者

跨网段的主机数据传输,数据从一台计算机到另外一台计算机传输过程中要经过一个或多个路由器

image-20250607232137350

因为目标主机和本主机不在同一个子网(局域网),而路由器又有构建子网的能力,所以一个路由器一般都有两套网卡,两个IP地址,用于构建两个子网。所以当当前主机和目标主机不在同一个子网下时,数据要去到目标主机就要先去路由器,经过路由转发到目标主机的子网,再将数据交给目标主机。

image-20250607232545168

MAC地址和IP地址

既然有了IP地址,为什么还需要MAC地址?

1、对于网络中的一些设备,路由器或者是PC及而言,IP地址的设计是出于拓扑设计出来的,只要在不重复IP地址的情况下,它是可以随意更改的;而MAC地址是根据生产厂商烧录好的,它一般不能改动的,一般来说,当一台PC机的网卡坏了之后,更换了网卡之后MAC地址就会变了。

2、在前面的介绍里面,它们最明显的区别就是长度不同,IP地址的长度为32位,而MAC地址为48位。

3、它们的寻址协议层不同。IP地址应用于OSI模型的网络层,而MAC地址应用在OSI模型的数据链路层。 数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上(ARP根据目的IP地址,找到中间节点的MAC地址,通过中间节点传送,从而最终到达目的网络)。

4、分配依据不同。IP地址的分配是基于我们自身定义的网络拓扑,MAC地址的分配是基于制造商。一个是主观的,而另一种是可观的。

5、最重要的区别在于,IP地址划分时基于地理区域,换了不同地方,即便是同一台硬件设备,IP地址一定不一样,可以理解为和地理位置有关;而MAC地址不依赖于地理区域,换了不同地方,只要还是同一台硬件设备,MAC地址就不会变,它只和硬件设备有关。

Socket编程

数据交给主机还不是网络通信的最终目的,让进程拿到数据,才是最终目的,我们启动的上层应用,实际上都是进程,进程拿到了数据,也就相当于人拿到了数据。

因为一个主机中会有很多个进程,所以我们需要一个东西来标识进程在系统中的唯一性

image-20250610003245578

端口号

端口划分

有一个问题,为什么不在网络上直接用pid来标识进程的唯一性呢?

因为设计者不想让系统和网络强耦合,就像你已经有了能在社会上唯一标识的身份证,学校还是要给你分配一个学号

理解Socket

认识传输层协议

TCP:传输层协议,有连接,可靠传输,面向字节流

UDP:传输层协议,无连接,不可靠传输,面向数据报

网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?

CSDN有关整数和浮点数在内存中存储

为使网络程序具有可移植性,使同样的 C 代码在大端和小端计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

image-20250610005200767

Socket编程接口

1
2
3
4
5
6
7
8
9
10
// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);
// 开始监听 socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

sockaddr 结构

socket API 是一层抽象的网络编程接口,适用于各种底层网络协议,如 IPv4IPv6、以及UNIX Domain Socket然而,各种网络协议的地址格式并不相同

image-20250610005542238

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Linux 2.6.18 内核

typedef unsigned short sa_family_t;
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};

/* Structure describing an Internet (IP) socket address. */
#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
struct sockaddr_in {
sa_family_t sin_family; /* Address family */
unsigned short int sin_port; /* Port number */
struct in_addr sin_addr; /* Internet address */

/* Pad to size of `struct sockaddr'. */
unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};

// 虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时,
// 使用的数据结构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型,端口号,IP地址

/* Internet address. */
struct in_addr {
__u32 s_addr;
};
// in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数;