C++网络编程基础

文章目录

    • 协议
    • 局域网通信
    • IP 地址
    • 网络通信的本质
    • tcp 和 udp 协议
    • 网络字节序
    • 网络主机数据转化接口

协议

在这里插入图片描述
协议:收到数据后,多出来的那一部分,也叫一种 “约定”,一整套的自硬件到软件,都有协议,需要有人定制,也需要有人实现

当通信距离边长后,如何保证将数据交给下一跳主机,如何定位目标主机,如何处理报文出错,如何使用送达的数据等问题,都需要对应的协议

网络的层协议:和软件的层状结构一样,实现了各个部分代码的解耦,更容易维护,只需要考虑各个子问题即可。

![[Pasted image 20240603094511.png]]

网络协议一般叫:TCP/IP 协议,是在内核中实现的
网络编程:用户在操作系统的用户层使用系统调用,来实现网络层的功能
网络库:对网络层的系统调用进行封装,简化开发流程

任何操作系统都必须基于 OSI 标准实现网络协议栈,所以在不同的系统中,网络调用接口大同小异

报头使用C语言描述的结构体,client 和 server 之间是,都是可以识别这个报头的,因为client 和 server 描述报头的源代码都是一样的。

局域网通信

局域网通信:在同一个局域网中,两台主机是可以直接通信的,(局域网中建房间,玩游戏)
原理:两台主机在局域网中通信,局域网中所有主机都能收到消息,只不过通过 Mac 地址(网卡地址)来区分谁接受,其他不接收的主机会选择将消息直接丢弃掉
但有可能同一时刻,局域网中由多台主机在同时发消息,就可能会形成数据碰撞(丢包),那么发送方主机就会执行碰撞避免算法(休息一会再重发)

ifconfig:可查 Linux 主机的 Mac 地址(Mac只在局域网内部有效)

要正确的发送消息,再同一时刻,只允许一台主机在局域网中发消息,因此,局域网中的设备少,越安全,局域网中消息是否能发送成功是基于概率的,因此也叫 以太网(例如运动会操场上,消息发不出去一直丢包,就是因为几千人都访问的是附近同一个基站,而当操场上只有几个人的时候,消息特别流畅)

用系统的观点:局域网就是一个临界资源,主机在局域网出往另一台主机发送消息就是访问临界区代码,碰撞检测和碰撞避免、重发就是完成互斥访问,维护临界资源,单独发送,就是独占网络资源

用户之间通信时,消息在双方两台主机上,都要贯穿协议栈(软件->硬件 ——> 硬件->软件)

在这里插入图片描述

封装报头:在自己拿到的报文的基础上,添加同层协议的报头
每层协议都会封装自己对应的报头,也要考虑如何将收到的报文中,报头和有效载荷进行分离,如何将自己的有效载荷,交给上层的协议。

IP 地址

Linux 查看 ip 地址:ifconfig

在这里插入图片描述

windows 查看 ip 地址:ipconfig

在这里插入图片描述

整个ip 地址的范围:[0,255].[0,255].[0,255].[0,255] ,也叫点分十进制

在语言视角,这种点分十进制的 ip 地址,C++种可以使用字符串来表示

IP 地址分为公网ip内网ip,两个 ip 地址加起来,才是所有的 ip 地址,一般在 Linux 或 windows 上直接见到或查到的 ip 地址,都是内网ip,但如果要使自己的服务被别人看到,就要使这个服务或对用的服务器具备公网ip

一般来说,ip地址表示公网 ip,用来表示互联网种唯一的一台主机,也可以表示局域网种唯一的一台主机
实际网络通信时只需要4个字节即可表示一个网络 ip,8* 4 = 32,32个比特位就能表示任意一个网络 ip,占用的字节数较少

那么如何将整形存储的ip地址转化为便以阅读的点分十进制这种字符串风格的ip地址呢?
在这里插入图片描述

ip地址Mac地址 的区别:

ip 地址是永远不变的,在互联网中唯一,而 Mac地址是在局域网中不变的,但出了局域网后会变

Mac 地址意义:标识主机唯一性,用于局域网通信
IP 地址意义:帮助用于路径选择,目标ip

![[Pasted image 20240603163120.png]]

同层协议要发的,就是同层协议要收的!!

在 ip 层往下,报头在变,而ip层往上是一样的,因此也叫网咯ip地址
相当于在全球所有主机层面上,搭建了一层软件层,通过ip地址,就可以屏蔽底层所有局域网通信的网络差异了

网络通信的示意图:

在这里插入图片描述

网络通信的本质

网络之间的通信,本质上就是进程间通信

对双方主机的两个进程而言,需要先将数据发送到对方的主机(ip地址),再找到指定的进程(port:端口号),就能实现通信

ip地址用来标识互联网中唯一的一台主机;port端口号用来标识该指定机器中进程的唯一性

那么(ip, port) 则可以用来表示互联网中唯一一个进程,ip + port 也叫网络套接字 socket

如何理解port:
一个端口号和一个进程相绑定,一个进程可以绑定多个端口号,反之则不可以。
那么为什么不用进程pid来表示网络中进程的唯一性呢?
为了其他的进程模块和网络进行解耦(万一pid的规则变化,网络部分也不受影响),port是专门用于网络通信的

tcp 和 udp 协议

tcp 协议常用于可靠通信,适用于对数据要求比较高的场景(如游戏,传输重要文件等),复杂
udp 协议用于不可靠通信,适用于允许数据偶尔出现差错的场景(如体育赛事直播等),简单,快

这两个协议没有好坏之分,只是应用场景不同,如果不确定使用哪个的时候,就要 tcp,毕竟复杂一点比丢包好

网络字节序

机器有大小端之分,大小端机器存储数据方式不同。大端是“正着存储”的,可读性较好,因此在网络传输时规定,所以到达网络的数据,必须时大端存储的,因此,如果是小端机,收发数据到网络时需要先转化为大端

网络主机数据转化接口

ip 地址为4个字节,使用 uint32_t,port 为2个字节,使用 uint_16

htonl、htons 是转网络,ntohl、ntohs 是转主机数据,使用这些接口可以自动识别机器的大小端,并将数据转化为需要的大小端数据。

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uintl6_t ntohs(uint16_t netshort);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对象存储OSS 客户端签名直传的安全风险和解决方法

1. 前言 阿里云对象存储OSS&#xff08;Object Storage Service&#xff09;是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;可提供99.9999999999%&#xff08;12个9&#xff09;的数据持久性&#xff0c;99.995%的数据可用性。多种存储类型供选择&#xff0c;全面…

探索国内大模型AIGC产品

​ 人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗…

在win11系统上安装启动Hyper-V

Hyper-V 是微软公司开发的一种虚拟化技术&#xff0c;它允许一台物理计算机运行多个操作系统和应用程序&#xff0c;从而提供更好的资源利用率和系统灵活性。 win系统的linux子系统开启、android studio的虚拟环境都需要这个东西&#xff0c;而在初始的win11系统上可能没有这个…

Python | Leetcode Python题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val x # self.next Noneclass Solution(object):def detectCycle(self, head):""":type head: ListNode:…

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

【数据结构与算法】使用数组实现栈:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;栈&#xff08;Stack&#xff09;是什么&#xff1f; &#x1…

鸿蒙开发 之 数据持久化

1.用户首选项 用户首选项&#xff08;Preference&#xff09;为应用提供key-value键值型的数据处理能力&#xff0c;支持应对持久化轻量级数据&#xff0c;比如小说app的字体设置背景等 1.1案例 1.index.ets import RouterInfo from ../viewmodel/RouterInfo import IndexFo…

Redis Key过期监听配置

默认情况下在Windows系统中双击redis-server.exe用的是内置的配置文件 如果希望用这两个配置文件 redis.windows.conf&#xff1a;这是用于在Windows上运行Redis服务器的标准配置文件。可以使用这个文件通过命令行启动Redis服务器。redis.windows-service.conf&#xff1a;这是…

【全开源】房屋出租出售预约系统(FastAdmin+ThinkPHP+Uniapp)

房屋出租出售预约系统&#xff1a;一站式解决房产交易难题 一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统&#xff0c;支持小程序、H5、APP&#xff0c;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找…

翻译《The Old New Thing》- Why do messages posted by PostThreadMessage disappear?

Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p16553 Raymond Chen 2008年09月30日 为什么 PostThreadMessage 发布的信息会消失&#xff1f; 在显示用户界面的线…

Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录 一、简介二、SSL 证书类型介绍三、公网 SSL 证书3.1 证书管理工具3.2 下载安装 acme.sh3.3 申请并下载证书报错1&#xff1a;没有指定账号报错2&#xff1a;DNS无法解析的域名报错3&#xff1a;无效的响应 404 3.4 配置 Nginx3.5 证书过期刷新 四、补充4.1 同一域名的不同…

软件心学格物致知篇(7)软件开发文档写什么

软件心学格物致知篇(7)软件开发文档写什么 前言 当今约束大家生产力的有哪些因素&#xff1f;是编程语言&#xff1f;开发框架&#xff1f;开发IDE&#xff1f;还是自身迫切需要更高水平的技能&#xff1f; 好像上面的每一项技术都在不断发展&#xff0c;也在不断的为我们生…

从零开始搭建Electron项目之运行例程

最好的学习方式就是&#xff1a;给一段能够运行的代码示例。 本文给出了例程资源&#xff0c;以及运行的步骤。 在国内开发electron有一点特别不好&#xff0c;就是如果不爬梯子&#xff0c;下载依赖容易出错。 一、例程资源 到如下路径下载例程到本地。 GitCode - 全球开发者…

基于pytorch_lightning测试resnet18不同激活方式在CIFAR10数据集上的精度

基于pytorch_lightning测试resnet18不同激活方式在CIFAR10数据集上的精度 一.曲线1.train_acc2.val_acc3.train_loss4.lr 二.代码 本文介绍了如何基于pytorch_lightning测试resnet18不同激活方式在CIFAR10数据集上的精度 特别说明: 1.NoActive:没有任何激活函数 2.SparseActiva…

机器学习--线性模型和非线性模型的区别?哪些模型是线性模型,哪些模型是非线性模型?

文章目录 引言线性模型和非线性模型的区别线性模型非线性模型 总结线性模型非线性模型 引言 在机器学习和统计学领域&#xff0c;模型的选择直接影响到预测的准确性和计算的效率。根据输入特征与输出变量之间关系的复杂程度&#xff0c;模型可以分为线性模型和非线性模型。线性…

C语言 | Leetcode C语言题解之第142题环形链表II

题目&#xff1a; 题解&#xff1a; struct ListNode* detectCycle(struct ListNode* head) {struct ListNode *slow head, *fast head;while (fast ! NULL) {slow slow->next;if (fast->next NULL) {return NULL;}fast fast->next->next;if (fast slow) {s…

Linux网络命令——tcpdump

tcpdump是Linux下的一个网络数据采集分析工具&#xff0c;也就是常说的抓包工具 tcpdump 核心参数 tcpdump [option] [proto] [dir] [type] 例如&#xff1a;$ tcpdump -i eth0 -nn -s0 -v port 80 option 可选参数&#xff1a; -i : 选择要捕获的接口&#xff0c;通常是以太…

插卡式仪器模块:音频分析模块(插卡式)

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟音频信号的输入/输出 应用场景 • 音频信号分析&#xff1a;幅值、频率、信噪比、THD、THDN 等指标 • 模拟音频测试&#xff1a;耳机、麦克风、扬声器测试&#xff0c;串扰测 音频分析仪 输入阻抗10 TΩ10 TΩ输入范围3…

【C语言】宏详解(下卷)

前言 紧接上卷&#xff0c;我们继续来了解宏。 宏替换的规则 1.在调用宏时&#xff0c;首先对参数进行检查&#xff0c;看看是否包含任何由#define定义的符号。如果是&#xff0c;它们首先被替换。 2.替换文本随后被插入到程序中原来文本的位置。对于宏&#xff0c;参数名被他…

C++类与对象(拷贝与类的内存管理)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.对象的动态建立和释放二.多个对象的构造和析构三.深拷贝与浅拷贝四.C类的内存管理总结 前言 …