首页 > 编程语言 >网络编程基础

网络编程基础

时间:2024-08-10 15:28:37浏览次数:14  
标签:字节 int ip 编程 基础 网络 TCP 地址

目录

学习内容:

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

1.1 网络体系结构概念 

1.2 OSI开放系统互联模型

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

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

2. TCP和UDP异同(笔试面试)

3. 网络编程基础相关的概念

3.1 字节序

2> 验证主机大小端的方式

3>如何实现主机字节序和网络字节序的转换 

        1. 手动实现大小端的转换

        2. 系统提供了有关主机字节序和网络字节序数据之间相互转换的函数 

3.2 ip地址

3.2.1. ip地址的分类

3.2.2. ip地址的划分

3.2.3. ip地址点分十进制 


学习内容:

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

1.1 网络体系结构概念 

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

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

分层的好处:

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

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

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

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

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

1.2 OSI开放系统互联模型

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

        OSI共有七层:

                物数网传会表应。

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

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

        TCP/IP网络体系结构四层:

                应用层

                传输层

                网络层

                链路层(网络接口和物理层)

1.4 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(Reverse Address Resolution Protocol) 逆向地址解析协议

                通过mac地址获取ip地址

2. TCP和UDP异同(笔试面试)

        共同点:同属于传输层的协议

TCP ----> 稳定

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

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

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

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

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

        4> 数据收发是不同步的

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

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

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

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

UDP ----> 快速

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

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

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

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

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

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

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

3. 网络编程基础相关的概念

3.1 字节序

1> 回顾大端存储和小端存储:不同的主机在存储多字节整数时的存储方式有所不同,根据存储方式的不同,我们称为大端存储的主机和小端存储的主机

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

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

2> 验证主机大小端的方式

#include<myhead.h>

int main(int argc, const char *argv[])
{
    /*用共用体的方式验证大小端
    union 
    {
        int num;
        char ch;
    }data;

    //给整形数据赋值
    data.num = 0x12345678;
    //判断该数据的前一个字节(低地址位)中存储的数据
    if(data.ch == 0x12)
    {
        printf("big endian\n");
    }else if (data.ch == 0x78)
    {
        printf("little endian\n");
    }*/

    //使用指针的方式验证
    int num = 0x12345678;
    char *ptr = (char *)&num;

    //判断起始地址中的数据
    if(*ptr == 0x12)
    {
        printf("big endian\n");
    }else if(*ptr == 0x78)
    {
        printf("little endian\n");
    }

    return 0;
}

3>如何实现主机字节序和网络字节序的转换 

        1. 手动实现大小端的转换
#include<myhead.h>

int main(int argc, const char *argv[])
{
    //使用指针的方式验证
    int num = 0x12345678;
    char *ptr = (char *)&num;

    //判断起始地址中的数据
    if(*ptr == 0x12)
    {
        printf("big endian\n");
    }else if(*ptr == 0x78)
    {
        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

    }



    return 0;
}

        2. 系统提供了有关主机字节序和网络字节序数据之间相互转换的函数 

                主机:host

                网络:network

                转换:to

#include<myhead.h>


int main(int argc, const char *argv[])
{
    int num = 0x12345678;    //定义四字节整数
    short value = 0x1234;   //定义两字节整数

    int num_n = htonl(num);   //将num转换为网络字节序
    int value_n = htons(value);   //将value转换为网络字节序

    printf("num_n = %#x, value_n = %#x\n", num_n, value_n);

    return 0;
}

3.2 ip地址

3.2.1. ip地址的分类

1、IPv4:采用一个4字节无符号整数存储,32bit,取值范围:【0,2^32-1】

                局域网:local area network (LAN)

                广域网:wide area network(WAN)

2、IPv6:采用16字节无符号整数存储,128bit,取值范围: [0, 2^128-1]

3.2.2. ip地址的划分

        由于ip地址本身数字比较庞大,而且没有规律,为了更加方便有效的寻径,我们将IP进行二级划分,划分成两部分,分别是网络号和主机号

                ip = 网络号 + 主机号

        网络号:确定计算机从属的网络,在同一个网络下的多个主机的ip地址网络号都一样

        主机号:标识设备在该网络中的主机编号

A类地址

0.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

保留

3.2.3. ip地址点分十进制 

        为了方便记忆,我们将四字节ip地址的整数的每一个字节转换成十进制数,并使用点分割,组成一个字符串,这个字符串就是ip地址的点分十进制

        但是,在网络传输中,ip地址展现的是4字节无符号整数的形式,所以在传输ip地址时,需要考虑字节序的问题

        系统给大家提供了点分十进制与4字节无符号整数转换的函数

                address:地址

                network:网络

                to:转换

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



       in_addr_t inet_addr(const char *cp);
       功能:将点分十进制的ip地址转换为4字节无符号整数的网络字节序
       参数:点分十进制
       返回值:对应的4字节无符号整数的网络字节序       



       char *inet_ntoa(struct in_addr in);
       功能:将ip地址的4字节无符号整数的网络字节序转换为点分十进制的字符串
       参数:ip地址的网络字节序
       返回值:点分十进制字符串

#include<myhead.h>

int main(int argc, const char *argv[])
{
    const char *ip = "192.168.117.83";   //点分十进制

    //将点分十进制字符串转换为4字节无符号整数的网络字节序
    int ip_n = inet_addr(ip);

    //输出网络字节序
    printf("ip_n = %#x\n", ip_n);


    //验证
    printf("主机字节序:%#x\n", ntohl(ip_n));

    return 0;
}

标签:字节,int,ip,编程,基础,网络,TCP,地址
From: https://blog.csdn.net/weixin_50357983/article/details/141090808

相关文章

  • Python网络爬虫抓取动态网页并将数据存入数据库MySQL
    简述以下的代码是使用python实现的网络爬虫,抓取动态网页http://hb.qq.com/baoliao/。此网页中的最新、精华下面的内容是由JavaScript动态生成的。审查网页元素与网页源码是不同。以上是网页源码以上是审查网页元素所以此处不能简单的使用正则表达式来获取内容。......
  • 二叉树基础OJ题
    前言二叉树学到现在,我们对递归已经一定程序上的理解了,所有这里为了加深我们对二叉树递归的掌握,我会分享几道基础的练习题来巩固加深我们对二叉树的理解这里拿出一些二叉树OJ题,我会写出过程详解,如有错误还望指正!题源来自于牛客网和力扣单值二叉树这题需要判断每个节点的值......
  • C#多线程并发编程深度探索:解锁async、await、Task与lock等关键字的奥秘
    一、多线程介绍1.什么是多线程多线程是指在一个应用程序中同时执行多个线程的能力。每个线程都是独立运行的,拥有自己的执行路径和资源。多线程编程能够充分利用多核处理器的计算能力,提高应用程序的性能和响应性,特别是在处理耗时任务和并行计算时效果显著。在C#中,线程是程序......
  • 零基础转行网络安全真的好就业吗?(非常详细)零基础入门到精通,收藏这一篇就够了
    网络安全作为近两年兴起的热门行业,成了很多就业无门但是想转行的人心中比较向往但是又心存疑惑的行业,毕竟网络安全的发展史比较短,而国内目前网安的环境和市场情况还不算为大众所知晓,所以到底零基础转行入门网络安全之后,好不好就业呢?今天我们就来全面彻底分析一下网络安全对......
  • 面向对象编程(OOP: Object Oriented Programming ):类、对象、构造方法、封装
    目录一、类1、定义(1)属性(2)方法2、类的定义方法二、对象1、定义2、对象的定义方法三、类和对象的关系1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。2、对象:真实存在的对象3、类是对象的模板,对象是类的具体实例。4、一个类可以创建多个对象,同一个......
  • JDBC数据库连接技术基础及核心API
    目录JDBC的概念JDBC的搭建步骤JDBC的代码实现步骤框架代码实现核心API注册驱动(jdk6.0后可自动注册,无需编写代码)Connection(连接数据库)Statement(用于执行SQL语句,会被SQL注入攻击,后被PreparedStatement替代)PreparedStatement(可以防止SQL注入,全面替代Statement)ResultS......
  • 【MATLAB源码】数学建模基础教程(2)--层次分析法(评价类算法)
    系列文章目录在最后面,各位同仁感兴趣可以看看!层次分析法引言一、层次分析法的特点二、模型的建立求解过程(1)问题的提出:实际问题的转化(2)建立层次结构模型(3)构造判断(成对比较)矩阵(4)一致性检验:三、层次分析法的优点与局限代码开源最后:总结系列文章目录引言层次分析......
  • 网络编程套接字(一)
    目录源IP地址与目的IP地址端口号MAC地址网络字节序socket常见APIsockaddr结构基于UDP协议实现通信测试源IP地址与目的IP地址在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址,源IP地址是数据发送者的IP地址,目的IP地址是数据接收者的地址。源IP地址......
  • Java网络编程——Request Response 对象
    Response-网页上一章我们学习了Java中使用Okhttp3库请求网页或调用API的知识。使用一条语句执行调用请求,并取得返回结果字符串:call.execute().body().string()execute()方法是真正执行发送请求,前面的一系列代码是做前置准备。这段代码获得服务器返回内容的......
  • 多元时间序列分析统计学基础:基本概念、VMA、VAR和VARMA
    多元时间序列是一个在大学课程中经常未被提及的话题。但是现实世界的数据通常具有多个维度,所以需要多元时间序列分析技术。在这文章我们将通过可视化和Python实现来学习多元时间序列概念。这里假设读者已经了解单变量时间序列分析。1、什么是多元时间序列?顾名思义,多元时间序列是......