当前位置: 首页 > news >正文

网络编程(基本概念)

一、网络编程的概念

1、网络编程的介质

1)套接字

以 IO 操作为例:

标准 IO 使用的是 FILE* 文件指针(流指针)文件 IO 使用的是 int 类型文件描述符

网络通信使用的是int类型的套接字,套接字属于文件描述符的一种

2)套接字在编程层面的工作方式:

套接字内部要求写两个数据:ip 和 port

ip:用来表示一台主机在互联网上的具体地址,常用格式就是"192.168.XXX.XXX"

port:端口号,用来表示在主机中的指定进程

首先通过ip地址锁定一台主机的位置,再通过 port 确定网络数据到底是发送哪个进程

2、网络通信的7层模型

网络7层模型,是一个理论上的标准7层模型,叫做OSI标准7层模型,
他是一个理论模型,没有任何协议实现

1)应用层

应用层是用户操作网络的直接接口

用户在操作系统里,调用的的网络函数,都属于应用层

2)表示层

表示层的作用是对数据压缩、加密、翻译;
并在数据前端写入发送端的ip+port以及接收端的ip+port。

压缩是为了确保数据包的体积最小,翻译是为了确保不同操作系统之间也能正常通信。

3)会话层

会话层的作用是建立、维护、终止数据传输的过程(建立、终止就是发送起始信号和结束信号)

维护是指维护数据传输:记录数据传了多少了,传到哪一部分了,万一中断,可以继续传输

4)传输层

传输层的作用是选择使用什么协议进行数据传输,实现从"端"到"端"的传输

常用的协议由TCP协议和UDP协议两种:

TCP协议:有流量控制、速率控制、顺序控制、重传控制 等等校验控制手段,
                  确保数据的完整性和高效性。

UDP协议:没有任何校验及控制手段,只确保高效的传输,不保证数据包的完整性,正确性
                  虽然协议本身没有校验手段,但是后期各大厂商加上了自己的校验手段。

5)网络层

网络层的作用相当于数据集散中心,负责实现不同网络之间的数据交流工作,并且选择最佳的数据路由路径,以及最佳的发送方式

6)数据链路层

将所有数据打包成帧,并且在每一帧的头部,标记上数据发送方的MAC地址

mac地址:是网络设备生产商,在设备出厂时,为设备绑定的身份识别编号,唯一且不可修改

7)物理链路层

用于确定一些物理层面的协议

比如像 TTL协议、串口协议等等,需遵循协议,才能保证正常的通信

8)根据流程图理解上述7层模型

每一层都是在上一层提供的基础上,在数据的头部添加新的数据,再提供给下一层

这样就不用关心上一层做了什么,不论上一层是否改动,只要格式不变,就对下一层没有影响

并且如果发生错误,只要知道是哪个数据错了,就知道是哪一层错了,可以快速的进行debug工作

 9)其他模型

在工业生产上,使用的是 TPC/IP 4层模型,是在OSI标准7层模型的基础上总结优化出来的,
是标准的工业模型

3、ip 地址

目前主要使用ip地址,分为两种:ipv4 和 ipv6(两者并不兼容)

两者的唯一区别:大小不同

ipv4:4字节 32位

ipv6:16字节 128位

4、ipv4的表示方式及分类

1)点分十进制

ipv4是一个4字节的整数,我们一般常见的格式是"192.168.1.1"

"192.168.1.1"这种格式是便于我们记忆的,我们称为 点分十进制

 因此"192.168.1.1"地址的真实数据为:16,885,952,转为二进制如下图

大端存储:

小端存储: 

具体是大端存储还是小端存储得看计算机

2)ipv4类地址的分类

ipv4分为 A、B、C、D、E 五类

不同类别的ip地址,每个字节所表示的意义是不同的

ip地址由 网络号主机号 组成

网络号:决定了这是一个什么网络,在什么地区

主机号:决定了主机在网络号中的位置

1. A类地址:1字节网络号 + 3字节主机号

以 0 开头的所有地址都是 A类地址

A类地址的取值范围是:0.0.0.0 ~ 127.255.255.255

A类地址通常是一个公网地址,一般运营商基站,各种大型服务器,都是公网地址

2. B类地址:2字节网络号 + 2字节主机号

以 10 开头的所有地址都是 B类地址

B类地址的取值范围是:128.0.0.0 ~ 191.255.255.255

B类地址一般是组织用网络,比如校园网

3. C类地址:3字节网络号 + 1字节主机号

以 110 开头的所有地址,都是 C类地址

C类地址的取值范围是:192.0.0.0 ~ 223.255.255.255

C类ip地址通常是局域网地址,比如家庭中、公司部门中的各种设备地址

4. D类地址:4字节网络号 无主机号

以 1110 开头的所有地址,都是 D类地址

D类地址的取值范围是:224.0.0.0 ~ 239.255.255.255

D类地址,通常是一个局域网中的组播地址

组播:向一个网络组播ip地址发送消息,只要加入了该组播的设备,都会收到消息

5. E类地址:4字节网络号 无主机号

以 1111 开头的所有地址,都是 E类地址

E类地址的取值范围是:240.0.0.0 ~ 255.255.255.255

3)2种特殊的ip地址

ip地址由网络号和主机号组成

主机号的第一个号码是当前网络号的网段号,以及最后一个号码是当前网络的广播号

以 192.168.1.1 为例,是一个C类地址:

其中 192.168.1 是网络号,在这个网络号中,

第一个号码192.168.1.0是192.168.1这个网络号的网段号
表明从192.168.1.1 ~ 192.168.1.254这254个号码,都隶属于192.168.1.0这个网段

最后一个号码 192.168.1.255是 192.168.1.0 这个网段的广播号
只要向192.168.1.255这个地址写人数据,那么192.168.1.0这个网段中所有设备,都会收到消息

注意:这两个特殊号码是每个网段的第一个号码和最后一个号码,而不是.0 和 .255
           网段可以用子网掩码划分。

5、子网掩码

子网掩码的作用或目的就是:让一个大的网段,划分成多个更细致的子网段

是为了更加具有针对性的,对某个群体进行消息广播,而洽谈群体不会收到该消息。

如果让不该收到消息的群体收到了消息,我们称为"广播风暴"

1)子网掩码格式:

子网掩码的格式需要和ip地址的类型保持一致;
比如A类ip地址的子网掩码就是 1个网络号和 3个主机号;
比如C类ip地址的子网掩码就是 3个网络号和 1给主机号。

子网掩码必须保证 1 在左侧连续,0 在右侧连续。

255.255.255.254 1111 1111 1111 1111 1111 1111 1111 1110 合法的
255.255.255.11111 1111 1111 1111 1111 1111 0000 0001 由于1没有全都集中在左边,所以不合法
255.255.255.01111 1111 1111 1111 1111 1111 0000 0000 合法的
255.255.255.1921111 1111 1111 1111 1111 1111 1100 0000 合法的
255.255.255.1601111 1111 1111 1111 1111 1111 1010 0000 不合法

2)子网掩码的工作方式:

子网段号 = ip地址 & 子网掩码

以子网掩码为 255.255.255.0 为例

255.255.255.0
192.168.1.1 ~ 2541111 1111 1111 1111 1111 1111 0000 0000
&   1100 0000 1010 1000 0000 0001 0000 0001
=   1100 0000 1010 1000 0000 0001 0000 0000 -> 192.168.1.0我们观察发现1111 1111 1111 1111 1111 1111 0000 0000
&   1100 0000 1010 1000 0000 0001 1111 1110 一直到 192.168.1.254
结果都是 192.168.1.0所以结论就是:255.255.255.0 只能将 192.168.1.1 ~ 254 这个网段,划分出 1 个子网网段子网网段号就是 192.168.1.0,子网广播号就是 192.168.1.255

以子网掩码为 255.255.255.128 为例 

255.255.255.128
192.168.1.1 ~ 2541111 1111 1111 1111 1111 1111 1000 0000
&   1100 0000 1010 1000 0000 0001 0000 0001    192.168.1.1
=   1100 0000 1010 1000 0000 0001 0000 0000    192.168.1.0观察发现1111 1111 1111 1111 1111 1111 1000 0000
&   1100 0000 1010 1000 0000 0001 1000 0000    主机号编程128之后,结果就变了
=   1100 0000 1010 1000 0000 0001 1000 0000    192.168.1.128结论:255.255.255.128 能够将 192.168.1.1 ~ 254(网段号为 192.168.1.0)划分成2个子网网段子网网段号 192.168.1.0 和 192.168.1.128子网广播号 192.168.1.127 和 192.168.1.255

以子网掩码为 255.255.255.192为例

255.255.255.192
192.168.1.1 ~ 2541111 1111 1111 1111 1111 1111 1100 0000
&   1100 0000 1010 1000 0000 0001 0000 0001    192.168.1.1
=   1100 0000 1010 1000 0000 0001 0000 0000    192.168.1.0观察发现 ,主机号自增到 64 的时候,结果就不一样了1111 1111 1111 1111 1111 1111 1100 0000
&   1100 0000 1010 1000 0000 0001 0100 0000    192.168.1.64
=   1100 0000 1010 1000 0000 0001 1000 0000    192.168.1.64主机号继续自增,自增到 128 的时候,结果又不一样了1111 1111 1111 1111 1111 1111 1100 0000
&   1100 0000 1010 1000 0000 0001 1000 0001    192.168.1.128
=   1100 0000 1010 1000 0000 0001 1000 0000    192.168.1.128主机号继续自增,自增到192的时候,结果再次不一样1111 1111 1111 1111 1111 1111 1100 0000
&   1100 0000 1010 1000 0000 0001 1100 0000    192.168.1.192
=   1100 0000 1010 1000 0000 0001 1100 0000    192.168.1.192结论:255.255.255.192 能够将 192.168.1.1 ~ 254(网段号为 192.168.1.0)划分成4个子网网段子网网段号:192.168.1.0、192.168.1.64、192.168.1.128、192.168.1.192子网广播号:192.168.1.63、192.168.1.127、192.168.1.191、192.168.1.255

        总结:一个子网掩码,能够将一个网段,划分成多少个子网网段,取决于子网掩码主机号中1的数量,如果主机号中有n个1,则可以划分出 2^n 个子网网段

6、DNS域名系统

由于点分十进制无法将组织名,组织性质等等结合进去,所以为例解决组织含义和ip地址结合性的问题,发明了域名系统,域名系统会管理组织网站的名称和其真实的ip地址,因此我们只需要输入组织网站名称、域名系统、及可以自动寻找该组织网站的ip地址并跳转

        例如,我们输入 ping www.baidu.com,本质是在测试和这个网站之间的延迟 ping值,实际上是要我们如这个网站的ip的,测试的是与这个ip地址之间的ping值

        但是, 为什么我们输入 www.baidu.com 是 ok的呢? 就是因为这个DNS域名系统,我们给出 www.baidu.com ,域名系统就会将这个地址翻译成一个具体的ip地址,并跳转

微软默认 域名系统地址是 : 8.8.8.8,备用地址是 8.8.4.4

1)域名系统架构

分为一级到四级四个部分

1. 一级域名

        用来表示所属国家,例如 .cn 就表示属于中国

2. 二级域名

        用来表示该组织的性质

        .com 表示公司        .gov 表示政府部门        edu:表示教育部门        mil:表示军队部门

3. 三级域名

        用来表示 组织名称本身

4. 四级域名

        万维网的简称

7、网络字节序

1)为什么要转换字节序

short、int、long 等整型数据存在字节序问题(大端字节序,小端字节序)

网络通讯里,字节序是固定的,统一为大端字节序,所以我们在使用的时候要统一转换为大端

2)字节序转换函数

在下列四个函数中,每个字母的含义是一致的h: 表示本地字节序(localhost)
to:表示转换
n: 表示网络字节序(inet)
l: 表示数据类型 long
s: 表示数据类型 shortuint32_t 就表示 unsigned int 类型u 表示 unsigned , int 就是int , 32_t 表示 32位(4字节) , 16_t 表示 16位 (2字节)
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint32_t ntohl(uint32_t netlong);功能:  将本地字节序转换为long类型网络字节序
参数:  需要转换字节序的uint32_t类型的参数
返回值:返回转换好字节序的uint32_t类型的参数
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
uint16_t ntohs(uint16_t netshort);功能:  将本地字节序转换为short类型网络字节序
参数:  需要转换字节序的uint16_t类型的参数
返回值:返回转换好字节序的uint16_t类型的参数

8、ip地址转换函数

1. inet_addr | inet_ntoa(不常用)
in_addr_t inet_addr(const char *cp);
功能:将 "点分十进制" ip地址转换成 unsigned int 类型的ip地址(不支持ipv6类型的转换)
参数:请写 "192.168.XXX.XXX" 这样格式的地址,注意是字符串
返回值:转换后的ip地址虽然返回值类型是 in_addr_t ,但是查找后发现,这个数据类型,就是 unsigned int
char *inet_ntoa(struct in_addr in);功能:将 unsigned int 类型的ip地址,转换成 "点分十进制"类型的ip
参数:是一个结构体:struct in_addr这个结构体里面就一个数据:uint32_t 类型的 ip地址typedef uint32_t in_addr_t;struct in_addr {in_addr_t s_addr; // 其实就是 unsigned int};返回值:返回一个 "点分十进制"类型的ip,数据类型为字符串类型

2. inet_pton(ip地址点分十进制转换成整数型或字符串型)
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
功能:将ip地址从点分十进制转为unsigend int型十进制数
参数 af:如果转换的是 ipv4,填 AF_INET如果转换的是 ipv6,填 AF_INET6
参数 src:填想要转换的 char* (字符串)类型的 ip地址
参数 dst:用来存储转换后的ip地址如果转换的是 ipv4,传入struct in_addr 结构体变量的地址如果转换的是 ipv6,传入struct in6_addr 结构体变量的地址struct in_addr 结构体内仅有 uint32_t 类型的变量
struct in6_addr 结构体内仅有 uint8_t [16] 类型的参数 占16字节 
 3. inet_ntop(ip地址整数型或字符串型转换成点分十进制)
#include <arpa/inet.h>
const char *inet_ntop(int af,const void *src,char *dst,socklen_t size);
功能:将uint32_t / uint128_t 类型的 ip地址转回 字符串类型(点分十进制)
参数 af:如果想转换 ipv4的地址,该参数填写 AF_INET如果想转换 ipv6的地址,该参数填写 AF_INET6
参数 src:填想要转换的 ip地址的变量地址如果想转换 ipv4的地址,需传入 struct in_addr 结构体变量地址如果想转换 ipv6的地址,需传入 struct in6_addr 结构体变量的地址
参数 dst:用来接收转换后的ip地址如果转换的是 ipv4,传入struct in_addr 结构体变量的地址如果转换的是 ipv6,传入struct in6_addr 结构体变量的地址
返回值:成功返回 dst 的地址,失败返回 NU:LL

 9、关于端口号 port

port是用来确定,数据发送给哪个进程的,port端口号在内核中是以 unsigned short 类型存储的

所以 port 的取值范围是 0 ~ 65535

其中 0 ~ 1023 是一些关键进程固定使用的端口号,
以及比较有名的ssh远程连接服务的端口号2222
mysql数据库的端口号3306,这些都要避免使用
 

http://www.lryc.cn/news/585709.html

相关文章:

  • 【C++篇】二叉树进阶(上篇):二叉搜索树
  • TCP详解——流量控制、滑动窗口
  • mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
  • 【JMeter】调试方法
  • 论容器化 | 分析Go和Rust做医疗的后端服务
  • Express实现定时任务
  • 飞算科技正在撬动各行业数字化转型的深层变革
  • ch06 部分题目思路
  • OpenCV实现感知哈希(Perceptual Hash)算法的类cv::img_hash::PHash
  • 深入探究编程拷贝
  • 基于Java Spring Boot开发的旅游景区智能管理系统 计算机毕业设计源码32487
  • 4万亿英伟达,凭什么?
  • 【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2(清华源)
  • PandaCoder重大产品更新-引入Jenkinsfile文件支持
  • mysql的LIMIT 用法
  • 【AI大模型】超越RAG的搜索革命!分层框架让AI像专家团队一样深度思考
  • Java教程:JavaWeb ---MySQL高级
  • 隆重介绍 Xget for Chrome:您的终极下载加速器
  • linux kernel struct regmap_config结构详解
  • 【Quest开发】快速添加可手指触摸按钮
  • 3 OneNET-调试器模拟上报数据
  • Visual Studio Code 的 settings.json 配置指南
  • HarmonyOS NEXT端云一体化开发初体验
  • 世俱杯直播数据源通过反汇编获取到
  • gradle中namespace和applicationId的区别
  • Ubuntu20.04运行openmvg和openmvs实现三维重建(未成功,仅供参考)
  • 【酶解法】小鼠脾脏单细胞悬液的制备指南
  • 云网络产品
  • 7.11文件和异常
  • linux中cmake编译项目