建站平台 做网站,山东省建设管理中心网站,茌平微网站建设,教育网站制作运营一、网络分层模型#xff1a;OSI 与 TCP/IP 的关系1. OSI 七层模型#xff08;理论基石#xff09;OSI#xff08;开放系统互连#xff09;模型是描述网络通信的通用框架#xff0c;将网络功能划分为 7 层#xff0c;每层各司其职#xff1a;层级核心功能应用层为用户提…一、网络分层模型OSI 与 TCP/IP 的关系1. OSI 七层模型理论基石OSI开放系统互连模型是描述网络通信的通用框架将网络功能划分为 7 层每层各司其职层级核心功能应用层为用户提供网络服务邮件、文件传输、网页访问等表示层统一数据表示形式编码、加密、格式转换会话层管理进程间会话建立、维护、终止通信连接传输层管理端到端数据传输提供可靠 / 不可靠传输服务网络层负责路由选择与网际互连IP 地址寻址、跨网络数据转发数据链路层相邻主机间数据传输MAC 地址寻址、数据帧封装、差错控制含 LLC/MAC 子层物理层把数据转为电信号传输定义机械、电气特性如双绞线、光纤、无线信道2. TCP/IP 协议栈实际应用OSI 是理论模型而 TCP/IP 是互联网的实际协议体系它将 OSI 七层合并为四层也有五层划分是我们实际开发中接触的核心TCP/IP 层级对应 OSI 层级核心协议应用层应用层 表示层 会话层HTTP网页、FTP/TFTP文件传输、DNS域名解析、SNMP网络管理、DHCP动态 IP 分配传输层传输层TCP可靠传输如文件传输、UDP无连接低延迟如音视频网络层网络层IP主机寻址、ICMPping 测试、RIP/OSPF路由协议、IGMP组播接口层数据链路层 物理层ARPIP 转 MAC、RARPMAC 转 IP二、网络编程核心基础概念1. IP 地址与端口IP 地址由「网络位 主机位」组成用于标识网络中的主机主流为 IPv432 位IPv6 为未来方向。端口号标识主机上的应用程序范围 1-655351-1023 为系统保留端口。IP 端口唯一标识网络中的一个应用程序如192.168.0.112:50000。2. 字节序主机字节序主流 CPUIntel/AMD/ARM为小端存储低字节存低地址。网络字节序统一为大端存储低字节存高地址网络设备通信必须使用网络字节序如htons/ntohs函数转换端口inet_addr转换 IP。3. 网络配置Linux永久配置 IP编辑/etc/network/interfaces修改后执行sudo /etc/init.d/networking restart生效。临时配置 IPifconfig ens33 192.168.0.13/24 up重启后失效。常用调试命令ifconfig查看本机网络配置IP、网卡信息。ping www.baidu.com测试网络连通性。netstat -anp查看本机所有网络连接进程、端口、协议。4. 套接字SocketSocket 是「打开网络设备后获得的文件描述符」是网络编程的入口 —— 通过 Socket我们可以像操作文件一样进行网络数据的收发。三、UDP 套接字编程核心实战UDP用户数据报协议是无连接、低延迟的传输层协议适合音视频、实时通信等场景核心特性数据报有边界发送 / 接收次数需对应无写阻塞发送过快易丢包读操作默认阻塞无连接、资源占用低、延迟低。1. UDP 编程核心流程服务端提供服务客户端使用服务socket()→ 创建套接字socket()→ 创建套接字bind()→ 绑定 IP 端口无需绑定系统自动分配端口recvfrom()→ 接收客户端数据sendto()→ 发送数据到服务端sendto()→ 可选回显数据recvfrom()→ 可选接收响应close()→ 关闭套接字close()→ 关闭套接字2. 核心函数详解1创建套接字socket ()c运行int socket(int domain, int type, int protocol);参数domain地址族AF_INET 互联网协议AF_UNIX 单机通信type套接字类型SOCK_DGRAMUDPSOCK_STREAMTCPprotocol协议0 自动适配返回值成功返回套接字描述符失败返回 - 1。2绑定地址bind ()c运行int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);参数sockfd套接字描述符my_addr地址结构体IPv4 用struct sockaddr_inaddrlen地址结构体长度返回值成功返回 0失败返回 - 1。IPv4 地址结构体c运行struct sockaddr_in { u_short sin_family; // 地址族AF_INET u_short sin_port; // 端口网络字节序 struct in_addr sin_addr; // IP地址网络字节序 };3发送数据sendto ()c运行ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);参数buf待发送数据缓冲区len发送数据长度flags0 阻塞发送dest_addr目标主机地址结构体返回值成功返回发送的字节数失败返回 - 1。4接收数据recvfrom ()c运行ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);参数buf接收数据缓冲区len缓冲区大小src_addr可选发送方地址结构体NULL 表示不关心返回值成功返回接收的字节数失败返回 - 1。3. 实战示例UDP 服务端 客户端1UDP 服务端绑定端口接收数据并保存文件c运行#include arpa/inet.h #include netinet/in.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include unistd.h #include fcntl.h typedef struct sockaddr* SA; #define SAVE_FILE /home/linux/received.png int main() { int sockfd socket(AF_INET, SOCK_DGRAM, 0); if (-1 sockfd) { perror(socket); return 1; } struct sockaddr_in ser, cli; bzero(ser, sizeof(ser)); ser.sin_family AF_INET; ser.sin_port htons(50000); ser.sin_addr.s_addr inet_addr(192.168.0.112); if (-1 bind(sockfd, (SA)ser, sizeof(ser))) { perror(bind); close(sockfd); return 1; } int fp open(SAVE_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (-1 fp) { perror(open); close(sockfd); return 1; } socklen_t len sizeof(cli); printf(UDP服务端启动端口50000等待接收...\n); while (1) { char buf[512] {0}; ssize_t recv_len recvfrom(sockfd, buf, sizeof(buf), 0, (SA)cli, len); if (recv_len 0) { perror(recvfrom); break; } printf(接收客户端(%s:%d)数据%ld字节\n, inet_ntoa(cli.sin_addr), ntohs(cli.sin_port), recv_len); write(fp, buf, recv_len); const char *resp OK; sendto(sockfd, resp, strlen(resp)1, 0, (SA)cli, len); bzero(buf, sizeof(buf)); } close(fp); close(sockfd); return 0; }2UDP 客户端发送二进制文件到服务端c运行#include arpa/inet.h #include netinet/in.h #include stdio.h #include stdlib.h #include string.h #include sys/socket.h #include unistd.h #include fcntl.h typedef struct sockaddr* SA; int main() { int sockfd socket(AF_INET, SOCK_DGRAM, 0); if (-1 sockfd) { perror(socket); return 1; } struct sockaddr_in ser; bzero(ser, sizeof(ser)); ser.sin_family AF_INET; ser.sin_port htons(50000); ser.sin_addr.s_addr inet_addr(192.168.0.112); int fp open(/home/linux/1.png, O_RDONLY); if (-1 fp) { perror(open); close(sockfd); return 1; } char buf[512] {0}; while (1) { int ret read(fp, buf, sizeof(buf)-1); if (ret 0) break; sendto(sockfd, buf, ret, 0, (SA)ser, sizeof(ser)); bzero(buf, sizeof(buf)); int recv_len recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL); if (recv_len 0) printf(服务端响应%s\n, buf); bzero(buf, sizeof(buf)); } close(fp); close(sockfd); return 0; }四、总结网络编程的核心是理解分层模型OSI 是理论TCP/IP 是实际应用重点掌握应用层 / 传输层 / 网络层的核心协议UDP 适合低延迟、实时性要求高的场景核心是「无连接、数据报有边界、收发次数对应」套接字编程的关键正确转换字节序、绑定地址服务端、用实际字节数收发数据尤其二进制文件。