Linux22 --- 网络为什么要分层、使用tcp协议实现两个进程间通信的功能、IP地址转换函数

news2024/11/25 0:42:39

一、网络为什么要分层

1

1、分层的优点

1)各层之间是独立的。某一层并不需要知道它的下一层是如何实现的,而仅仅需要知道该层通过层间的接口(即界面)所提供的服务。由于每一层只实现一种相对独立的功能,因而可将一个难以处理的复杂问题分解为若干个较容易处理的更小一些的问题。这样,整个问题的复杂程度就下降了。
2)灵活性好。当任何一层发生变化时(例如由于技术的变化),只要层间接口关系保持不变,则在这层以上或以下各层均不受影响。此外,对某一层提供的服务还可进行修改。
3)当某层提供的服务不再需要时,甚至可以将这层取消。
4)结构上可分割开。各层都可以采用最合适的技术来实现。
5)易于实现和维护。这种结构使得实现和调试一个庞大而又复杂的系统变得6)易于处理,因为整个的系统已被分解为若干个相对独立的子系统。
能促进标准化工作。因为每一层的功能及其所提供的服务都已有了精确的说明。

2、分层时应注意使每一层的功能非常明确。

若层数太少,就会使每一层的协议太复杂。
但层数太多又会在描述和综合各层功能的系统工程任务时遇到较多的困难。

3、通常各层所要完成的功能主要有以下一些(可以只包括一种,也可以包括多种):

1)差错控制使相应层次对等方的通信更加可靠。
2)流量控制发送端的发送速率必须使接收端来得及接收,不要太快。
3)分段和重装发送端将要发送的数据块划分为更小的单位,在接收端将其还原。
4)复用和分用发送端几个高层会话复用一条低层的连接,在接收端再进行分用。
5)连接建立和释放交换数据前先建立一条逻辑连接,数据传送结束后释放连接。
————————————————
版权声明:本文为CSDN博主「AKA石头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40965479/article/details/106748321

2

我觉得最准确的回答应该是:封装对下层的变化。

如果学过或者了解过设计模式就知道,实现一个复杂的、多功能的程序,为了便于维护与拓展,程序的功能之间应该是解耦和的。因此,复杂的程序都要分层,这是程序设计的要求。(好好理解这句话)

举个例子,对于复杂的电商网站,会分为 Dao 层(专门负责数据库连接、增删改查等操作),Service层(专门负责业务逻辑处理),Controller层(专门负责业务模块的流程控制)等,除此之外,为了进一步解耦和,在这些层中还需要首先设计接口,再设计其实现类。每个层单独完成一份任务,专注一份任务,这就是分层的设计思路。

同样的道理,在计算机网络中,每一层的协议负责的工作都是不一样的,也就对应有了不同设备来处理(二层设备、三层设备)。同时,对下层的变化进行封装,这里有必要理解深刻一点。物理层只关心 0 和 1 是如何传输的,而对他们所表达的内容毫不关心;往上一层,数据链路层只关心数据帧是否准确地送到了对应MAC地址的目的主机,而不关心是通过光纤也好,同轴电缆也好,wifi也好,只要目的主机收到的数据帧没错就ok;继续往上,同理。

因此,这里引用极客时间中的两点作为总结:

始终想像自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发送出去。
始终牢记一个原则:只要在网络上跑的包,都是完整的。可以有下层没上层,但绝不能有上层而没下层。
————————————————
版权声明:本文为CSDN博主「见见大魔王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41960890/article/details/104903477

这里举个例子,对于土豆丝的实现,可以将其分为以下的几个步骤:

在这里插入图片描述

二、使用tcp协议实现两个进程间通信的功能

传输层使用tcp协议实现两个进程间通信的功能时,有一定的模式:
在这里插入图片描述
两边要进行通信,需要通过套接字(具有通过网络收发数据的能力)。

1、相关函数接口

inet_addr() – 字符串形式表示IP地址转成整型;
struct sockaddr; – 通用的地址结构,结构体保存套接字的地址(一般由IP加端口来表示);
struct sockaddr_in; – IPv4专用的地址结构
表示不同的字节序列,大端小端,将大端称为网络字节序列。
htons() – “host to network long”,将长整形(32bit)的主机字节序数据转化为网络字节数据。内部会自动判断大小端,并内部进行转换。
ntohs() – 网络传输机

2、服务端代码实现示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

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


int main()
{
    //创建套接字
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        exit(0);
    }

    //ipv4专用地址
    struct sockaddr_in saddr,caddr;
    //清空
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);//转成网络字节序列 ,ip
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//端口

    //命名套接子
    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if( res == -1 )
    {
        printf("bind err\n");
        exit(0);
    }
  
    //创建监听队列 - listen
    res = listen(sockfd,5);
    if( res == -1 )
    {
        exit(0);
    }

    while(1)
    {
        int len = sizeof(caddr);
        //使用accept接收
        //c为连接套接字  sockfd为监听套接字
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
        if( c < 0 )
        {
            continue;
        }
        //printf("accept c = %d\n",c);
        //打印客户端id
        printf("accept c = %d\n",c);
    
        char buff[128] = {0};
        int n = recv(c,buff,127,0);
        printf("recv(%d):%s\n",n,buff);
        send(c,"ok",2,0);
        close(c);
    }

}

3、客户端代码实现示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

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

int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if( sockfd == -1 )
    {
        exit(0);
    }

    struct sockaddr_in saddr;//服务器地址
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(6000);
    //saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    saddr.sin_addr.s_addr = inet_addr("110.40.211.237");

    //连接
    int res = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if( res == -1 )
    {
        printf("connect failed\n");
        exit(0);
    }
    
    //从键盘获取数据
    printf("input:\n");
    char buff[128] = {0};
    fgets(buff,128,stdin);
    
    send(sockfd,buff,strlen(buff)-1,0);//发送数据

    memset(buff,0,128);
    recv(sockfd,buff,127,0);//接收返回的数据
    printf("buff = %s\n",buff);
    close(sockfd);

    exit(0);

}

三、IP地址转换函数:

通常,人们习惯用可读性好的字符串来表示IP地址,比如用点分十进制字符串表示IPv4地址,以及用十六进制字符串表示IPv6地址。但编程中我们需要先把它们转化为整数(二进制数)方能使用。而记录日志时则相反,我们要把整数表示的IP地址转化为可读的字符串。下面3个函数可用于用点分十进制字符串表示的IPv4地址和用网络字节序整数表示的IPv4地址之间的转换:
在这里插入图片描述

inet_addr 函数将用点分十进制字符串表示的 IPv4 地址转化为用网络字节序整数表示的IPv4地址。它失败时返回 INADDR_NONE。
inet_aton 函数完成和 inet_addr 同样的功能,但是将转化结果存储于参数 inp 指向的地址结构中。它成功时返回 1,失败则返回 0。
inet_ntoa 函数将用网络字节序整数表示的 IPv4地址转化为用点分十进制字符串表示的 IPv4 地址。但需要注意的是,该函数内部用一个静态变量存储转化结果,函数的返回值指向该静态内存,因此 inet_ntoa 是不可重人的。代码清单5-2揭示了其不可重入性。
在这里插入图片描述
下面这对更新的函数也能完成和前面3个函数同样的功能,并且它们同时适用于IPv4 地址和 IPv6 地址:
在这里插入图片描述

inet_pton 函数将用字符串表示的 IP 地址 src (用点分十进制字符串表示的IPv4地址或用十六进制字符串表示的 IPv6 地址)转换成用网络字节序整数表示的IP地址,并把转换结果存储于dst指向的内存中。其中,af参数指定地址族,可以是 AF_INET 或者 AF_INET6。
inet_pton 成功时返回1,失败则返回 0 并设置 errno。
inet_ntop 函数进行相反的转换,前三个参数的含义与 inet_pton 的参数相同,最后一个参数 cnt 指定目标存储单元的大小。下面的两个宏能帮助我们指定这个大小(分别用于 IPv4 和 IPv6 ):
在这里插入图片描述
inet_ntop 成功时返回目标存储单元的地址,失败则返回 NULL 并设置 errno。

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

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

相关文章

Linux-Hadoop集群配置

文章目录一、配置Hadoop集群1、在master虚拟机上配置hadoop&#xff08;1&#xff09;编辑Hadoop环境配置文件 - hadoop-env.sh&#xff08;2&#xff09;编辑Hadoop核心配置文件 - core-site.xml&#xff08;3&#xff09;编辑HDFS配置文件 - hdfs-site.xml&#xff08;4&…

1542_AURIX_TC275_CPU子系统_内核

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 我因为看了这个章节的开篇有些疑惑去看了内核手册&#xff0c;现在学习的进程终于又重新回归&#xff0c;回到了TC275这个MCU的学习上。 这里的几条笔记记录是隔了很久写的&#xff0c;前面…

【Java面试】HashMap死循环问题

问题 最近几道面试题被问了是否了解并发情况下JDK7中HashMap发生死循环&#xff0c;导致CPU占用100%的问题。 由于HashMap并非是线程安全的&#xff0c;所以在高并发的情况下必然会出现问题&#xff0c;这是一个普遍的问题。 如果是在单线程下使用HashMap&#xff0c;自然是没…

[MAUI] 开篇-初识MAUI

前言 在2020年5月, 微软宣布了MAUI跨平台框架, MAUI 是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中。 原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行…

Elasticsearch倒排索引

什么是正排索引&#xff1f; 如下图&#xff0c;有一张商品表&#xff08;tb_goods&#xff09;&#xff1a; 对于mysql数据库来说&#xff0c;肯定会给“id”创建主键索引&#xff0c;然后根据“id”来查询对应的商品信息&#xff0c;而这种情况就被称为“正排索引” 现在有…

eMagin:当月产百万片时,4K MicroOLED成本将不是问题

在今年2022 SID显示周期间&#xff0c;Micro OLED微显示模组厂商eMagin曾展示一款专为超短焦VR头显开发的4K Micro OLED微显示屏&#xff0c;有趣的是&#xff0c;该显示屏连接的主板上印有STEAMBOAT字样&#xff0c;让人不禁怀疑它与Valve之间是否存在某种联系。甚至有猜测认为…

【Linux】8.0 多线程

文章目录1.0 Linux线程概念1.1 Linux线程基本概念1.2 Linux线程优劣介绍2.0 Linux线程控制2.1 pthread_create(创建线程)2.2 pthread_join(线程等待)2.3 pthread_exit(线程终止)2.4 pthread_detach(线程分离)3.0 线程id和LWP的关系4.0 Linux线程互斥4.1 线程互斥相关概念4.2 线…

JUC系列(五) 读写锁与阻塞队列

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; ☀️☀️你好啊&#xff01;小伙伴&#xff0c;我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 &#x1f4d2; 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️&#xff0c;擅…

Qt第二十六章:Nuitka打包教程

Nuitka环境安装 ①下载gcc文件。提取码&#xff1a;8888百度网盘 请输入提取码 ②解压nuitka1.0.6版本&#xff0c;我们解压64位的。 ③设置环境变量 ④检测一下 gcc.exe --version 安装nuitka pip install nuitka pip install ordered-set 防止环境变量不生效&#xff0c;…

【Redis】Redis介绍

文章目录1.NoSQL数据库1.1NoSQL适用场景1.2常用的NoSQL1.3Redis介绍1.4Redis的使用场景1.5Redis默认按照目录1.6Redis的启动1.7Redis是单线程多路IO复用技术1.NoSQL数据库 NoSQL(NoSQL Not Only SQL )&#xff0c;意即“不仅仅是SQL”&#xff0c;泛指非关系型的数据库。 NoS…

学生HTML个人网页作业作品 (服装商城HTML+CSS)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&a…

RK3588平台开发系列讲解(Pinctrl篇)Pinctrl设备树介绍

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、 DTS介绍二、新建pinctrl三、引用pinctrl沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍pinctrl设备树的使用方法。 一、 DTS介绍 RK芯片的设备树⼀般把pinctrl节点放在soc…

元宇宙数字藏品,打造数字经济产业,实现全新业态升级

《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》提出以数字化转型整体驱动生产方式、生活方式和治理方式变革&#xff0c;催生新产业新业态新模式&#xff0c;壮大经济发展新引擎&#xff0c;将“虚拟现实和增强现实”列入了数字经济重点产业。 而自…

GAN生成漫画脸

最近对对抗生成网络GAN比较感兴趣&#xff0c;相关知识点文章还在编辑中&#xff0c;以下这个是一个练手的小项目~ (在原模型上做了&#xff0c;为了减少计算量让其好训练一些。) 一、导入工具包 import tensorflow as tf from tensorflow.keras import layersimport numpy a…

tinymce富文本编辑器做评论区

今天分享一下tinymce富文本编辑器做评论区的全过程。 文章目录一、介绍1.最终效果2.功能介绍3.主要项目包版本介绍&#xff1a;二、每个功能的实现1.自定义toolbar的功能区①对应的样式以及意义②对应的代码实现【忽略了一切非实现该功能的代码】2.展示、收起评论区①对应的样式…

ctf工具之:mitmproxy实践测试

1、安装居然使用的pip pip install mitmproxy 导入证书&#xff0c;密码为空 2、启用mitmweb pause 直接可以查看方式 搜索里输入login 对于http协议 直接看到了密码原文 3、后台日志方式 录入和回放 mitmdump -w baidu.txt pause 录制结束 mitmdump -nC baidu.txt paus…

如何设计可扩展架构

架构设计复杂度模型 业务复杂度和质量复杂度是正交的 业务复杂度 业务固有的复杂度&#xff0c;主要体现为难以理解、难以扩展&#xff0c;例如服务数量多、业务流程长、业务之间关系复杂 质量复杂度 高性能、高可用、成本、安全等质量属性的要求 架构复杂度应对之道 复杂…

MySQL备份与恢复

目录 一.数据备份的重要性 二.数据库备份的分类 2.1 物理备份 2.2 逻辑备份 2.3 完全备份&#xff08;只适合第一次&#xff09; 三.常见的备份方法 四.MySQL完全备份 4.1 MySQL完全备份优缺点 4.2 数据库完全备份分类 4.2.1 物理冷备份与恢复 五.完全备份 5.1 MySQ…

YOLO家族再度升级——阿里达摩院DAMO-YOLO重磅来袭

最近看到阿里达摩院发表了他们的最新研究成果&#xff0c;在YOLO系列上推出的新的模型DAMO-YOLO&#xff0c;还没有来得及去仔细了解一下&#xff0c;这里只是简单介绍下&#xff0c;后面有时间的话再详细研究下。 官方项目在这里&#xff0c;首页截图如下所示&#xff1a; 目…

ASEMI整流桥UD4KB100,UD4KB100体积,UD4KB100大小

编辑-Z ASEMI整流桥UD4KB100参数&#xff1a; 型号&#xff1a;UD4KB100 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1000V 最大平均正向整流输出电流&#xff08;IF&#xff09;&#xff1a;4A 峰值正向浪涌电流&#xff08;IFSM&#xff09;&#xf…