网络编程及相关概念
UDP网络通信程序
UDP网络通信操作
一、网络编程及相关概念
1. 网络编程概念:
        指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。

2.OSI模型概述及结构
        1)概述:OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。

        2)OSI模型的七层结构

        物理层(Physical Layer)负责传输原始比特流,定义物理介质(如电缆、光纤)的电气、机械特性。典型协议包括以太网、USB。

        数据链路层(Data Link Layer)将比特流组织为帧(Frame),提供物理地址(MAC地址)和错误检测。交换机在此层操作,协议如PPP、HDLC。

        网络层(Network Layer)负责路由选择和数据包转发,使用逻辑地址(如IP地址)。核心设备是路由器,协议包括IP、ICMP。

        传输层(Transport Layer)确保端到端的可靠传输,提供流量控制和错误恢复。主要协议有TCP(可靠)和UDP(不可靠)。

       会话层(Session Layer)  管理通信会话的建立、维护和终止,例如NetBIOS。

       表示层(Presentation Layer)处理数据格式转换(如加密、压缩),确保应用层可理解数据。例如SSL/TLS加密。

       应用层(Application Layer)直接为用户应用提供服务,协议包括HTTP、FTP、SMTP。

3.TCP/IP模型概述及结构
        1)概述:TCP/IP模型是互联网通信的核心框架,由四层组成:网络接口层、网络层、传输层和应用层。它比OSI七层模型更简洁,实际应用更广泛。

        2)TCP/IP模型的四层结构:

        网络接口层(Link Layer)负责物理传输,包括以太网、Wi-Fi等协议。数据以帧为单位传输,处理MAC地址和硬件交互。

        网络层(Internet Layer) 核心协议为IP(Internet Protocol),负责路由和逻辑寻址。关键协议包括:

IP:无连接的数据包传输
ICMP:错误报告和诊断(如ping)
ARP:IP地址到MAC地址的映射
        传输层(Transport Layer)提供端到端通信,主要协议:TCP(可靠连接,三次握手建立连接)、UDP(无连接,低延迟)。

        应用层(Application Layer)包含高层协议如HTTP、FTP、DNS等。数据单位为消息。

        3)数据封装过程:发送端自上而下封装------接收端自下而上解封装

应用数据添加应用层头(如HTTP头)
传输层添加TCP/UDP头
网络层添加IP头
网络接口层添加帧头和尾

4.OSI模型与TCP/IP模型对比
TCP/IP层OSI层
应用层应用层+表示层+会话层
传输层传输层
网络层网络层
网络接口层数据链路层+物理层

实际应用要点
IP地址分为IPv4(32位)和IPv6(128位)
端口号范围:0-65535(系统端口:0-1023)
MTU(最大传输单元)影响数据分片
路由选择通过路由表实现
该模型的设计强调端到端原则,将复杂性放在网络边缘,核心网络保持简单高效。

5.DNS域名解析原理
        DNS(Domain Name System)将人类可读的域名(如example.com)转换为机器可读的IP地址(如93.184.216.34)。解析过程遵循分层查询机制:

        1)递归查询:用户设备向递归DNS服务器(如ISP提供的服务器)发起请求,由递归服务器完成后续查询并返回最终结果。
        2)迭代查询:递归服务器依次向根域名服务器、顶级域(TLD)服务器和权威域名服务器查询,最终获取目标IP。

6.DHCP概述及工作原理
        1)概述:DHCP(Dynamic Host Configuration Protocol)是一种网络协议,用于自动分配 IP 地址、子网掩码、默认网关和其他网络配置参数给客户端设备。它简化了网络管理,避免了手动配置 IP 地址的繁琐和错误。

        2)DHCP工作原理:DHCP 使用客户端-服务器模型,工作流程分为四个阶段(DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK):

DHCPDISCOVER:客户端广播请求 IP 地址配置。

DHCPOFFER:服务器响应并提供可用 IP 地址。

DHCPREQUEST:客户端确认选择服务器提供的配置。

DHCPACK:服务器最终确认分配 IP 地址。

7.IPv4地址分类

        IPv4地址通常分为A、B、C、D、E五类,主要依据网络号和主机号的划分方式:

  1. A类地址:
  • 范围:1.0.0.0 到 126.255.255.255
  • 第一字节为网络号,后三个字节为主机号。
  • 子网掩码:255.0.0.0
  • 适用于大型网络,如国际组织或大型企业。

 2.B类地址:

  • 范围:128.0.0.0 到 191.255.255.255
  • 前两个字节为网络号,后两个字节为主机号。
  • 子网掩码:255.255.0.0
  • 适用于中型网络,如大学或中型企业。

 3.C类地址:

  • 范围:192.0.0.0 到 223.255.255.255
  • 前三个字节为网络号,最后一个字节为主机号。
  • 子网掩码:255.255.255.0
  • 适用于小型网络,如家庭或小型办公室。

   4.D类地址:

  • 范围:224.0.0.0 到 239.255.255.255(网络号+最大主机号)
  • 用于组播(Multicast)通信,不划分网络号和主机号。
  • 主要用于视频流、在线会议等一对多的通信场景。

     5.E类地址:

  • 范围:240.0.0.0 到 255.255.255.255
  • 保留用于实验和研究,不用于常规网络通信。

8.单机上网配置
        1、有网络接口并插入网线。
        2、有ip地址
        3、配置网络设置

ip: ifconfig ethX X.X.X.X/24 up  ifconfig ens33 192.168.0.13/24 up  255.255.255.0
网关: route add default gw x.x.x.x 
DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8
测试:ping www.baidu.com  

netstat  -anp:查看网络连接状态

网络接口:
        1、socket  套接字 ==》BSD socket ==》用于网络通信的一组接口函数。

                socket api  application interface
        2、ip+port 地址+端口===》地址用来识别主机、端口用来识别应用程序。
                  port分为TCP port / UDP port  范围都是: 1-65535,约定1000 以内的端口为系统使用。

网络字节序 :大端存储

用htons函数 把端号转为大端。

用inet addr 函数把IP地址转为大端。

9.私有IP地址和公有IP地址

        1)私有IP:用于局域网内部通信,不直接暴露在互联网上。

范围包括:
A类:10.0.0.0 到 10.255.255.255
B类:172.16.0.0 到 172.31.255.255
C类:192.168.0.0 到 192.168.255.255
通常通过NAT(网络地址转换)与公网通信。

  2)公有IP:用于互联网通信,全球唯一。

        除私有IP和特殊保留地址外的其他IPv4地址

二、UDP网络通信程序
1.UDP概述
        UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供简单的、不可靠的数据传输服务。与 TCP 不同,UDP 不保证数据包的顺序、可靠性或流量控制,但具有低延迟和高效率的特点。

2.UDP特征
无连接:通信前无需建立连接,直接发送数据。
不可靠:不保证数据包是否到达目的地,也不保证顺序。
高效:头部开销小(仅 8 字节),适合对延迟敏感的应用。
支持广播和多播:可以同时向多个目标发送数据。
3.UDP头部结构
         UDP 头部包含 4 个字段,每个字段 2 字节:

        1)源端口(Source Port):发送方端口号(可选,可设为 0)。

        2)目标端口(Destination Port):接收方端口号。

        3)长度(Length):UDP 头部加数据的总长度(最小为 8)。

        4)校验和(Checksum):用于错误检测(可选,IPv6 必须校验)。

4.UDP适用场景:
实时应用:如视频流、语音通话(VoIP)、在线游戏。
DNS 查询:快速响应比可靠性更重要。
广播/多播:如 DHCP、网络发现协议。
简单请求-响应:如 SNMP、TFTP。
5.UDP与TCP对比:
特性    UDP    TCP
连接方式    无连接    面向连接
可靠性    不可靠    可靠(重传、确认机制)
流量控制    无    有(滑动窗口)
顺序保障    不保证    保证
头部大小    8 字节    20 字节
适用场景    实时、低延迟应用    文件传输、网页浏览
UDP 的局限性:
无拥塞控制:可能引发网络拥塞。
数据包丢失:不适合需要高可靠性的场景。
安全性:容易受到 DDOS 攻击(如 UDP 洪水攻击)。

三、UDP网络通信操作

1.socket():创建套接字,返回文件描述符。

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

        参数:domain:协议族(如AF_INET IPv4,AF_INET6 IPv6)。

                        参数:PF_INET == AF_INET ==>互联网程序
                                  PF_UNIX == AF_UNIX ==>单机程序

                type:套接字类型(如SOCK_STREAM TCP,SOCK_DGRAM UDP)。
                           SOCK_STREAM  流式套接字 ===》TCP   
                          SOCK_DGRAM   用户数据报套接字===>UDP
                          SOCK_RAW     原始套接字  ===》IP
                protocol 协议 ==》0 表示自动适应应用层协议。通常为0,自动匹配。

2.bind():将套接字绑定到特定IP和端口。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

        参数:

sockfd:socket()返回的文件描述符。
addr:指向sockaddr结构的指针(需转换为struct sockaddr_in或sockaddr_in6)。
struct sockaddr      通用地址结构
  {
  u_short sa_family;  地址族
  char sa_data[14];   地址信息
  };

转换成网络地址结构如下:
  struct _sockaddr_in    ///网络地址结构
  {
  u_short    sin_family; 地址族
  u_short    sin_port;   ///地址端口
  struct in_addr  sin_addr;   ///地址IP
  char    sin_zero[8]; 占位
  };

addrlen:地址结构长度。
        注意:如果是客户端,则该函数省略,由默认接口发送数据。

3.recvfrom():用于从套接字接收数据的系统调用,常用于无连接协议(如UDP)。与recv不同,recvfrom可以获取发送端的地址信息。

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

        参数:

sockfd: 套接字描述符
buf: 接收数据的缓冲区指针
len: 缓冲区长度
flags: 控制标志(常用值如MSG_WAITALL、MSG_DONTWAIT)
src_addr: 发送方地址结构体指针(可为NULL)
addrlen: 地址结构体长度指针(输入输出参数)
        返回值:

成功时返回接收的字节数
失败返回-1并设置errno
连接关闭时返回0
4.sendto():用于发送数据的系统调用,用于无连接协议(UDP)或需要指定目标地址的场景。它允许直接向特定目标发送数据而不需要预先建立连接。

#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

        参数:

sockfd: 已创建的套接字文件描述符
buf: 指向包含待发送数据的缓冲区
len: 要发送的数据长度(字节数)
flags: 控制发送行为的标志位(通常为0)
dest_addr: 指向目标地址结构体的指针
addrlen: 目标地址结构体的长度
        返回值:成功时返回发送的字节数,失败返回-1并设置errno。

示例:用UDP完成现在实时聊天

服务器端:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);             // host to net shortser.sin_addr.s_addr = htonl(INADDR_ANY); // 小端转大端  本地回环  127int ret = bind(sockfd, (SA)&ser, sizeof(ser));if (-1 == ret) {perror("bind");return 1;}socklen_t len = sizeof(cli);char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("cli:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to cli:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, sizeof(cli));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}return 0;
}

客户端: 

 

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);                      // host to net shortser.sin_addr.s_addr = inet_addr("192.168.0.165"); // 小端转大端socklen_t len = sizeof(cli);char buf[256] = {0};strcpy(buf, "start");sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("ser:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to ser:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}close(sockfd);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/85852.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85852.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85852.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin 1. 搭建Kotlin开发环境

本实战概述旨在指导用户搭建Kotlin开发环境&#xff0c;并进行简单的编程实践。首先&#xff0c;用户需安装IntelliJ IDEA&#xff0c;并进行基本设置&#xff0c;如选择主题、调整字体和安装插件等。接着&#xff0c;创建Kotlin项目&#xff0c;设置项目名称、位置和JDK版本&a…

Mysql的B-树和B+树的区别总结

B 树也称 B- 树&#xff0c;全称为 多路平衡查找树&#xff0c;B 树是 B 树的一种变体。B 树和 B 树中的 B 是 Balanced&#xff08;平衡&#xff09;的意思。 目前大部分数据库系统及文件系统都采用 B-Tree 或其变种 BTree 作为索引结构。 B 树& B 树两者有何异同呢&…

COMSOL学习笔记-静电场仿真

最近在学习COMSOL&#xff0c;做了一个静电场仿真的例子&#xff0c;分享一下。 参考了下面的官方案例 计算电容 电容式位置传感器的边界元建模 三维模型 首先对静电测试仪进行三维建模。 Comsol静电场仿真 使用comsol进行静电场仿真&#xff0c;控制方程为泊松方程&#…

JavaScript 循环方法对比指南

JavaScript 循环方法对比指南 1. 标准 for 循环 语法&#xff1a; for (let i 0; i < arr.length; i) {console.log(arr[i]); }优点 ✅ 完全控制索引&#xff0c;适合需要精确控制遍历顺序或步长的场景。 ✅ 性能最优&#xff0c;在超大规模数据遍历时比高阶方法&#x…

【快餐点餐简易软件】佳易王快餐店点餐系统软件功能及操作教程

一、软件概述与核心优势 &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff…

智慧园区数字孪生全链交付方案:降本增效30%,多案例实践驱动全周期交付

在智慧园区建设浪潮中&#xff0c;数字孪生技术正成为破解传统园区管理难题的核心引擎。通过构建与物理园区1:1映射的数字模型&#xff0c;实现数据集成、状态同步与智能决策&#xff0c;智慧园区数字孪生全链交付方案已在多个项目中验证其降本增效价值——某物流园区通过该方案…

从0开始学vue:Element Plus详解

一、核心架构解析二、技术实现指南三、高级特性实现四、性能优化方案五、生态扩展方案六、调试与测试七、版本演进路线 Element Plus 是专为 Vue 3 设计的桌面端 UI 组件库&#xff0c;基于 Vue 3 的 Composition API 重构&#xff0c;在保持与 Element UI 兼容性的同时&#x…

Ubuntu系统配置C++的boost库(含filesystem模块)的方法

本文介绍在具有sudo权限的Ubuntu操作系统中&#xff0c;配置C 的boost库的方法。 boost库是一个广受欢迎的C 库集合&#xff0c;提供了许多强大的功能扩展——例如其中的filesystem模块&#xff0c;可简化文件和目录操作&#xff0c;让开发者可以轻松处理跨平台的文件系统任务。…

Java集合中Stream流的使用

前言 Java 8 引入了 Stream API&#xff0c;它是一种用于处理集合&#xff08;Collection&#xff09;数据的强大工具。Stream 不是数据结构&#xff0c;而是对数据源进行操作的一种方式&#xff0c;支持声明式、函数式的操作&#xff0c;如过滤、映射、排序等。 Stream 操作…

.Net Framework 4/C# 属性和方法

一、属性的概述 属性是对实体特征的抽象&#xff0c;用于提供对类或对象的访问&#xff0c;C# 中的属性具有访问器&#xff0c;这些访问器指定在它们的值被读取或写入时需要执行的语句&#xff0c;因此属性提供了一种机制&#xff0c;用于把读取和写入对象的某些特征与一些操作…

asp.net mvc如何简化控制器逻辑

在ASP.NET MVC中&#xff0c;可以通过以下方法简化控制器逻辑&#xff1a; ASP.NET——MVC编程_aspnet mvc-CSDN博客 .NET/ASP.NET MVC Controller 控制器&#xff08;IController控制器的创建过程&#xff09; https://cloud.tencent.com/developer/article/1015115 【转载…

flask功能使用总结和完整示例

Flask 功能使用总结与完整示例 一、Flask 核心功能总结 Flask 是轻量级 Web 框架&#xff0c;核心功能包括&#xff1a; 路由系统&#xff1a;通过 app.route 装饰器定义 URL 与函数的映射。模板引擎&#xff1a;默认使用 Jinja2&#xff0c;支持动态渲染 HTML。请求处理&…

HarmonyOS应用基础阶段- 09、综合案例-仿携程旅行口碑榜

文章目录 携程-口碑榜1、banner 区域1.1 区域部分1.2 口碑榜 Logo1.3 推荐榜单1.4 评分规则1.5 底部 Line 2、选择城市和目的地2.1 区域布局2.2 选择城市2.3 口碑目的地 3、商业选项菜单4、热门项目选项4.1 区域布局4.2 热门标题4.3 选项 5、热门榜标题6、热门景点列表6.1 区域…

中小制造企业转型:低成本国产工业软件替代方案实践

在数字经济浪潮席卷全球的当下&#xff0c;制造业数字化转型已成为企业提升竞争力、实现可持续发展的必由之路。然而&#xff0c;高昂的成本与复杂的技术门槛&#xff0c;却让众多中小制造企业陷入 “不能转、不想转、不会转、不敢转” 的困局。幸运的是&#xff0c;一批具有自…

Kafka 核心架构与消息模型深度解析(二)

案例实战&#xff1a;Kafka 在实际场景中的应用 &#xff08;一&#xff09;案例背景与需求介绍 假设我们正在为一个大型电商平台构建数据处理系统。该电商平台拥有庞大的用户群体&#xff0c;每天会产生海量的订单数据、用户行为数据&#xff08;如浏览、点击、收藏等&#…

【iOS】cache_t分析

前言 之前分析类的结构的时候&#xff0c;有遇到一个cache_t&#xff0c;当时说是用来保存方法缓存的结构&#xff0c;这篇文章来从源码详细介绍一下cache_t 概览cache_t cache_t结构 类在底层的结构如之前所述&#xff0c;存在着cache_t属性&#xff0c;而cache_t的结构如下…

java面试题:List如何排序?内存溢出/OOM怎么回事?如何排查和解决?

List如何排序 List排序可以通过实现Comparable接口并且实现compareTo方法&#xff0c;或者传入comparator去实现排序。 内存溢出/OOM是怎么回事&#xff1f; 内存溢出就是程序在运行的过程中&#xff0c;申请的内存超过了最大内存限制&#xff0c;导致JVM抛出OOM异常&#x…

Python cryptography【密码库】库功能与使用指南

边写代码零食不停口 盼盼麦香鸡味块 、卡乐比&#xff08;Calbee&#xff09;薯条三兄弟 独立小包、好时kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 边写代码边贴面膜 事业美丽两不误 DR. YS 野森博士【AOUFSE/澳芙雪特证】377专研美白淡斑面膜组合 优惠劵 别光顾写…

第二十四章 流程控制_ if分支

第二十四章 流程控制: if分支和输入 正如许多编程语言一样Shell也有自己的条件分支语句。有时需要根据情况进行相应的处理&#xff0c;因此可以通过条件分支语句实现&#xff0c;本章主要介绍的是if分支语句。 if语句 在Shell中if语句语法格式如下&#xff1a; if commands…

电脑网络重置,找不到原先自家的WIFI,手机还能正常连接并上网

问题排查&#xff1a;1、电脑感觉网络太慢&#xff0c;因此打算点击了网络重置 2、点击提示会删除网络&#xff0c;在五分钟后关机重启 3、从设备管理器设备的无线wifi属性-事件中发现删除记录 4、选择更新驱动程序 5、从列表中选取 6、更改回老驱动版本 备选方案&#…