• 学习记录——day29 网络编程


    目录

    一、网络编程引入

    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、验证方式:使用指针、共用体

    1. #include<myhead.h>
    2. void endian()
    3. {
    4. int num = 0x12345678; //定义变量存储多字节整数
    5. char *ptr = (char *)&num; //&num是int *类型
    6. //对地址低位的一字节数据判断
    7. if(*ptr == 0x12)
    8. {
    9. printf("big endian\n");
    10. }else
    11. {
    12. printf("little endian\n");
    13. }
    14. }
    15. int main(int argc, const char *argv[])
    16. {
    17. endian(); //调用函数
    18. return 0;
    19. }

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

    1. #include<myhead.h>
    2. void endian()
    3. {
    4. int num = 0x12345678; //定义变量存储多字节整数
    5. char *ptr = (char *)&num; //&num是int *类型
    6. //对地址低位的一字节数据判断
    7. if(*ptr == 0x12)
    8. {
    9. printf("big endian\n");
    10. }else
    11. {
    12. printf("little endian\n");
    13. }
    14. //将数据转变成大端存储的数据
    15. char *qtr = ptr+3; //定义指针指向最后一个字节
    16. //将数据不断进行首尾交换
    17. while(ptr<qtr)
    18. {
    19. char temp = *ptr;
    20. *ptr = *qtr;
    21. *qtr = temp;
    22. ptr++;
    23. qtr--;
    24. }
    25. printf("num = %#x\n", num); //0x78563412
    26. }
    27. int main(int argc, const char *argv[])
    28. {
    29. endian(); //调用函数
    30. return 0;
    31. }

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

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

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

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

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

    1. #include <arpa/inet.h>
    2. uint32_t htonl(uint32_t hostlong);
    3. //4字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
    4. uint16_t htons(uint16_t hostshort);
    5. //2字节无符号整数的主机字节序转换为网络字节序,参数是主机字节序,返回值是网络字节序
    6. uint32_t ntohl(uint32_t netlong);
    7. //4字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
    8. uint16_t ntohs(uint16_t netshort);
    9. //2字节无符号整数的网络字节序转换为主机字节序,参数是网络字节序,返回值是主机字节序
    1. #include<myhead.h>
    2. void endian()
    3. {
    4. int num = 0x12345678; //定义变量存储多字节整数
    5. char *ptr = (char *)&num; //&num是int *类型
    6. //对地址低位的一字节数据判断
    7. if(*ptr == 0x12)
    8. {
    9. printf("big endian\n");
    10. }else
    11. {
    12. printf("little endian\n");
    13. }
    14. /*将数据转变成大端存储的数据
    15. char *qtr = ptr+3; //定义指针指向最后一个字节
    16. //将数据不断进行首尾交换
    17. while(ptr<qtr)
    18. {
    19. char temp = *ptr;
    20. *ptr = *qtr;
    21. *qtr = temp;
    22. ptr++;
    23. qtr--;
    24. }
    25. printf("num = %#x\n", num); //0x78563412
    26. */
    27. //调用函数完成主机字节序转换为网络字节序
    28. int key = htonl(num);
    29. printf("key = %#x\n", key);
    30. }
    31. int main(int argc, const char *argv[])
    32. {
    33. endian(); //调用函数
    34. return 0;
    35. }

    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字节无符号整数转变函数

    1. #include
    2. #include
    3. #include
    4. in_addr_t inet_addr(const char *cp);
    5. //将点分十进制转换为网络字节序,参数是点分十进制,返回值为网络字节序
    6. char *inet_ntoa(struct in_addr in);
    7. //将网络字节序转换为点分十进制,参数是网络字节序,返回值是点分十进制
    1. #include<myhead.h>
    2. int main(int argc, const char *argv[])
    3. {
    4. //定义变量存储ip地址
    5. char *ip = "192.168.0.122"; //主机ip地址
    6. //调用函数转换为4字节无符号整数
    7. unsigned int u_ip = inet_addr(ip);
    8. printf("u_ip = %#x\n", u_ip); //C0 A8 0 7A
    9. return 0;
    10. }

  • 相关阅读:
    Java面试题-Java核心基础-第十一天(注解)
    Spring Boot 常用注解与详解
    SmartX 超融合 5.1 版本有哪些新特性和技术提升?
    [附源码]计算机毕业设计基于Springboot的中点游戏分享网站
    查找或替换excel换行符ctrl+j和word中的换行符^p,^l
    2022年十月份钓鱼威胁情报
    Excel数据丢失怎么找回?详细恢复教程分享!
    【牛客 - 剑指offer】JZ54 二叉搜索树的第k个节点 递归版+非递归版 Java实现
    E. Speedrun
    Git常用指令以及常见问题解决
  • 原文地址:https://blog.csdn.net/weixin_64918301/article/details/141054942