学习记录——day29 网络编程

news2024/11/10 11:10:49

目录

一、网络编程引入

1.1、IPC通信方式

1)内核提供:    无名管道     有名管道      信号

2)system V:     消息队列       共享内存       信号量集

1.2、网络通信使用缘由

二、网络发展阶段

 2.1 APRAnet阶段

2.2 TCP/IP两个协议阶段

2.3 网络体系结构及OSI开放系统系统互联模型

 2.3.1 网络体系结构概念

2.3.2 OSI开放系统互联模型

2.3.3  TCP/IP协议族(簇)的体系结构

​编辑 2.3.4 数据封包和拆包的过程

 2.3.5 TCP/IP四层结构中常见的协议

 三、TCP和UDP的异同

TCP ----> 稳定

UDP ----> 快速

 

四、网络编程基础相关的概念

4.1 字节序

1、不同主机在存储多字节整数时(short、int、long),由于cpu架构的不同,存储方式也不同,大致分为两类

2、验证方式:使用指针、共用体

3、手动将小端存储的数据转换成大端存储的数据

4、多主机信息传递中的大小端问题

         由于主机架构的不同,当一个小端存储的数据发送一个多字节整数时,是没办法确定对方是大端存储还是小端存储的,这样就导致,即使数据无误,传输无误,也会因为存储方式的不同,而导致数据的错误

5、主机字节序和网络字节序的相互转换函数  主机:host  网络:network   转换:to

6、 何时使用字节序转换函数

五、ip地址

5.1 ip地址的相关概念

5.2 ip地址的分类

5.3 ip地址的分类:ip地址一共分为五类:A、B、C、D、E类网络

5.4 一个局域网下的特殊的IP地址

5.5 点分十进制


一、网络编程引入

1.1、IPC通信方式

1)内核提供:    无名管道     有名管道      信号

学习记录——day26 进程间的通信 有名管道 无名管道 信号通信 特殊的信号处理-CSDN博客

2)system V:     消息队列       共享内存       信号量集

学习记录——day27 进程间通信 IPC通信机制 消息队列 共享内存-CSDN博客

学习记录——day28 信号量集-CSDN博客

1.2、网络通信使用缘由

          以上通信方式,只能完成同一主机之间的多个进程间的通信,不能实现跨主机的多个进程间通信时,为实现跨主机的通信,引入了网络通信——基于套接字socket的通信方式,能够实现主机之间的多个进程间通信和跨主机的多个进程间的通信。

        任何一种通信都需要一个通信载体:管道文件需要使用管道文件进行数据缓冲;消息队列、共享内存、信号量集需要使用IPC对象进行数据的缓冲;网络通信提供套接字文件实现数据的缓冲。

二、网络发展阶段

        APRAnet阶段---冷战产物

        TCP/IP协议阶段--只有TCP和IP两个协议

        osi开放系统互联模型

        TCP/IP协议族

 2.1 APRAnet阶段

        阿帕网,是Inteme的最早维形

        不能互联不同类型的计算机和不同类型的操作系统

        没有纠错功能

2.2 TCP/IP两个协议阶段

        在计算机网络中,要做到有条不紊的交换数据,需要道循一些事先约定好的规则。这些规则明确规定了所交换的数据的格式以及有关的同步问题。为了进行网络中的数据交换而建立的规则、
标准和约定
称为网络协议

2.3 网络体系结构及OSI开放系统系统互联模型

 2.3.1 网络体系结构概念

        每一层都有自己独立的功能,单每一层都不可获取

        通常把功能相近的协议组织在一起放在一层,协议栈。所以每一层中其实有多个协议

        分层的意义:

        1、各层之间独立,每一层不需要知道下一层如何实现,而仅仅只需要知道该层通过层间的接口所提供的服务

        2、稳定,灵活性好,当任何一层发生变化时,只需要层间接口关系保持不变,而这层以上或以下层不受影响

        3、易于实现和维护(知道是什么功能,就到指定层去查找) 

        4、促进标准化工作:每一层的功能及其所提供的服务都有了精确的说明。

        5、结构上不可分割开:各层都可以采用最合适的技术来实现

2.3.2 OSI开放系统互联模型

        OSI是由ISO(国际标准化组织)提出的一个理想化模型

  注:在描述时,需至上而下或至下而上,顺序不能更改

2.3.3  TCP/IP协议族(簇)的体系结构

        TCP/IP协议簇是Internet事实上的工业标准

        TCP/IP网络体系结构四层:
        应用层
        传输层
        网络层
        链路层(网络接口和物理层)

虽然TCP/IP体系结构只有四层,但实现的功能和OSI的七层是一样的。

 TCP/IP四层结构 和 OSI开放系统互联模型七层 的对应关系:

 2.3.4 数据封包和拆包的过程

 

 

 一帧数据的说明:

         大小为 64--1518(包含以太网的头部14字节、尾部4字节)

        如果数据大于MTU(最大传输单元,linux默认是1500),需要分成多次进行传输可以使用指令ifconfig

        查看MTU最大传输单元

 2.3.5 TCP/IP四层结构中常见的协议

应用层:
        HTTP(Hypertext Transfer Protocol)        超文本传输协议

                万维网的数据通信的基础

        FTP(File Transfer Protocol)        文件传输协议
                是用于在网络上进行文件传输的一套标准协议,使用TCP传输

        TFTP(Trivial File Transfer Protocol)        简单文件传输协议

                是用于在网络上进行文件传输的一套标准协议,使用UDP传输

        SMTP(Simple Mail Transfer Protocol)        简单邮件传输协议

                一种提供可靠且有效的电子邮件传输的协议

 传输层:
        TCP(Transport Control Protocol)        传输控制协议

                是一种面向连接的、可靠的、基于字节流的传输层通信协议

        UDP(User Datagram Protocol)        用户数据报协议
                是一种无连接、不可靠、快速传输的传输层通信协议

 网络层:
        IP(Internetworking Protocol)        网际互连协议
                是指能够在多个不同网络间实现信息传输的协议

        ICMP(Internet Control Message Protocol)         互联网控制信息协议

                用于在IP主机、路由器之间传递控制消息、ping命令使用的协议

        IGMP(Internet Group Management Protocol)        互联网组管理

                是一个组播协议,用于主机和组播路由器之间通信

 链路层:
        ARP(Address Resolution Protocol)        地址解析协议

                通过IP地址获取对方mac地址

        RARP(ReverseAddress Resolution Protocol)        逆向地址解析协议

                通过mac地址获取ip地址

 

 三、TCP和UDP的异同

共同点:同属于传输层的协议,都用于网络传输

TCP ----> 稳定

1、提供面向连接的,可靠的数据传输服务

2、传输过程中,数据无误、数据无丢失、数据无失序、数据无重复

        1)TCP会给每个数据包编上编号,该编号称之为序列号

        2)每个序列号都需要应答包应答,如果没有应答,则会将上面的包重复发送直到正确为止

3、 数据传输效率低,耗费资源多

4、数据收发是不同步的

        1)为了提高效率,TCP会将多个较小,并且发送间隔短的数据包,沾成一个包发送,该现象称为沾包现象

        2)该沾包算法称之为Nagle算法

5、TCP的使用场景:对传输质量比较高的以及传输大量数据的通信,在需要可靠通信的传输场合,一般使用TCP协议

例如:账户登录,大型文件下载的时候

 

UDP ----> 快速

1、 面向无连接的,不保证数据可靠的,尽最大努力传输的协议

2、数据传输过程中,可能出现数据丢失、重复、失序现象

3、数据传输效率高,实时性高

4、限制每次传输的数据大小,多出部分直接忽略删除

5、收发是同步的,不会沾包

6、适用场景:发送小尺寸的,在接收到数据给出应答比较困难的情况下

例如:广播、通讯软件的音视频

 

四、网络编程基础相关的概念

4.1 字节序

1、不同主机在存储多字节整数时(short、int、long),由于cpu架构的不同,存储方式也不同,大致分为两类

        大端存储:地址低位存储数据的高位

        小端存储:地址低位存储数据的低位

2、验证方式:使用指针、共用体

 

#include<myhead.h>

void endian()
{
    int num = 0x12345678;        //定义变量存储多字节整数

    char *ptr = (char *)&num;   //&num是int *类型

    //对地址低位的一字节数据判断
    if(*ptr == 0x12)
    {
        printf("big endian\n");
    }else
    {
        printf("little endian\n");
    }

}




int main(int argc, const char *argv[])
{
    endian();           //调用函数

    return 0;
}

3、手动将小端存储的数据转换成大端存储的数据

#include<myhead.h>

void endian()
{
    int num = 0x12345678;        //定义变量存储多字节整数

    char *ptr = (char *)&num;   //&num是int *类型

    //对地址低位的一字节数据判断
    if(*ptr == 0x12)
    {
        printf("big endian\n");
    }else
    {
        printf("little endian\n");
    }

    //将数据转变成大端存储的数据
    char *qtr = ptr+3;             //定义指针指向最后一个字节

    //将数据不断进行首尾交换
    while(ptr<qtr)
    {
        char temp = *ptr;
        *ptr = *qtr;
        *qtr = temp;
        ptr++;
        qtr--;
    }

    printf("num = %#x\n", num);         //0x78563412

}




int main(int argc, const char *argv[])
{
    endian();           //调用函数

    return 0;
}

4、多主机信息传递中的大小端问题

         由于主机架构的不同,当一个小端存储的数据发送一个多字节整数时,是没办法确定对方是大端存储还是小端存储的,这样就导致,即使数据无误,传输无误,也会因为存储方式的不同,而导致数据的错误

        为了解决上面的问题,我们引入了网络字节序的概念:规定网络字节序是大端存储的字节序列

        对于发送端而言,无论是大端存储的主机还是小端存储的主机,向网络中发送多字节整数时,一律改成网络字节序传输;当数据到达对方主机时,无论接收端是大端存储还是小端存储,一律先将接受的数据转变成主机字节序

5、主机字节序和网络字节序的相互转换函数  主机:host  网络:network   转换:to

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);    
//将4字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序

uint16_t htons(uint16_t hostshort);   
//将2字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序

uint32_t ntohl(uint32_t netlong);    
//将4字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序

uint16_t ntohs(uint16_t netshort);     
//将2字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
#include<myhead.h>

void endian()
{
    int num = 0x12345678;        //定义变量存储多字节整数

    char *ptr = (char *)&num;   //&num是int *类型

    //对地址低位的一字节数据判断
    if(*ptr == 0x12)
    {
        printf("big endian\n");
    }else
    {
        printf("little endian\n");
    }

    /*将数据转变成大端存储的数据
    char *qtr = ptr+3;             //定义指针指向最后一个字节

    //将数据不断进行首尾交换
    while(ptr<qtr)
    {
        char temp = *ptr;
        *ptr = *qtr;
        *qtr = temp;
        ptr++;
        qtr--;
    }

    printf("num = %#x\n", num);         //0x78563412
    */

    //调用函数完成主机字节序转换为网络字节序
    int key = htonl(num);
    printf("key = %#x\n", key);

}




int main(int argc, const char *argv[])
{
    endian();           //调用函数

    return 0;
}

6、 何时使用字节序转换函数

1)在进行网络传输多字节整数时,需要使用字节序转换函数

2)在进行网络传输单字节整数时,不需要使用字节序转换函数

3)在进行网络传输字符串时,不需要使用字节序转换函数

五、ip地址

5.1 ip地址的相关概念

        1)ip地址全称为(Internet Protocol Address):是主机在网络中的唯一标识。

        2)当数据在网络中传输时,需要要携带源ip地址和目的ip地址,路由器就是依靠该地址进行路由选择,以便于确定对端主机的

5.2 ip地址的分类

        1)ipV4:采用的是4字节无符号整数表示,取值范围【0, 2^32-1】

                LAN(local area network): 局域网

                WAN(Wide Area Network):广域网

        2)ipV6:采用16字节无符号整数表示,取值范围【0, 2^128-1】

5.3 ip地址的分类:ip地址一共分为五类:A、B、C、D、E类网络

 

A类地址

1.0.0.0~127.255.255.255

2^7(网络号)

2^24(主机号)

已经保留不在供给

B类地址

128.0.0.0~191.255.255.255

2^14

2^16

名地址网管中心

C类地址

192.0.0.0~223.255.255.255

2^21

2^8

校园网或企业网、家庭网

D类地址

224.0.0.0~239.255.255.255

组播地址

E类地址

240.0.0.0~255.255.255.255

保留

 

5.4 一个局域网下的特殊的IP地址

        1)网络号 + 0:表示该网络,不分配给任何主机使用

        2)网络号 + 255:广播地址,不分配给任何主机使用

        3)网络号 + 1:默认为网关地址

        4)127.0.0.1:本地环回地址,用于主机内部自测使用

        5)0.0.0.0:表示当前局域网的任意一个主机号

        6)255.255.255.255:一般表示广播

5.5 点分十进制

        由于ip地址是一个4字节无符号整数,如果真用整数表示,是一个非常难记忆的数据。为了解决这个问题,我们引入了点分十进制,将4字节的每一个字节为单位转变成十进制数,中间用点隔开。在C语言中,使用字符串存储

        由于网络通信中依然使用的是4字节无符号整数,那就需要引入点分十进制与4字节无符号整数转变函数

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>



in_addr_t inet_addr(const char *cp);    
//将点分十进制转换为网络字节序,参数是点分十进制,返回值为网络字节序



char *inet_ntoa(struct in_addr in);    
//将网络字节序转换为点分十进制,参数是网络字节序,返回值是点分十进制
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //定义变量存储ip地址
    char *ip = "192.168.0.122";       //主机ip地址

    //调用函数转换为4字节无符号整数
    unsigned int u_ip = inet_addr(ip);

    printf("u_ip = %#x\n", u_ip);    //C0 A8 0 7A

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java收发邮件笔记

1 关于邮箱的前置知识 1.1 概念部分 邮箱服务器和协议是电子邮件系统中不可或缺的两个组成部分&#xff0c;它们共同确保了电子邮件的顺利发送、接收和管理。 1.1.1 服务器和协议 邮箱服务器 比如常见的QQ邮箱,网易邮箱。 邮箱服务器是一种负责电子邮件收发管理的计算机系…

Rust学习---Hello World

编写 Rust 程序 1.程序文件后缀名: rs 2.文件命名规范:hello_world.rs 3.(例子) 使用命令创建项目&#xff0c;命名为"hello world" 打开 cmd 输入: mkdir hello_world cd hello_world 新建文件 main.rs编译与运行 Rust 程序 1.编译:rustc main.rs&#xff0c;…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件&#xff0c;用于分析工程内的资源使用情况&#xff0c;资源大小&#xff0c;分析资源依赖关系&#xff0c;可以用来清理项目中未使用的资源。尤其是项目较大时&#xff0c;删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

Linux 进程概念

Linux 进程概念 硬件理解冯 诺依曼体系结构五大组成部件强调存储 引子操作系统&#xff08;Operator System&#xff09;概念作用认识为什么要有操作系统&#xff1f; 结构 示意图理解操作系统system call库函数概念 进程什么是进程概念误区认识 描述进程 - PCBtask_struct - P…

colResizable插件实现网页中表格列宽自定义

需求&#xff1a;页面上每个字段的列宽&#xff0c;可以通过页面拖动的形式进行调整。 解决方法&#xff1a;使用jQuery的一个插件&#xff0c;名称叫 colResizable&#xff0c;可以实现。 插件官网 colResizable – 可调整大小的列和表 (bacubacu.com) 说明&#xff1a; 该…

汽车线路保护设计

汽车线路保护设计 线路保护就是要对导线加以保护&#xff0c;兼顾对回路电器件的保护。保护装置主要有熔断器、断路器和易熔线等。 保险、继电器、导线、电瓶的选择和计算 熔断器的选取原则 发动机ECU、ABS等对整车性能及安全影响大&#xff0c;另外&#xff0c;易受其他用…

从零安装pytorch并在pycharm中使用

背景介绍 目前主流使用的工具有Facebook搞的pythorch和谷歌开发的tensorflow两种&#xff0c;二者在实现理念上有一定区别&#xff0c;pytorch和人的思维模式与变成习惯更像&#xff0c;而tensorflow则是先构建整体结构&#xff0c;然后整体运行&#xff0c;开发调试过程较为繁…

算法工程师必知必会的数学基础之微积分上

系列文章&#xff1a; 第一篇&#xff1a;算法工程师必知必会的数学基础之线性代数第二篇&#xff1a;算法工程师必知必会的数学基础之微积分上&#xff08;本文&#xff09;。 文章目录 2. 微积分2.1 极限&#xff08;Limits&#xff09;和 连续性&#xff08;Continuity&…

WPF篇(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

学习笔记 韩顺平 零基础30天学会Java(2024.8.8)

P492 第三代日期使用 P493 第三代日期方法 P495 String翻转 作业代码见chapter12homework 对于需要异常处理的情况&#xff0c;可以通过这种想法得到&#xff1a; P495 注册处理题 P496 字符串统计 P497 String内存布局测试题 P498 常见类阶段梳理 P499 集合介绍 集合的使用并不…

xxljob--入门使用

1.简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 2.下载 网址&#xff1a;xxljob 3. 导入数据库 3.1请下载项目源码并解压&#xff0c;获取 “调…

ElasticSearch(九)— 聚集查询2

一、 范围分桶聚集 如果使用 SQL 语言类比&#xff0c;桶型聚集与 SQL 语句中的 group by 子句极为相似。桶型聚集(Bucket Aggregation)是 Elasticsearch 官方对这种聚集的叫法&#xff0c;它起的作用是根据条件对文档进行分组。 可以将这里的桶理解为分组的容器&#xff0c;…

git commit 提交报错

当使用git cimmit -m "XXX" 将暂存区文件提交到仓库区时出现以下错误信息&#xff1a; 原因&#xff1a;开启了 eslint 校验 只要跳过 eslint 校验就可以了&#xff0c;即加 --no-verify 即可解决 git commit --no-verify -m "XXX"

太极图形学——弹性物体仿真 1

1.仿真基础&#xff0c;时间和空间的离散化 渲染对于物体的展现来说是一件很重要的事 但除了渲染之外&#xff0c;还需要物理来控制&#xff0c;形成动画 弹性物体的仿真实际上非常重要&#xff0c;特别是对于头发&#xff0c;衣物的仿真&#xff0c;虚拟手术中软组织的仿真 仿…

JupyterNotebook添加Anaconda中已有的虚拟环境

比如&#xff0c;在Acaconde中存在一个我已经配置好的虚拟环境pose,现在我想在Jupyter中使用它 那么可以使用ipython kernel install --user --name 你要添加的环境 添加到Jupyter中。 对于Jupyter中已有的代码&#xff0c;就可以在Kernel - chanage kernel中改变内核。

大模型+XDR!打开网络安全攻防演练新范式!

网络安全领域面临着日益复杂的挑战&#xff0c;外部攻击与内部安全威胁交织的双重压力。技术革新成为筑牢安全防线的关键&#xff0c;随着新一代技术的崛起&#xff0c;特别是大数据与人工智能的深度融合&#xff0c;引领着网络安全进入全新阶段。 通过构建网络安全大模型&…

批量重命名图片文件名,这几种方法告别手打!

在这个数字化时代&#xff0c;图片已成为我们日常生活和工作中不可或缺的一部分。无论是整理旅行照片、管理项目素材&#xff0c;还是编辑文章配图&#xff0c;图片的管理都显得尤为重要。然而&#xff0c;面对成百上千的图片文件&#xff0c;如果还在逐一手动修改文件名&#…

OpenSNN推文:研究发现,人工智能以牺牲集体多样性为代价提升个人创造力

&#xfeff;&#xfeff; ChatGPT 等生成式 AI 工具的兴起引发了关于它们对创造力和新颖想法产生的影响的争论。 伦敦大学管理学院和埃克塞特大学研究人员开展的一项新研究探索了生成模型对创意写作的影响。该研究考察了获取大型语言模型 (LLM) 生成的故事创意如何影响人类创…

使用 Python 执行 JavaScript

案例引入 网站&#xff1a; https://spa7.scrape.center 这里是一个简单的 NBA 球星的网站&#xff0c; 用卡片形式展示了一些球星的基本信息。另外&#xff0c;每张卡片其实都有一个加密字符串&#xff0c;这个加密字符串其实和球星的信息是由关联的&#xff0c; 并且每个球星…

数据库范式及其示例,看完这一篇足够

1. 什么是数据库规范化&#xff1f; 1.1 规范化概念 规范化是一种数据库设计技术&#xff0c;可减少数据冗余并消除插入、更新和删除异常等不良特征。规范化规则将较大的表划分为较小的表并使用关系链接它们。SQL 中的规范化的目的是消除冗余&#xff08;重复&#xff09;数据…