1、目的

实现不同主机上进程间的通信。

2、问题

  1. 主机与主机之间在物理层面必须互联互通。
  2. 进程与进程在软件层面必须互联互通。
  • IP地址:计算机的软件地址,用来标识计算机设备。
  • MAC地址:计算机的硬件地址(固定)。
  • 网络的端口号:标记同一主机上的不同网络进程。

3、网络协议

网络通信标准

OSI七层模型

开放系统互联模型,是不同设备间网络通信的通信标准,可概括为“物数网传会表应”。

  • 应用层:要传输的数据信息,如文件传输、电子邮件等。
  • 表示层:进行数据加密、解密操作,压缩、解压缩。
  • 会话层:建立数据传输通道(会话)。
  • 传输层:确定传输方式(UDP、TCP),涉及端口号。
  • 网络层:实现数据路由、路径规划(路由器、IP),涉及传输方式(UDP、TCP)和端口号。
  • 数据链路层:将各层数据封装成帧,实现点对点通信(局域网内通信),进行差错检测(交换机、ARP)。
  • 物理层:定义物理设备标准、电器特性,涉及网线、光纤等传输介质。

TCP/IP模型

应用模型,有五层和四层两种划分方式。

五层划分
  • 应用层
    • HTTP:超文本传输协议。
    • HTTPS:超文本传输协议(SSL加密算法)。
    • FTP:文件传输协议(TCP)。
    • TFTP:简单文本传输协议(UDP)。
    • MQTT:消息队列遥测传输(物联网协议)。
    • DNS:域名解析服务(将域名转换为IP地址)。
  • 传输层
    • TCP:传输控制协议。
    • UDP:用户数据报协议。
  • 网络层
    • IP协议:包括IPv4和IPv6。
  • 数据链路层
    • ARP协议:地址解析协议。
  • 物理层
四层划分
  • 应用层
  • 传输层
  • 网络层
  • 网络接口层

4、IP协议

基本概念

IP协议位于网络层。

  • IPv4为32位,如192.168.1.128。
  • IPv6为128位。

IP地址的用户表示形式为点分十进制,如192.168.1.140;

计算机存储形式为32位二进制,如11000000 10101000 00000000 01000011。

组成与相关概念

  • IP地址组成:IP地址 = 网络位 + 主机位。
    • 例如192.168.0.121/24,其中24表示网络位的位数。
      • 网络位:标识该IP地址位于哪个网段(局域网)内。
      • 主机位:标识在这个网段(局域网)内的第几台主机。
  • 子网掩码:用于区分IP地址的网络位和主机位,搭配IP地址使用。
    • 子网掩码是1的部分对应IP地址的网络位,是0的部分对应IP地址的主机位。
    • 如255.255.255.0,其二进制形式为11111111.11111111.11111111.00000000。
  • 网段号:IP地址网络位不变,主机位全为0,则为该IP地址的网段号。
    • 例如,IP地址192.168.1.3,子网掩码255.255.0.0,其网段号为192.168.0.0,位于192.168.1.0网段内(网段内的IP能直接通信)。
  • 广播号:IP地址网络位不变,主机位全为1,则为该IP地址的广播号。
    • 向广播号发送信息,所有局域网内IP都能收到此信息。例如,IP地址192.168.1.3,子网掩码255.255.255.0,其广播号为192.168.1.255(如feiQ、VNC使用)。
  • 网关地址:如192.168.1.1。

IP地址划分

类别范围子网掩码用途私有IP地址范围
A类地址1.0.0.0 - 126.255.255.255255.0.0.0管理大规模网络10.0.0.0 - 10.255.255.255
127.0.0.0回环地址
B类地址128.0.0.0 - 191.255.255.255255.255.0.0管理大中规模网络172.16.0.0 - 172.31.255.255
C类地址192.0.0.0 - 223.255.255.255255.255.255.0管理中小规模网络192.168.0.0 - 192.168.255.255
D类地址224.0.0.0 - 239.255.255.255组播和广播使用
E类地址240.0.0.0 - 255.255.255.254用来进行实验
  • 公有IP:由电信公司直接分配,需要付费,可以直接访问internet。
  • 私有IP:不能直接访问internet的IP地址,目的是节省IP地址。

5、网络端口号

基本信息

        端口号是16位的整形数据(unsigned short),范围为0~65535,功能是标记同一主机的不同网络进程。

分类

  1. 1-1023之间的端口号:任何TCP/IP实现所提供的服务使用。如http:80,FTP:20/21,TFPT:69,HTTPS:443。
  2. 1024-49151:被注册的端口号,被IANA指定为特殊服务使用。如MQTT:1883/8883。
  3. 49152-65535:动态或私有端口号。

6、网络配置

  1. ping命令:ping ip地址/域名,用于查看当前主机和IP/域名所对应的主机网络是否联通。如ping www.baidu.com。
  2. 查看IP地址
    • 在Linux中使用        ifconfig。
    • 在Windows上使用      ipconfig。
  3. 网络配置步骤
    1. 虚拟机--》设置--》网络适配器---》桥接模式。
    2. 编辑--》虚拟网络编辑器--》更改设置--》VMnet0---》桥接至--》当前PC正在上网的网卡上--》应用--》确定。
    3. 修改网络配置文件:sudo vim /etc/network/interfaces,文件内容如下:
    auto lo  
    iface lo inet loopback  
    auto ens33   
    iface ens33 inet dhcp  
    
  4. 重启网络服务:sudo /etc/init.d/networking restart
  5. 测试:ping www.baidu.com

7、网络协议--UDP

基本概念

UDP(User Datagram Protocol)即传输层用户数据报协议。

网络编程模型

  • B/S模型(browser/server,浏览器/服务器):
    1. 客户端是通用的客户端(浏览器)。
    2. 一般只做服务器开发。
    3. 客户端要加载的数据均来自服务器。
  • C/S模型(client/server,客户端/服务端):
    1. 客户端是一个专用的客户端。
    2. 服务器和客户端都需开发。
    3. 客户端可以保存资源,本地加载,无需所有数据都请求服务器。

UDP编程

套接字

套接字是文件描述符,是网络通信时应用层可操作的端口。

相关函数
  1. socket函数

    #include <sys/types.h>          /* See NOTES */  
    #include <sys/socket.h>  
    int socket(int domain, int type, int protocol);  
    
    • 功能:创建通信的套接字。
    • 参数:
      • domain:网络层使用的协议族,AF_INET表示IPv4,AF_INET6表示IPv6。
      • type:规定传输层的协议,SOCK_DGRAM表示UDP协议,SOCK_STREAM表示TCP协议,SOCK_RAW表示原始套接字。
      • protocol:0按照默认协议方式创建。
    • 返回值:成功返回套接字,失败返回-1。
  2. sendto函数

    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:接收方的地址信息(IP+端口号)。
      • addrlen:接收方地址的大小。
    • 返回值:成功返回实际发送的字节数,失败返回-1。
  3. sockaddr_in结构体(man 7 ip)

    struct sockaddr_in 
    {  sa_family_t    sin_family; /* address family: AF_INET */  in_port_t      sin_port;   /* port in network byte order */  struct in_addr sin_addr;   /* internet address */  
    };  /* Internet address. */  
    struct in_addr 
    {  uint32_t       s_addr;     /* address in network byte order */  
    };  
    
  4. 字节序转换函数    

字节序转换

网络字节序(大端顺序)和主机字节序(小端顺序)在数据存储方式上存在差异。

网络字节序中,高位字节存储在低地址;主机字节序中,低位字节存储在低地址。

例如,数值$0x1234$:

  • 小端存储:低地址为$0x34$,高地址为$0x12$
  • 大端存储:低地址为$0x12$,高地址为$0x34$

标准库函数提供了字节序转换功能,具体声明如下:

uint32_t htonl(uint32_t hostlong);          // 主机转网络(32位)
uint16_t htons(uint16_t hostshort);         // 主机转网络(16位)
uint32_t ntohl(uint32_t netlong);           // 网络转主机(32位)
uint16_t ntohs(uint16_t netshort);          // 网络转主机(16位)
in_addr_t inet_addr(const char *cp);
功能:将字符串IP地址转换成二进制IP地址形式char *inet_ntoa(struct in_addr in);
功能:将二进制ip转换成字符串
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:绑定自己的IP地址和端口号
参数:sockfd:套接字addr:需要绑定的地址addrlen:地址大小
返回值:成功:0失败:-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
功能:从套接字上接收数据
参数:sockfd:套接字buf:存放接收数据的内存首地址len:希望接收的字节数flags:0 :按照默认方式接收(阻塞)src_addr:发送方的地址信息addrlen:发送发地址的指针
功能:成功:实际接收到的字节数失败:-1

8、代码训练

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> 
#include <arpa/inet.h>
#include<string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error");return -1;}// struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.179");// 创建子进程char buff[1024] = {0};while(1){fgets(buff, sizeof(buff), stdin);ssize_t cnt = sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&seraddr, sizeof(seraddr));if(cnt < 0){perror("sendto error");return -1;}printf("cnt = %ld\n", cnt);memset(buff, 0, sizeof(buff));}close(sockfd);return 0;
}
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error");return -1;}// 服务端自己的地址信息变量struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.177");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("bind error");ret -1;}char buff[1024] = {0};while(1){ssize_t cnt = recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);if(cnt < 0){perror("recvfrom error");return -1;}printf("cnt = %ld, buff = %s\n", cnt, buff);memset(buff, 0, sizeof(buff));}close(sockfd);return 0;
}

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

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

相关文章

Go语言在边缘计算中的网络编程实践:从入门到精通

一、引言 在数字化浪潮席卷全球的今天&#xff0c;边缘计算如同一股清流&#xff0c;正在重新定义我们对网络架构的理解。想象一下&#xff0c;当你在自动驾驶汽车中需要毫秒级响应&#xff0c;或者在偏远工厂中需要实时处理传感器数据时&#xff0c;传统的云计算模式就像是&qu…

ASPICE过程能力确定——度量框架

&#x1f697;【汽车人必看】ASPICE能力评估核心&#xff1a;度量框架全解析&#xff5c;90%工程师都搞不懂的评分规则&#xff01;&#x1f50d; 为什么你的ASPICE评估总卡在L2&#xff1f;——揭秘6大能力等级背后的评分逻辑&#xff0c;附提升秘籍&#xff01;&#x1f525;…

机器学习在量化中的应用

一、核心应用场景在因子研究中&#xff0c;scikit-learn 主要解决以下几类问题&#xff1a;因子预处理与标准化&#xff1a;StandardScaler, RobustScaler因子有效性分析&#xff1a;LinearRegression (IC分析)降维与因子合成&#xff1a;PCA, FactorAnalysis机器学习预测模型&…

RabbitMQ:消息转化器

目录一、基本概述二、如何处理一、基本概述 在RabbitMQ中&#xff0c;一般情况下传递字符串会被正常解析&#xff0c;如果传递的是一个Object类型或者是一个对象类型的时候&#xff0c;RabbitMQ会将其自动转化为字节码发送&#xff0c;这不利于我们的读取个解析。 二、如何处…

【Protues仿真】基于AT89C52单片机的LCD液晶显示屏显示控制

目录 1 LM016L液晶显示模块 1.1 基本参数 1.2 引脚定义 1.3硬件连接示例&#xff08;AT89C52&#xff09; 1.4 常用指令集&#xff08;HD44780 子集&#xff09; 1.5 常见问题与注意事项 1.8 结论 2 LM016L液晶显示模块控制电路原理图 3 LM016L液晶显示模块控制程序 …

孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站

你是不是也经常在抖音上刷到很火的伤感视频&#xff0c;那么伤感视频素材都在哪里可以下载呢&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就跟大家聊聊那些可以下载伤感素材高清无水印的网站&#xff0c;如果你也在苦苦找寻伤感素材&#xff0c;快来看看吧&#…

笔记本怎么才能更快散热?

一、“物理降温法”​▪️ 垫高高&#xff01;别让底部 “窒息”​笔记本底部全是进风口&#xff0c;放床上 / 沙发上会被堵住&#xff01;垫点东西拉开底部空间&#xff0c;高度 1-2cm。​▪️ 给风扇 “松绑”​按「CtrlShiftEsc」打开任务管理器&#xff0c;点 “进程”&…

电机驱动实现插补算法之脉冲和方向接收(以stm32主控为例)

一、方案 A&#xff08;推荐&#xff09;&#xff1a;编码器模式吃脉冲&#xff08;TI1 STEP&#xff0c;TI2 DIR&#xff09; 核心思路 把定时器设为 Encoder TI1 模式&#xff1a;每个 STEP 上升沿计一次&#xff0c;在那个沿的瞬间用 TI2&#xff08;DIR&#xff09;的电…

[特殊字符] 潜入深渊:探索 Linux 内核源码的奇幻之旅与生存指南

文章目录 朋友们&#xff0c;敲黑板&#xff01;&#xff01;&#xff01;&#xff08;超级重要&#xff09;我们今天聊点硬核的——不是普通的代码&#xff0c;而是驱动了整个数字世界心跳的Linux内核源代码&#xff01;它藏在哪&#xff1f;就在那个传奇仓库&#xff1a;torv…

如何监控和管理微服务之间的调用关系

监控和管理微服务之间的调用关系需要结合分布式追踪、服务依赖分析、实时监控和可视化工具&#xff0c;以实现对调用链路的可见性、问题定位和性能优化。以下是具体的实现方案和工具链&#xff1a;一、核心监控目标调用链路可视化&#xff1a;展示服务间的调用关系、方向和频率…

3.4 缩略词抽取

概述 缩略词指的是一个词或者短语的缩略形式&#xff0c;其通常由原词中的一些组成部分构成&#xff0c;同时保持原词的含义。缩略词的检测与抽取在方法上与同义词的检测与抽取类似&#xff0c;但是相比同义词&#xff0c;缩略词在文本中出现的规则往往更简单。 不同语言缩略词…

Lua脚本如何执行主程序的C函数

Lua Call C function Lua脚本可以和C函数灵活的结合&#xff0c;Lua脚本作为控制语言&#xff0c;使用C函数来做性能计算部分。 Lua脚本的执行器有Lua 和 Luajit。 使用Lua执行器&#xff0c;可以通过C语言注册C函数到Lua State, 然后Lua脚本可以调用该C函数。 使用Luajit&…

农业-学习记录

1-git上传&#xff08;简易版&#xff09;首先&#xff0c;记得vscode打开的项目路径是/home/Agribrain。不然会提示上传很多项目无关的文件。① 暂存所有更改②使用vscode终端注意&#xff1a;终端打开路径&#xff1a;/home/Agribrain/agribrain【git项目的所在目录】&#x…

什么是数据集成?数据集成对数据治理有什么影响

在大数据与人工智能驱动的时代&#xff0c;数据已经成为企业的“新型生产力”。然而&#xff0c;企业内部数据往往分散在不同系统、不同格式、甚至不同地域中。如果缺乏有效管理与整合&#xff0c;数据价值就无法真正释放。这时&#xff0c;“数据集成”应运而生&#xff0c;它…

技术成长战略是什么?

文章目录技术成长战略是什么&#xff1f;1. 前言2. 跟技术大牛学成长战略2.1 系统性能专家案例2.2 从开源到企业案例2.3 技术媒体大V案例2.4 案例小结3. 学习金字塔和刻意训练4. 战略思维的诞生5. 建议技术成长战略是什么&#xff1f; 1. 前言 在波波的微信技术交流群里头&am…

从0到1打造一台机器人走起来

聚焦仿人双足机器人,着重解决其下肢鲁棒行走中仿真到实机间隔(SimToReal gap)的误差问题 总述 硬件:采用傅利叶智能科技一体化关节模组: 1)胯部和膝关节选用 FSA80 - 29E 电机,以承受较大扭矩; 2)大腿部分采用 FSA60 - 43E 电机,兼顾扭矩和转速需求; 3)小腿选用 …

【Cmake】Cmake概览

目录 一.环境准备 1.1.Cmake安装 1.2. VSCodeCMake插件安装 1.3 快速样例-helloworld⼯程 二. cmake的基础命令⾏使用示例 2.1.文件准备 2.2.⽣成构建系统 2.3.编译连接 2.4.测试Ctest模块 2.5.测试安装模块 2.6.测试打包模块 2.7 查看帮助 CMake语法简洁清晰&…

概率核心概念学习笔记:随机事件与样本空间、古典概率与条件概率、全概率公式与贝叶斯公式

目录 一、 随机事件与样本空间 1. 原理讲解 2. 类型与关系 3. 案例计算 4. 应用场景 二、 古典概率与条件概率 1. 古典概率 (Classical Probability) 2. 条件概率 (Conditional Probability) 三、 全概率公式与贝叶斯公式 1. 全概率公式 (Law of Total Probability) …

优考试局域网系统V6.0.0版

优考试局域网系统迎来V6.0.0版本更新&#xff0c;核心在于提升功能性能与优化操作体验。重点对学情分析、移动端考试支持、考试监控和答题体验等方面进行了实用性更新&#xff0c;进一步提升了局域网环境下考试系统的灵活性与管理效率。 一、增加学情分析功能&#xff0c;教学…

Autosar之Com模块

Com模块主要实现了Signal在I-PDU中的封装及解析功能,为RTE层提供了基于Signal的发送与接收接口,实现了基于Signal的网关功能,实现了PDU的不同发送模式,以及Signal滤波,Update bit,Pdu Counter等功能 图 Com模块层次图 Com模块处于AUTOSAR架构中的通信服务层,其下层模块…