尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

网络问题与基础理论

网络问题与基础理论 虚拟机网络修复当虚拟机突然没有网络标志时可以使用以下命令快速修复nmcli network off nmcli network on这两个命令会重启网络管理器服务通常可以解决临时的网络连接问题。 网络基础理论1. 认识网络了解网络指多台设备之间进行通信和资源共享的系统。现代网络技术使得不同地理位置的计算机能够相互连接和交换数据。Internet发展史从ARPANET到现代互联网的演进过程。2. IP地址详解2.1 基本概念IP地址Internet中主机的唯一标识符通信前提Internet中的主机要与别的机器通信必须有一个IP地址地址长度IPv4为32位IPv6为128位表示形式常用点分十进制形式如192.168.1.217最终都会转换为32位无符号整数地址分类A、B、C、D、E五类2.2 IP地址二级划分二级划分公式IP地址 网络号 主机号网络号标识设备所在的网络段局域网主机号标识在本网段内的具体设备ID同一局域网内不能重复IP地址取值范围类别地址范围用途说明A类1.0.0.0 ~ 126.255.255.255大型网络政府机构等B类128.0.0.0 ~ 191.255.255.255中型网络大学、大型企业C类192.0.0.0 ~ 223.255.255.255小型网络小型企业、家庭D类224.0.0.0 ~ 239.255.255.255组播地址MulticastE类240.0.0.0 ~ 255.255.255.255保留地址实验和研究使用2.3 特殊地址以下地址不会分配给主机使用1. 网络地址用于标识网络的地址有效网络号主机号全为0。示例转换192.168.30.182 → 192.168.30.0128.1.2.3 → 128.1.0.012.1.2.5 → 12.0.0.02. 广播地址用于给局域网内所有主机发送数据有效的网络号主机号全为1。示例转换192.168.30.182 → 192.168.30.255128.1.2.3 → 128.1.255.25512.1.2.5 → 12.255.255.2553. 其他特殊地址0.0.0.0在服务器中表示监听本机上所有的IPv4地址接受来自任意源IP地址的数据包常用于服务器程序监听所有网络接口的连接请求。127.0.0.1回环地址/本机地址一般用于测试。所有发往该类地址的数据包都应该被loop back原样送回即当在计算机上访问127.0.0.1时实际上是在与自己进行网络通信。练习问题C类地址同一网段最多可以连接多少个主机答案254个排除网络地址和广播地址2.4 子网掩码作用将IP地址划分为网络地址和主机地址两部分。特点子网掩码长度和IP地址长度完全一样由32位二进制组成网络号全为1主机号全为0默认子网掩码A类255.0.0.0B类255.255.0.0C类255.255.255.0练习问题子网掩码255.255.255.0该网段可以容纳多少台主机答案254台计算公式IP地址 子网掩码 网络地址IP地址 ~子网掩码 主机号2.5 三级划分二级划分 网络号 主机号三级划分 网络号 子网号 主机号三级划分的子网掩码网络号和子网号都是1主机号是0。子网划分练习场景某公司有四个部门行政、研发1、研发2、营销每个部门各40台计算机接入公司局域网交换机。如果要在192.168.1.0网段为每个部门划分子网子网掩码应该怎么设置每个子网的地址范围分别是什么4个部门之间不能通信分析192.168.1.0属于C类地址默认子网掩码255.255.255.0划分4个网段需要将2位二进制从主机号划分成子网号2²4高两位分别可以是00、01、10、11三级划分后的子网掩码255.255.255.192二进制11111111.11111111.11111111.11000000各部门地址范围部门二进制范围十进制范围去除网络地址和广播地址部门1行政192.168.1.00 000000 ~ 192.168.1.00 111111192.168.1.1 ~ 192.168.1.62部门2研发1192.168.1.01 000000 ~ 192.168.1.01 111111192.168.1.65 ~ 192.168.1.126部门3研发2192.168.1.10 000000 ~ 192.168.1.10 111111192.168.1.129 ~ 192.168.1.190部门4营销192.168.1.11 000000 ~ 192.168.1.11 111111192.168.1.193 ~ 192.168.1.254补充DNS域名系统由于使用IP地址来指定计算机不方便人们记忆且输入时容易出错因此使用字符表示网络中计算机名称的方法应运而生。这种命名方法就像每个人的名字这就是域名Domain Name。DNS相关概念域名服务器Domain Name Server用来处理IP地址和域名之间的转换域名系统Domain Name SystemDNS将域名翻译成IP地址的软件系统特性一个域名可以绑定多个IP地址公共DNS可以在网络中配置自己的DNS服务器如114.114.114.114、8.8.8.8域名结构以域名www.baidu.com.cn为例从右向左看cn高级域名也叫一级域名通常分配给主干节点取名为国家名cn代表中国com网络名属于二级域名通常表示组织或部门。中国互联网二级域名共40个edu教育部门com商业部门gov政府部门mil军队等等baidu机构名属于三级域名表示百度公司www万维网World Wide Web也叫环球信息网是一种特殊的信息结构框架 网络模型3.1 网络体系结构网络采用分而治之的方法设计将网络的功能划分为不同板块以分层的形式有机组合在一起。每层实现不同的功能其内部实现方法对外部其他层次来说是透明的每层向上层提供服务同时使用下层提供的服务网络体系结构即指网络的层次结构和每层所使用协议的集合两类非常重要的体系结构OSI模型与TCP/IP模型3.2 OSI七层模型OSI模型是最理想的参考模型分为七层物理层传输的是bit流0与1的数据物理信号没有格式数据链路层格式变为帧把数据分成包一帧一帧的数据进行发送网络层路由器中有算法IP协议主机到主机路由转发传输层端口号数据传输到具体哪个进程程序端到端会话层通信管理负责建立或断开通信链接表示层确保一个系统应用层发送消息可以被另一个系统的应用层读取编码转换数据解析管理数据加密、解密应用层指定特定应用协议文件传输文件管理电子邮件等记忆口诀物→链联→网→输叔→会→示使→用3.3 TCP/IP四层模型各层功能网络接口层和物理层屏蔽硬件差异驱动向上提供统一的操作接口网络层提供端对端的传输可以理解为通过IP寻址机器传输层决定数据交给机器的哪个任务进程去处理通过端口寻址应用层应用协议和应用程序的集合3.4 常见网络协议层次协议说明网络接口和物理层PPP拨号协议老式电话线上网方式ARP地址解析协议IP→MAC地址转换RARP反向地址转换协议MAC→IP地址转换网络层IPIPv4/IPv6网络互联协议负责数据包的路由和转发ICMPInternet控制消息协议用于网络诊断和错误报告IGMPInternet组管理协议用于组播通信传输层TCP传输控制协议面向连接、可靠的字节流服务UDP用户数据报协议无连接、不可靠的数据报服务SCTP流控制传输协议结合TCP和UDP的优点应用层HTTP/HTTPS超文本传输协议/安全超文本传输协议FTP文件传输协议SMTP/POP3/IMAP电子邮件相关协议DNS域名系统域名与IP地址转换DHCP动态主机配置协议自动分配IP地址 SOCKET编程4.1 Socket基本概念Socket套接字是网络通信的端点是应用层与传输层之间的接口。它提供了进程间通信的机制允许不同主机上的进程通过网络进行数据交换。Socket通信模型面向连接的Socket基于TCP协议提供可靠的数据传输无连接的Socket基于UDP协议提供快速但不保证可靠的数据传输4.2 Socket通信流程TCP Socket通信流程服务器端创建Socket绑定IP地址和端口监听连接请求接受客户端连接收发数据关闭连接客户端创建Socket连接服务器收发数据关闭连接UDP Socket通信流程服务器端创建Socket绑定IP地址和端口接收数据发送数据关闭Socket客户端创建Socket发送数据接收数据关闭Socket4.3 Socket编程示例C语言TCP服务器端示例#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_len sizeof(client_addr); char buffer[BUFFER_SIZE]; // 1. 创建Socket server_fd socket(AF_INET, SOCK_STREAM, 0); if (server_fd -1) { perror(socket创建失败); exit(EXIT_FAILURE); } // 2. 绑定地址和端口 server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr INADDR_ANY; server_addr.sin_port htons(PORT); if (bind(server_fd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) { perror(绑定失败); close(server_fd); exit(EXIT_FAILURE); } // 3. 监听连接 if (listen(server_fd, 5) 0) { perror(监听失败); close(server_fd); exit(EXIT_FAILURE); } printf(服务器启动等待客户端连接...\n); // 4. 接受客户端连接 client_fd accept(server_fd, (struct sockaddr*)client_addr, client_len); if (client_fd 0) { perror(接受连接失败); close(server_fd); exit(EXIT_FAILURE); } printf(客户端连接成功%s:%d\n, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 5. 接收数据 memset(buffer, 0, BUFFER_SIZE); int bytes_received recv(client_fd, buffer, BUFFER_SIZE - 1, 0); if (bytes_received 0) { perror(接收数据失败); } else { printf(收到客户端消息%s\n, buffer); // 6. 发送响应 char response[BUFFER_SIZE]; snprintf(response, BUFFER_SIZE, 服务器已收到%s, buffer); send(client_fd, response, strlen(response), 0); } // 7. 关闭连接 close(client_fd); close(server_fd); return 0; }TCP客户端示例#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; // 1. 创建Socket sockfd socket(AF_INET, SOCK_STREAM, 0); if (sockfd -1) { perror(socket创建失败); exit(EXIT_FAILURE); } // 2. 设置服务器地址 server_addr.sin_family AF_INET; server_addr.sin_port htons(PORT); inet_pton(AF_INET, 127.0.0.1, server_addr.sin_addr); // 3. 连接服务器 if (connect(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) { perror(连接服务器失败); close(sockfd); exit(EXIT_FAILURE); } // 4. 发送数据 char *message Hello Server!; send(sockfd, message, strlen(message), 0); // 5. 接收响应 memset(buffer, 0, BUFFER_SIZE); int bytes_received recv(sockfd, buffer, BUFFER_SIZE - 1, 0); if (bytes_received 0) { perror(接收响应失败); } else { printf(服务器响应%s\n, buffer); } // 6. 关闭Socket close(sockfd); return 0; }UDP服务器端示例#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t client_len sizeof(client_addr); char buffer[BUFFER_SIZE]; // 1. 创建UDP Socket sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd -1) { perror(socket创建失败); exit(EXIT_FAILURE); } // 2. 绑定地址和端口 server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr INADDR_ANY; server_addr.sin_port htons(PORT); if (bind(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) { perror(绑定失败); close(sockfd); exit(EXIT_FAILURE); } printf(UDP服务器启动...\n); // 3. 接收数据 memset(buffer, 0, BUFFER_SIZE); int bytes_received recvfrom(sockfd, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr*)client_addr, client_len); if (bytes_received 0) { perror(接收数据失败); } else { printf(收到客户端消息%s\n, buffer); // 4. 发送响应 char response[BUFFER_SIZE]; snprintf(response, BUFFER_SIZE, 服务器已收到%s, buffer); sendto(sockfd, response, strlen(response), 0, (struct sockaddr*)client_addr, client_len); } // 5. 关闭Socket close(sockfd); return 0; }UDP客户端示例#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/socket.h #include netinet/in.h #include arpa/inet.h #define PORT 8888 #define BUFFER_SIZE 1024 int main() { int sockfd; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; // 1. 创建UDP Socket sockfd socket(AF_INET, SOCK_DGRAM, 0); if (sockfd -1) { perror(socket创建失败); exit(EXIT_FAILURE); } // 2. 设置服务器地址 server_addr.sin_family AF_INET; server_addr.sin_port htons(PORT); inet_pton(AF_INET, 127.0.0.1, server_addr.sin_addr); // 3. 发送数据 char *message Hello UDP Server!; sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)server_addr, sizeof(server_addr)); // 4. 接收响应 memset(buffer, 0, BUFFER_SIZE); socklen_t server_len sizeof(server_addr); int bytes_received recvfrom(sockfd, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr*)server_addr, server_len); if (bytes_received 0) { perror(接收响应失败); } else { printf(服务器响应%s\n, buffer); } // 5. 关闭Socket close(sockfd); return 0; }4.4 Socket编程注意事项端口选择避免使用0-1023的知名端口建议使用1024-65535的端口异常处理网络通信中可能发生各种异常需要妥善处理资源释放确保Socket、流等资源在使用后正确关闭并发处理服务器端通常需要支持多客户端并发连接缓冲区大小合理设置缓冲区大小避免内存浪费或数据丢失4.5 网络编程最佳实践使用线程池处理并发连接时使用线程池避免频繁创建销毁线程设置超时为Socket操作设置合理的超时时间避免无限等待数据校验重要数据应添加校验机制确保数据完整性日志记录记录关键操作和异常信息便于问题排查安全考虑对用户输入进行验证防止注入攻击
返回列表