一、网络通信模型1. OSI (Open System Interconnect)七层模型自上而下层级核心功能典型协议 / 技术应用层为应用程序提供网络服务直接面向用户HTTP、FTP、DNS、DHCP表示层数据编码 / 解码、加密 / 解密、压缩 / 解压缩统一数据格式ASCII、JPEG、SSL会话层建立、管理、终止应用程序间的通信会话RPC、NetBIOS传输层端到端数据传输定义端口提供可靠 / 不可靠传输TCP、UDP网络层IP 地址分配、路由选择实现跨网络数据传输IP、RIP、OSPF、ARP数据链路层MAC 地址封装 / 解封装帧传输、差错检测Ethernet、PPP物理层将数据转为电 / 光信号定义物理介质接口网线、光纤等双绞线、光纤、网卡2. TCP/IP 模型实际应用 4 层模型层级对应 OSI 层级核心功能应用层应用层 表示层 会话层提供各类网络应用服务传输层传输层TCP/UDP 协议实现端到端传输网际层网络层网络层IP 地址、路由选择网络接口层数据链路层 物理层物理传输、MAC 地址处理二、核心网络名词解释名词全称核心功能所属层级DNS域名系统Domain Name System将域名如www.baidu.com解析为 IP 地址解决 IP 难记问题应用层DHCP动态主机配置协议自动分配 IP 地址、子网掩码、网关、DNS 服务器等网络配置应用层TCP传输控制协议面向连接、可靠、面向字节流的传输协议明日重点学传输层RIP路由信息协议基于距离矢量算法的内部网关协议最大跳数 15适用于小型网络网络层OSPF开放式最短路径优先协议基于链路状态算法的内部网关协议高效稳定适用于大型网络网络层ARP地址解析协议将 IP 地址转换为 MAC 地址实现同一局域网内通信网络层三、网络基础1. IP 地址分类IPv4类别地址范围网络位 / 主机位默认子网掩码适用场景A 类1.0.0.0~126.255.255.2558 位 / 24 位255.0.0.0大型网络运营商、大企业B 类128.0.0.0~191.255.255.25516 位 / 16 位255.255.0.0中型网络学校、中型企业C 类192.0.0.0~223.255.255.25524 位 / 8 位255.255.255.0小型网络家庭、小公司D 类224.0.0.0~239.255.255.255无主机位-组播视频会议等E 类240.0.0.0~255.255.255.255无主机位-科研实验保留未商用2. 常用 Linux 网络指令指令核心功能sudo reboot重启系统需管理员权限网络配置修改后生效ifconfig查看 / 配置网络接口IP、MAC、子网掩码如ifconfig eth0 192.168.1.100ping 目标 IP / 域名测试网络连通性如ping -c 4 192.168.1.1发送 4 个数据包后停止ip addr替代 ifconfig查看更全面的网络接口信息netstat -tuln查看所有监听的 TCP/UDP 端口-t:TCP-u:UDP-l: 监听-n: 不解析域名route -n查看路由表-n: 不解析域名速度更快arp -a查看 ARP 缓存表IP 与 MAC 映射关系nslookup 域名测试 DNS 解析如nslookup www.baidu.comsudo ifdown/ifup eth0关闭 / 启用指定网卡如 eth0四、网络编程基础概念1. Socket 套接字定义应用程序与网络协议栈的交互接口本质是 Linux 下的文件描述符实现跨主机通信。分类SOCK_STREAM流式套接字对应 TCP 协议可靠连接SOCK_DGRAM数据报套接字对应 UDP 协议无连接SOCK_RAW原始套接字用于底层协议开发如抓包。2. 网络字节序大端字节序网络字节序高位字节存低地址网络传输统一标准小端字节序主机字节序低位字节存低地址多数主机默认转换函数htons ()主机字节序→网络字节序16 位端口号转换htonl ()主机字节序→网络字节序32 位IP 地址转换ntohs ()/ntohl ()网络字节序→主机字节序对应上述反向转换。五、核心重点UDP 协议1. UDP 协议特征无连接通信前无需建立连接直接发送数据无需确认对方在线不可靠不保证数据有序 / 完整可能丢失、重复、乱序无确认机制面向数据报数据以 “数据报” 为单位传输单包最大 65535 字节速度快协议开销小无握手 / 确认流程实时性高支持广播 / 组播可向多个主机同时发送数据TCP 仅点对点适用场景视频通话、语音聊天、DNS 查询、游戏数据传输等。2. UDP 通信流程1服务器端流程创建套接字socket()→ 绑定地址/端口bind()→ 循环接收/响应recvfrom()/sendto()→ 关闭套接字close()2客户端流程创建套接字socket()→ 循环发送/接收sendto()/recvfrom()→ 关闭套接字close()注客户端无需绑定端口系统自动分配随机端口3. UDP 核心函数详解1socket () - 创建套接字原型int socket(int domain, int type, int protocol);功能创建套接字返回文件描述符参数domain协议域AF_INETIPv4、AF_INET6IPv6type套接字类型SOCK_DGRAMUDP、SOCK_STREAMTCPprotocol协议类型UDP 填 0自动匹配返回值成功返回非负文件描述符失败返回 - 1设置 errno。2bind () - 绑定地址与端口原型int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能将套接字绑定到指定 IP 和端口参数sockfdsocket () 返回的文件描述符addr通用地址结构体实际用 struct sockaddr_inIPv4需强制转换struct sockaddr_in { sa_family_t sin_family; // 协议族AF_INET in_port_t sin_port; // 端口号需htons()转换为网络字节序 struct in_addr sin_addr; // IP地址INADDR_ANY表示绑定本机所有IP };addrlen地址结构体长度sizeof (struct sockaddr_in)返回值成功返回 0失败返回 - 1设置 errno。3recvfrom () - 接收 UDP 数据原型ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);功能接收 UDP 数据并获取发送方地址参数sockfd套接字文件描述符buf接收数据的缓冲区len缓冲区大小flags接收标志0阻塞接收、MSG_DONTWAIT非阻塞src_addr输出参数存储发送方客户端地址客户端接收数据时就填NULL因为肯定是刚才访问的服务器发来的addrlen输入输出参数传入 src_addr 长度返回实际地址长度返回值成功返回接收字节数失败返回 - 1设置 errno。4sendto () - 发送 UDP 数据原型ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);功能向指定目标地址发送 UDP 数据参数sockfd套接字文件描述符buf待发送数据缓冲区len发送数据长度≤65535 字节flags发送标志0默认dest_addr目标主机服务器 / 客户端地址结构体addrlen目标地址结构体长度返回值成功返回发送字节数失败返回 - 1设置 errno。5close () - 关闭套接字原型int close(int fd);功能释放套接字资源参数fd套接字文件描述符返回值成功返回 0失败返回 - 1设置 errno。服务端代码// server 服务端 #include sys/types.h /* See NOTES */ #include sys/socket.h #include stdio.h #include stdlib.h #include string.h #include unistd.h #include netinet/in.h #include netinet/ip.h #include arpa/inet.h #include time.h //起别名 typedef struct sockaddr * (SA); int main(int argc, char **argv) { // 1.创建套接字:internetudp默认协议 int udpfd socket(AF_INET, SOCK_DGRAM, 0); if (-1 udpfd) { perror(socket); return 1; } // 2. 给套接字 绑定ip 端口号 // 定义服务器的地址结构体 客户端的地址结构体 struct sockaddr_in ser, cli; //结构体清零 bzero(ser, sizeof(ser)); bzero(cli, sizeof(cli)); //完善结构体 ser.sin_family AF_INET; // ipv4 ser.sin_port htons(50000); // port端口号小端转大端 ser.sin_addr.s_addr inet_addr(192.168.31.136);//ip地址 //bind绑定ip int ret bind(udpfd, (SA)ser, sizeof(ser)); if (-1 ret) { perror(bind); return 1; } //客户端地址结构体大小 socklen_t len sizeof(cli); //循环:接收-发送 while (1) { //定义缓冲区接收数据 char buf[1024]{0}; //接收cli发的数据 recvfrom(udpfd,buf,sizeof(buf),0,(SA)cli,len); time_t tm; time(tm); //拼接要发送的内容 sprintf(buf,%s %s,buf,ctime(tm)); //发送数据 sendto(udpfd,buf,strlen(buf),0,(SA)cli,len); } return 0; }客户端代码// client 客户端 #include sys/types.h /* See NOTES */ #include sys/socket.h #include stdio.h #include stdlib.h #include string.h #include unistd.h #include netinet/in.h #include netinet/ip.h #include arpa/inet.h #include time.h //起别名 typedef struct sockaddr *(SA); int main(int argc, char **argv) { // 1.创建套接字 internet udp 默认协议 int udpfd socket(AF_INET, SOCK_DGRAM, 0); if (-1 udpfd) { perror(socket); return 1; } //服务器的地址结构体 struct sockaddr_in ser; bzero(ser, sizeof(ser)); ser.sin_family AF_INET; // ipv4 ser.sin_port htons(50000); // host to net short 小端转大端 ser.sin_addr.s_addr inet_addr(192.168.31.177); //循环发送-接收 while (1) { char buf[1024] hello,this is why test; //客户端-发送数据 sendto(udpfd, buf, strlen(buf), 0, (SA)ser, sizeof(ser)); bzero(buf, sizeof(buf)); //接收ser发的数据 recvfrom(udpfd, buf, sizeof(buf), 0, NULL, NULL); printf(from ser:%s\n, buf); sleep(1); } //关闭套接字 close(udpfd); return 0; }六、今日学习总结掌握 OSI/TCP/IP 分层模型理解各层核心功能是网络编程的基础熟悉 IP 地址分类、常用网络指令能完成基础网络配置与测试理解 Socket 套接字、网络字节序的核心概念解决跨主机数据传输格式问题重点掌握 UDP 协议的无连接、不可靠、面向数据报特征以及 UDP 客户端 / 服务器通信流程熟记 UDP 核心函数socket ()/bind ()/recvfrom ()/sendto ()的原型、参数、返回值为编写 UDP 程序打下基础。