admin 管理员组文章数量: 1184232
目录
一、网络
1. 网络的定义
2. 网络的构成
二、网络地址体系详解
1. IP 地址
2. 子网掩码
3. 网关(Gateway)
4. DNS(域名系统)
三、网络分层模型
1. OSI 七层模型(开放系统互联模型)
2. TCP/IP 模型(实际应用模型)
四、传输层核心协议(TCP 与 UDP)
1. TCP(传输控制协议)
2. UDP(用户数据报协议)
3. TCP 与 UDP 对比表
五、Socket 网络编程(Linux)
1. Socket 概念
2. 相关函数
(1)创建 Socket:socket()
(2)绑定地址:bind()(服务器端)
(3)监听连接:listen()(服务器端)
(4)接受连接:accept()(服务器端)
(5)发起连接:connect()(客户端)
3. 辅助函数(地址转换)
(1)字节序转换(网络字节序为大端)
(2)IP 地址转换
4. 端口号
六、TCP C/S 通信模型完整流程
1. 服务器端流程(被动方)
2. 客户端流程(主动方)
3. 流程对比总结
七、网络通信模式
1. C/S 模式(Client/Server,客户端 / 服务器模式)
2. B/S 模式(Browser/Server,浏览器 / 服务器模式)
3. P2P 模式(Peer-to-Peer,点对点模式)
4. 三种模式对比表
一、网络
1. 网络的定义
网络的核心是实现不同主机的进程间通信
2. 网络的构成
- 物理通路:
- 无线:4G/5G 移动通信、卫星通信等
- 有线:光纤、双绞线(超 5 类 / 6 类网线)等
- 逻辑通路:通过软件层面的协议(如 TCP/IP)建立的虚拟连接(如 QQ 软件间的逻辑链接)
二、网络地址体系详解
1. IP 地址
- 作用:唯一标识网络中的一台主机(类似身份证号码)
- 结构:
IP地址 = 网络号 + 主机号(类比 “区号 + 电话号码”) - 表示形式:
- 本质是 32 位二进制数(IPv4)
- 采用点分十进制表示(将 32 位分为 4 组 8 位二进制,每组转换为 0~255 的十进制,用点分隔)
- 示例:
192.168.0.150、183.2.172.17(百度服务器 IP)
- 查看方式:
- Windows:
ipconfig命令(无线局域网适配器 WLAN 的 IPv4 地址) - Linux:
ifconfig或ip addr命令(inet 字段)
- Windows:
2. 子网掩码
- 作用:区分 IP 地址中的 “网络号” 和 “主机号”,判断两台主机是否在同一网段
- 计算规则:IP 地址与子网掩码进行按位与运算,结果为网络号
- 示例:
IP 地址 子网掩码 运算过程(二进制) 网络号 192.168.0.150 255.255.255.0 11000000.10101000.00000000.10010110
& 11111111.11111111.11111111.00000000
= 11000000.10101000.00000000.00000000192.168.0.0 183.2.172.17 255.255.255.0 10110111.00000010.10101100.00010001
& 11111111.11111111.11111111.00000000
= 10110111.00000010.10101100.00000000183.2.172.0
3. 网关(Gateway)
- 作用:连接不同网络的 “出入口” 设备。当主机访问非本地网段的目标主机时,数据会先发送到网关,由网关转发
- 示例:家庭网络中,路由器通常作为默认网关(如
192.168.0.1)
4. DNS(域名系统)
- 作用:将易记的域名(如
www.baidu)解析为对应的 IP 地址(如183.2.172.17),实现 “域名→IP” 的映射 - 解析流程:用户输入域名→DNS 服务器查询→返回对应 IP→主机通过 IP 访问目标服务器
三、网络分层模型
1. OSI 七层模型(开放系统互联模型)
OSI 模型是网络通信的理论参考模型,将通信过程分为 7 层,每层负责特定功能:
| 层号 | 名称 | 核心功能 | 传输数据单位 | 关键技术 / 协议 / 设备 | 补充说明 |
|---|---|---|---|---|---|
| 7 | 应用层 | 为用户应用提供网络服务(如文件传输、网页访问) | 数据(Data) | HTTP、FTP、QQ、浏览器 | 最贴近用户,直接与应用程序交互 |
| 6 | 表示层 | 数据格式化(加密、压缩)、格式转换(如 ASCII 与 EBCDIC 编码转换) | 数据(Data) | GZIP 压缩、SSL 加密 | 确保接收方能正确解析发送方的数据 |
| 5 | 会话层 | 管理通信会话(建立 / 断开连接、维持会话状态,如长连接keep-alive) | 数据(Data) | RPC(远程过程调用) | 类似打电话时的 “通话状态管理” |
| 4 | 传输层 | 提供端到端的传输控制(可靠性、流量控制) | 段(Segment,TCP) 数据报(Datagram,UDP) | TCP、UDP、端口号 | 区分同一主机上的不同进程(通过端口号) |
| 3 | 网络层 | 实现不同网络间的路径选择与数据转发 | 数据包(Packet) | IP、路由器、NAT | 核心是 “找到目标主机的位置” |
| 2 | 数据链路层 | 将数据封装为帧,进行差错控制(校验),管理物理介质访问 | 帧(Frame) | 交换机、以太网协议 | 处理数据的 “格式包装” 和 “传输校验”,如串口通信的 115200 波特率、8N1 格式 |
| 1 | 物理层 | 定义物理传输介质的电气 / 物理特性(如电平信号、接口类型),传输比特流 | 比特(Bit) | 网线、光纤、网卡 | 负责 “0/1” 电信号的传输,如 100Mbps 表示每秒传输 100 兆比特 |
2. TCP/IP 模型(实际应用模型)
TCP/IP模型不同层的存储:
TCP/IP 模型是互联网的实际通信标准,简化了 OSI 模型:
- 4 层模型:应用层 → 传输层 → 网络层 → 网络接口层(对应 OSI 的物理层 + 数据链路层)
- 5 层模型:应用层 → 传输层 → 网络层 → 数据链路层 → 物理层(更易理解)
- 核心协议:TCP(传输控制协议)和 IP(网际协议),因此得名 TCP/IP 协议簇
- OSI模型、TCP/IP模型的区别:
四、传输层核心协议(TCP 与 UDP)
1. TCP(传输控制协议)
- 特点:
- 面向连接:通信前必须建立连接(三次握手)
- 可靠传输:保证数据无丢失、无失序、无差错、无重复
- 字节流:数据以字节为单位连续传输(类似水流)
- 双工通信:双方可同时收发数据
- 三次握手(建立连接):
- 客户端 → 服务器:发送连接请求(SYN 报文,“我要通话”)
- 服务器 → 客户端:确认请求并返回连接许可(SYN+ACK 报文,“我准备好了,你可以开始”)
- 客户端 → 服务器:确认接收(ACK 报文,“我知道了,开始通信”)
- 应用场景:对可靠性要求高的场景,如文件下载、登录认证(QQ / 微信登录)、邮件传输。
2. UDP(用户数据报协议)
- 特点:
- 无连接:通信前无需建立连接,直接发送数据
- 不可靠传输:不保证数据到达,可能丢失、失序
- 数据报:数据以固定最大长度的 “报文” 形式传输
- 效率高:协议简单,开销小,实时性好
- 应用场景:对实时性要求高的场景,如 QQ 聊天消息、语音 / 视频通话、游戏数据、广播 / 组播(如电子教室屏幕广播)
3. TCP 与 UDP 对比表
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 高(重传机制、校验等) | 低(无重传,可能丢失) |
| 传输单位 | 字节流 | 数据报(固定最大长度) |
| 速度 | 较慢(开销大) | 较快(开销小) |
| 适用数据量 | 大量数据(如文件) | 小数据(如即时消息) |
| 典型应用 | 网页、文件下载、邮件 | 聊天、视频通话、游戏 |
五、Socket 网络编程(Linux)
1. Socket 概念
- 定义:Socket(套接字)是 Linux 系统提供的网络通信接口,本质是一种 “特殊文件”,通过文件描述符操作,实现用户空间与内核网络功能的交互。
- 核心作用:封装网络协议细节,提供简单的编程接口,用于创建网络通信端点
2. 相关函数
(1)创建 Socket:socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- 功能:创建一个网络通信端点,返回文件描述符(fd)
- 参数:
domain:协议族(通信范围)AF_INET:IPv4 协议(最常用)AF_INET6:IPv6 协议AF_UNIX:本地套接字(同一主机进程通信)
type:套接字类型SOCK_STREAM:流式套接字(对应 TCP 协议,可靠连接)SOCK_DGRAM:数据报套接字(对应 UDP 协议,无连接)
protocol:具体协议,通常设为 0(由系统根据type自动选择)
- 返回值:成功返回非负文件描述符(socket fd),失败返回 - 1(需检查
errno)
(2)绑定地址:bind()(服务器端)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 功能:将 socket 与特定 IP 地址和端口号绑定(服务器必须绑定,客户端可选)
- 参数:
sockfd:socket()返回的文件描述符addr:指向地址结构的指针(需根据协议族选择对应结构)- IPv4 使用
sockaddr_in结构:struct sockaddr_in { sa_family_t sin_family; // 地址族(AF_INET) in_port_t sin_port; // 端口号(网络字节序) struct in_addr sin_addr; // IP地址(网络字节序) }; struct in_addr { in_addr_t s_addr; // 32位IP地址(网络字节序) };
- IPv4 使用
addrlen:地址结构的长度(如sizeof(struct sockaddr_in))
- 返回值:成功返回 0,失败返回 - 1
(3)监听连接:listen()(服务器端)
int listen(int sockfd, int backlog);
- 功能:将 socket 设置为监听状态,等待客户端连接请求
- 参数:
sockfd:绑定后的 socket fdbacklog:等待连接队列的最大长度(超过则拒绝新连接,防止 DoS 攻击)
- 返回值:成功返回 0,失败返回 - 1
(4)接受连接:accept()(服务器端)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 功能:从监听队列中提取一个客户端连接请求,完成 TCP 三次握手,返回新的通信 socket
- 参数:
sockfd:监听状态的 socket fdaddr:用于存储客户端地址信息的结构(输出参数)addrlen:地址结构长度的指针(值 - 结果参数,需初始化)
- 返回值:成功返回新的通信 socket fd(用于后续数据收发),失败返回 - 1
(5)发起连接:connect()(客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 功能:客户端向服务器发起连接请求(触发 TCP 三次握手)
- 参数:
sockfd:客户端 socket fdaddr:服务器的地址结构(含 IP 和端口)addrlen:地址结构长度
- 返回值:成功返回 0(连接建立),失败返回 - 1
3. 辅助函数(地址转换)
(1)字节序转换(网络字节序为大端)
uint32_t htonl(uint32_t hostlong):主机 32 位字节序→网络字节序(用于 IP 地址)uint16_t htons(uint16_t hostshort):主机 16 位字节序→网络字节序(用于端口号)uint32_t ntohl(uint32_t netlong):网络 32 位字节序→主机字节序uint16_t ntohs(uint16_t netshort):网络 16 位字节序→主机字节序
(2)IP 地址转换
in_addr_t inet_addr(const char *cp):将点分十进制 IP 字符串(如"192.168.0.1")转换为网络字节序的 32 位整数char *inet_ntoa(struct in_addr in):将网络字节序的 IP 地址转换为点分十进制字符串
4. 端口号
- 作用:标识同一主机上的不同网络进程(IP 标识主机,端口标识进程)
- 范围:
- 0~1023:知名端口(系统保留,如 HTTP 用 80,FTP 用 21)
- 1024~49151:注册端口(用于特定应用)
- 49152~65535:动态端口(临时分配)
- 注意:端口号需转换为网络字节序(用
htons())
六、TCP C/S 通信模型完整流程
TCP 的 C/S(客户端 / 服务器)模型是网络通信中最经典的模式,其核心是 “客户端主动发起连接,服务器被动接受连接”,整个流程严格遵循 TCP 的面向连接特性
- 基于TCP客户——服务器程序的套接字函数
1. 服务器端流程(被动方)
服务器的核心任务是 “等待并处理客户端的连接请求”,具体步骤如下:
-
创建 socket(初始化通信端点)
调用socket()函数创建一个套接字,相当于 “买了一部电话”,用于后续的网络通信int listen_fd = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字 if (listen_fd == -1) { perror("socket failed"); exit(1); } -
绑定地址(绑定 IP 和端口)
调用bind()函数将服务器的 IP 地址和端口号与套接字绑定,相当于 “给电话插卡(绑定手机号)”,让客户端能找到自己
示例代码片段:struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; // IPv4协议 server_addr.sin_port = htons(8080); // 端口号(转换为网络字节序) server_addr.sin_addr.s_addr = inet_addr("0.0.0.0");// 绑定所有本地IP(允许任意网卡接入) if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind failed"); close(listen_fd); exit(1); }注:
0.0.0.0表示绑定本地所有可用 IP,方便多网卡场景下的客户端连接。 -
设置监听(进入待机状态)
调用listen()函数将套接字设为监听状态,相当于 “电话开机并处于待机模式,等待来电”,同时设置等待连接队列的最大长度if (listen(listen_fd, 5) == -1) { // 等待队列长度为5(最多同时处理5个未完成连接) perror("listen failed"); close(listen_fd); exit(1); } -
接受连接(接听来电)
调用accept()函数从监听队列中提取一个客户端的连接请求,完成 TCP 三次握手,相当于 “接听电话”,并返回一个新的套接字(专门用于与该客户端通信)struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_addr_len); if (conn_fd == -1) { perror("accept failed"); close(listen_fd); exit(1); } // 打印客户端信息 printf("客户端已连接:IP=%s,端口=%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));注:
listen_fd始终用于监听新连接,conn_fd用于与当前客户端的具体通信。 -
数据通信(通话过程)
通过read()/write()函数(或recv()/send())与客户端收发数据,相当于 “通话中交流信息”。
(接收客户端消息并回复)char buf[1024]; ssize_t n = read(conn_fd, buf, sizeof(buf)-1); // 接收客户端数据 if (n > 0) { buf[n] = '\0'; printf("收到客户端消息:%s\n", buf); write(conn_fd, "消息已收到", 9); // 回复客户端 } -
关闭连接(挂断电话)
通信结束后,调用close()函数关闭套接字,释放资源,相当于 “挂断电话”。
示例代码片段:close(conn_fd); // 关闭与当前客户端的通信套接字 close(listen_fd); // 服务器退出时,关闭监听套接字
2. 客户端流程(主动方)
客户端的核心任务是 “主动发起连接并与服务器通信”,具体步骤如下:
-
创建 socket(初始化通信端点)
同样调用socket()函数创建套接字,相当于 “买一部电话”。int client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd == -1) { perror("socket failed"); exit(1); } -
发起连接(拨打服务器电话)
调用connect()函数向服务器发送连接请求,触发 TCP 三次握手,相当于 “拨打服务器的电话号码”。struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); // 服务器端口(需与服务器绑定的一致) server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");// 服务器IP(本地测试用127.0.0.1) if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("connect failed"); close(client_fd); exit(1); }注:客户端一般不需要调用
bind()绑定本地地址,系统会自动分配临时 IP 和端口。 -
数据通信(通话过程)
通过read()/write()与服务器收发数据,流程与服务器端类似。
(向服务器发送消息并接收回复):write(client_fd, "Hello Server", 12); // 发送消息给服务器 char buf[1024]; ssize_t n = read(client_fd, buf, sizeof(buf)-1); // 接收服务器回复 if (n > 0) { buf[n] = '\0'; printf("收到服务器回复:%s\n", buf); } -
关闭连接(挂断电话)
通信结束后,调用close()关闭套接字。close(client_fd);
3. 流程对比总结
| 步骤 | 服务器端(被动方) | 客户端(主动方) | 核心差异 |
|---|---|---|---|
| 初始化 | socket()创建监听套接字 | socket()创建客户端套接字 | 服务器需后续绑定和监听 |
| 地址关联 | bind()绑定 IP 和端口 | 无需绑定(系统自动分配) | 服务器必须固定地址,客户端灵活 |
| 连接处理 | listen()监听 + accept()接受 | connect()发起连接 | 服务器被动等待,客户端主动发起 |
| 通信套接字 | accept()返回的新套接字(conn_fd) | 创建时的套接字(client_fd) | 服务器用新套接字单独通信 |
| 资源释放 | 关闭conn_fd和listen_fd | 关闭client_fd | 服务器需释放监听和通信资源 |
七、网络通信模式
网络通信模式是指不同设备 / 进程之间数据交互的架构设计,常见模式包括 C/S、B/S 和 P2P,各自适用于不同场景。
1. C/S 模式(Client/Server,客户端 / 服务器模式)
- 定义:由客户端(用户侧软件)和服务器(中心节点)组成,客户端主动向服务器发送请求,服务器集中处理并返回结果
- 结构示例:QQ、微信、数据库客户端(如 MySQL Workbench)
- 工作流程:
客户端安装专用软件 → 向服务器发起连接 → 发送请求(如 “获取好友列表”) → 服务器处理请求 → 返回数据 → 客户端展示结果。 - 优点:
- 服务器集中管理数据,安全性高(如用户信息加密存储在服务器);
- 客户端功能定制化强(如 QQ 的离线消息、文件传输等专用功能)
- 缺点:
- 客户端需单独安装和更新(如 QQ 需下载安装包);
- 服务器压力大(所有请求集中处理,高并发时需扩容)
2. B/S 模式(Browser/Server,浏览器 / 服务器模式)
- 定义:基于浏览器和 Web 服务器的架构,客户端无需安装专用软件,通过浏览器访问服务器提供的网页服务
- 结构示例:百度搜索、在线商城(如淘宝)、企业官网
- 工作流程:
用户打开浏览器 → 输入网址(如www.taobao) → 浏览器向 Web 服务器发送 HTTP 请求 → 服务器返回网页数据 → 浏览器解析并展示页面 - 优点:
- 客户端无需安装(通过浏览器即可访问),跨平台性好(Windows、Mac、手机浏览器通用);
- 维护成本低(只需更新服务器端代码,客户端自动同步)
- 缺点:
- 功能受浏览器限制(复杂交互体验不如专用客户端);
- 依赖网络稳定性(网页加载速度受网速影响)
3. P2P 模式(Peer-to-Peer,点对点模式)
- 定义:节点(Peer)之间直接通信,无需中心服务器转发,每个节点既是客户端也是服务器
- 结构示例:早期的文件共享软件(如 BitTorrent)、某些即时通讯工具(如部分局域网聊天软件)
- 工作流程:
节点 A 加入 P2P 网络 → 发现节点 B 在线 → 直接向节点 B 发送请求(如 “下载某文件片段”) → 节点 B 直接返回数据 - 优点:
- 去中心化,服务器压力小(无需中心节点转发数据);
- 扩展性好(节点越多,总带宽越高,如下载速度可能随节点增加而提升)
- 缺点:
- 节点管理复杂(需维护节点列表,如 “谁在线”);
- 安全性较低(节点直接通信,易受恶意节点攻击)
4. 三种模式对比表
| 模式 | 核心组件 | 客户端要求 | 服务器角色 | 典型应用 | 适用场景 |
|---|---|---|---|---|---|
| C/S | 专用客户端 + 服务器 | 需安装专用软件 | 集中处理请求、存储数据 | QQ、微信 | 功能复杂、安全性要求高的场景 |
| B/S | 浏览器 + Web 服务器 | 仅需浏览器 | 提供网页数据、处理 HTTP 请求 | 淘宝、百度 | 跨平台访问、轻量交互场景 |
| P2P | 对等节点 | 节点既是客户端也是服务器 | 无中心服务器,节点间直接通信 | BitTorrent、局域网聊天 | 文件共享、分布式协作场景 |
通过理解这三种模式的差异,可根据实际需求选择合适的架构:
企业内部管理系统(需高安全性)适合 C/S 模式;
公开信息查询平台(需便捷访问)适合 B/S 模式;
大文件分发(需高扩展性)适合 P2P 模式
版权声明:本文标题:Linux:网络 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1765177950a3355134.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论