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.150183.2.172.17(百度服务器 IP)
  • 查看方式
    • Windows:ipconfig命令(无线局域网适配器 WLAN 的 IPv4 地址)
    • Linux:ifconfigip addr命令(inet 字段)

2. 子网掩码

  • 作用:区分 IP 地址中的 “网络号” 和 “主机号”,判断两台主机是否在同一网段
  • 计算规则IP 地址与子网掩码进行按位与运算,结果为网络号
  • 示例
    IP 地址子网掩码运算过程(二进制)网络号
    192.168.0.150255.255.255.011000000.10101000.00000000.10010110
    & 11111111.11111111.11111111.00000000
    = 11000000.10101000.00000000.00000000
    192.168.0.0
    183.2.172.17255.255.255.010110111.00000010.10101100.00010001
    & 11111111.11111111.11111111.00000000
    = 10110111.00000010.10101100.00000000
    183.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(传输控制协议)

  • 特点
    • 面向连接:通信前必须建立连接(三次握手)
    • 可靠传输:保证数据无丢失、无失序、无差错、无重复
    • 字节流:数据以字节为单位连续传输(类似水流)
    • 双工通信:双方可同时收发数据
  • 三次握手(建立连接)
    1. 客户端 → 服务器:发送连接请求(SYN 报文,“我要通话”)
    2. 服务器 → 客户端:确认请求并返回连接许可(SYN+ACK 报文,“我准备好了,你可以开始”)
    3. 客户端 → 服务器:确认接收(ACK 报文,“我知道了,开始通信”)
  • 应用场景:对可靠性要求高的场景,如文件下载、登录认证(QQ / 微信登录)、邮件传输。

2. UDP(用户数据报协议)

  • 特点
    • 无连接:通信前无需建立连接,直接发送数据
    • 不可靠传输:不保证数据到达,可能丢失、失序
    • 数据报:数据以固定最大长度的 “报文” 形式传输
    • 效率高:协议简单,开销小,实时性好
  • 应用场景:对实时性要求高的场景,如 QQ 聊天消息、语音 / 视频通话、游戏数据、广播 / 组播(如电子教室屏幕广播)

3. TCP 与 UDP 对比表

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性高(重传机制、校验等)低(无重传,可能丢失)
传输单位字节流数据报(固定最大长度)
速度较慢(开销大)较快(开销小)
适用数据量大量数据(如文件)小数据(如即时消息)
典型应用网页、文件下载、邮件聊天、视频通话、游戏

五、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 地址和端口号绑定(服务器必须绑定,客户端可选)
  • 参数
    • sockfdsocket()返回的文件描述符
    • 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地址(网络字节序)
        };
        
    • addrlen:地址结构的长度(如sizeof(struct sockaddr_in)
  • 返回值:成功返回 0,失败返回 - 1
(3)监听连接:listen()(服务器端)
int listen(int sockfd, int backlog);
  • 功能:将 socket 设置为监听状态,等待客户端连接请求
  • 参数
    • sockfd:绑定后的 socket fd
    • backlog:等待连接队列的最大长度(超过则拒绝新连接,防止 DoS 攻击)
  • 返回值:成功返回 0,失败返回 - 1

(4)接受连接:accept()(服务器端)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 功能:从监听队列中提取一个客户端连接请求,完成 TCP 三次握手,返回新的通信 socket
  • 参数
    • sockfd:监听状态的 socket fd
    • addr:用于存储客户端地址信息的结构(输出参数)
    • addrlen:地址结构长度的指针(值 - 结果参数,需初始化)
  • 返回值:成功返回新的通信 socket fd(用于后续数据收发),失败返回 - 1
(5)发起连接:connect()(客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 功能:客户端向服务器发起连接请求(触发 TCP 三次握手)
  • 参数
    • sockfd:客户端 socket fd
    • addr:服务器的地址结构(含 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. 服务器端流程(被动方)

服务器的核心任务是 “等待并处理客户端的连接请求”,具体步骤如下:

  1. 创建 socket(初始化通信端点)
    调用socket()函数创建一个套接字,相当于 “买了一部电话”,用于后续的网络通信

    int listen_fd = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字
    if (listen_fd == -1) {
        perror("socket failed");
        exit(1);
    }
    
  2. 绑定地址(绑定 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,方便多网卡场景下的客户端连接。

  3. 设置监听(进入待机状态)
    调用listen()函数将套接字设为监听状态,相当于 “电话开机并处于待机模式,等待来电”,同时设置等待连接队列的最大长度

    if (listen(listen_fd, 5) == -1) { // 等待队列长度为5(最多同时处理5个未完成连接)
        perror("listen failed");
        close(listen_fd);
        exit(1);
    }
    
  4. 接受连接(接听来电)
    调用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用于与当前客户端的具体通信。

  5. 数据通信(通话过程)
    通过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); // 回复客户端
    }
    
  6. 关闭连接(挂断电话)
    通信结束后,调用close()函数关闭套接字,释放资源,相当于 “挂断电话”。
    示例代码片段:

    close(conn_fd);       // 关闭与当前客户端的通信套接字
    close(listen_fd);     // 服务器退出时,关闭监听套接字
    

2. 客户端流程(主动方)

客户端的核心任务是 “主动发起连接并与服务器通信”,具体步骤如下:

  1. 创建 socket(初始化通信端点)
    同样调用socket()函数创建套接字,相当于 “买一部电话”。

    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd == -1) {
        perror("socket failed");
        exit(1);
    }
    
  2. 发起连接(拨打服务器电话)
    调用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 和端口。

  3. 数据通信(通话过程)
    通过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);
    }
    
  4. 关闭连接(挂断电话)
    通信结束后,调用close()关闭套接字。

    close(client_fd);
    

3. 流程对比总结

步骤服务器端(被动方)客户端(主动方)核心差异
初始化socket()创建监听套接字socket()创建客户端套接字服务器需后续绑定和监听
地址关联bind()绑定 IP 和端口无需绑定(系统自动分配)服务器必须固定地址,客户端灵活
连接处理listen()监听 + accept()接受connect()发起连接服务器被动等待,客户端主动发起
通信套接字accept()返回的新套接字(conn_fd创建时的套接字(client_fd服务器用新套接字单独通信
资源释放关闭conn_fdlisten_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