linux高级编程(OSI/TCP)

OSI七层模型:

OSI 模型  --> 开放系统互联模型  --> 分为7层:
       理想模型  --> 尚未实现

        1.应用层  QQ
                       应用程序的接口
        2.表示层  加密解密  gzip
                       将接收的数据进行解释(机器->人)
        3.会话层  网络断开,连接状态,keep-close keep-alive
                       通信双方管理会话
        4.传输层:tcp  udp  协议  文件    视频,音频
                        控制数据传输节奏
        5.网络层ip   NAT
            实现数据从源经过多条链路到目的地的转发
        6.链路层  交换机  数据的格式化  帧 校验
                    将电信号封装,建立数据链路,实现点对点数据传输
        7.物理层:100Mb/8  Gbits   100MB 同轴电缆 10Gb    2.4G 5G
                     可通过物理介质传播的电信号

TCP/IP模型:

  TCP/IP模型  --> 网际互联模型   --> 分为4层:
      实用模型  --> 工业标准

        1.应用层  --->  应用程序(用户与应用程序的接口)
        2.传输层  --->  端口号tcp udp (流量传输控制,可靠性)
        3.网络层  --->  IP 地址(流量路由->地址解析,发送数据)(流量,互联网传播的数据量)
        4.接口层  --->  网卡 驱动  1GB(连结互联网的基础设施)

网络基础

IP地址 = 网络位 + 主机位
010 3333344444

IP地址的分类: 点分十进制   ipv4(4字节(32位)数据,42亿个地址,已耗尽) 
                 ipv6(16字节(128位)数据,地址很多,未耗尽

A类:    超大规模性网络
                    8    8    8    8
        1.0.0.0 - 126.255.255.255  126.1.1.1 
                                    126.1.1.2
        255.0.0.0    
        私有:
        10.0.0.0 - 10.255.255.255
        127.0.0.1
    B类:    大中规模型网络
        128.0.0.0 - 191.255.255.255
        128.2.1.2  128.2.7.2
        255.255.0.0
        私有:
        172.16.0.0 - 172.31.255.255

    C类:    中小规模型网络
        192.0.0.0 - 223.255.255.255
        255.255.255.0
        私有:
        192.168.0.0 - 192.168.255.255
        静态路由
        192.168.0.0
        192.168.0.1  网关
        192.168.0.255 

    D类:    组播和广播(广播:所有用户都能传播,组播:某个小范围组内能传播)

             (无子网掩码)
        224.0.0.0 - 239.255.255.255
        192.168.0.255 ==  255.255.255.255
        235.1.2.3
        192.168.1.0 
        192.168.0.1   网关
        192.168.1.255 广播 

    E类:    实验

            (无子网掩码)
        240.0.0.0 - 255.255.255.255

子网掩码:1代表网络部分,0代表主机部分

C 类网络:
     ip地址的前三组是网络地址,第四组是主机地址。
    二进制的最高位必须是: 110xxxxx开头
    十进制表示范围: 192.0.0.0 -223.255.255.255
    默认网络掩码:   255.255.255.0
    网络个数: 2^24 个 约 209 万个
    主机个数: 2^8  个 254 个+2 --> 1个是网关(网络地址.0 的下一个地址.1)                                                                                        另1个是广播(.255最后一个地址)
    私有地址: 192.168.x.x 局域网地址。

网络接口

1、socket  套接字 --> BSD socket --> 用于网络通信的一组接口函数。socket api  application interface --> 进程到进程 --> 实现主机到主机通信

2、ip+port 地址+端口===》地址用来识别主机
                             端口用来识别应用程序

          port分为TCP port / UDP port  范围都是: 1-65535(2^16,两个byte)
          约定1000 以内的端口为系统使用。

网络字节序

--> 大端排序(高位数据放在高地址处)(高地址:值较大的地址)

--> 主机 --> 小端(高位数据放在低地址处)(从小往大走)

数字转换函数:
    #include <arpa/inet.h>
    主机转网络:uint32_t htonl(uint32_t hostlong);
    ipv4 192.168.0.1 1~65535
                uint16_t htons(uint16_t hostshort);
    网络转主机:host to net long 
                net to host 
                uint32_t ntohl(uint32_t netlong);   //对应16位转换与32位转换
                uint16_t ntohs(uint16_t netshort);

    主机转网络:in_addr_t inet_addr(const char *cp);
        inet_addr("192.168.1.20");
        网络转主机:char *inet_ntoa(struct in_addr in);

字符串转换函数:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>

    主机转网络:in_addr_t inet_addr(const char *cp);
     cli.sin_addr
    inet_addr("192.168.1.20");
    网络转主机:char *inet_ntoa(struct in_addr in);

收发数据

1、模式  C/S 模式  --> 服务器/客户端模型(client/server)

server:socket()-->bind()--->listen()-->accept()-->recv()-->close() 
           创建套接字-->关联接口地址-->等待连接-->提取连接-->收、发-->关闭
client:socket()-->connect()-->send()-->close();
            创建套接字-->连接-->收、发-->关闭

socket()

int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符

参数:domain  地址族,PF_INET(协议族) == AF_INET(地址族,IPv4) ==>互联网程序
                      PF_UNIX == AF_UNIX ==>单机程序
      type    套接字类型:
                SOCK_STREAM  流式套接字 ===》TCP   
              SOCK_DGRAM   用户数据报套接字===>UDP
              SOCK_RAW     原始套接字  ===》IP
      protocol 协议 --> 0 表示自动适应应用层协议。

返回值:成功 返回申请的套接字id
        失败  -1;

bind()

2、int bind(int sockfd, struct sockaddr *my_addr, 
             socklen_t addrlen);
功能:如果该函数在服务器端调用,则表示将参数1相关
      的文件描述符文件与参数2 指定的接口地址关联,
      用于从该接口接受数据。

      如果该函数在客户端调用,则表示要将数据从
      参数1所在的描述符中取出并从参数2所在的接口
      设备上发送出去。

      注意:如果是客户端,则该函数可以省略,由默认
            接口发送数据。
参数:sockfd 之前通过socket函数创建的文件描述符,套接字id
      my_addr 是物理接口的结构体指针。表示该接口的信息。

      struct sockaddr      通用地址结构
      {
          u_short sa_family;  地址族
          char sa_data[14];   地址信息
      };

      转换成网络地址结构如下:
      struct _sockaddr_in    ///网络地址结构
      {
          u_short           sin_family; 地址族
          u_short           sin_port;   ///地址端口
          struct in_addr  sin_addr;   ///地址IP
          char               sin_zero[8]; 占位
      };

      struct in_addr
      {
          in_addr_t s_addr;
      }

      socklen_t addrlen: 参数2 的长度。
返回值:成功  0
             失败  -1;

bind传参要进行强转,在实际使用中,struct sockaddr过于底层,不方便处理,而struct sockaddr_in专门用于IPv4地址,所以一般用struct sockaddr_in来定义

#typedef struct sockaddr * (SA);

struct sockaddr_in ser;
int ret = bind(sockfd,(SA)&ser,sizeof(ser));

一般bind的操作为:

struct sockaddr_in ser,cli;
bzero(&ser,sizeof(ser));
bzero(&cli,sizeof(cli));
// 大小端转化 host to net short 
ser.sin_port = htons(50000);
ser.sin_addr.s_addr = inet_addr("192.168.203.128");
int ret = bind(sockfd,(SA)&ser,sizeof(ser));
if(-1 == ret)
{
    perror("bind");
    exit(1);
}

listen()

3、  int listen(int sockfd, int backlog);
    功能:在参数1所在的套接字id上监听等待链接。
    参数:sockfd  套接字id
          backlog 允许链接的个数。
    返回值:成功  0
                 失败  -1;

accept()

4、int accept(int sockfd, struct sockaddr *addr, 
                socklen_t *addrlen);
   功能:从已经监听到的队列中取出有效的客户端链接并
            接入到当前程序。
   参数:sockfd 套接字id
            addr  如果该值为NULL ,表示不论客户端是谁都接入。
                如果要获取客户端信息,则事先定义变量
               并传入变量地址,函数执行完毕将会将客户端
               信息存储到该变量中。
         addrlen: 参数2的长度,如果参数2为NULL,则该值
                     也为NULL;
                 如果参数不是NULL,&len;
                  一定要写成len = sizeof(struct sockaddr);
   返回值:成功 返回一个用于通信的新套接字id;
                从该代码之后所有通信都基于该id

           失败  -1;

接收函数/发送函数

  read()/write ()   ///通用文件读写,可以操作套接字。
  recv(,0) /send(,0)      ///TCP 常用套机字读写
  recvfrom()/sendto() ///UDP 常用套接字读写


ssize_t recv(int sockfd, void *buf, size_t len,
             int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
      为len字节的数据到指定的buff内存中。
参数:sockfd  
        如果服务器则是accept的返回值的新fd
        如果客户端则是socket的返回值旧fd
      buff 用来存储数据的本地内存,一般是数组或者
      动态内存。
      len 要获取的数据长度
      flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的数据长度,一般小于等于len
        失败  -1;

close()

6、close()  ===>关闭指定的套接字id;

客户端:

connect()

1、int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
   功能:该函数固定有客户端使用,表示从当前主机向目标
            主机发起链接请求。
   参数:sockfd 本地socket创建的套接子id
            addr 远程目标主机的地址信息。
         addrlen: 参数2的长度。
   返回值:成功 0
                 失败 -1;

send()

2、int send(int sockfd, const void *msg, 
        size_t len, int flags);
   功能:从msg所在的内存中获取长度为len的数据以flags
            方式写入到sockfd对应的套接字中。

   参数:sockfd:
               如果是服务器则是accept的返回值新fd
            如果是客户端则是sockfd的返回值旧fd

         msg 要发送的消息
         len 要发送的消息长度
         flags 消息的发送方式。

  返回值:成功  发送的字符长度
            失败  -1;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPS+Python爬取百度之星排名

运行效果 手动拉取 https://www.matiji.net/exam/contest/contestdetail/146 如果手动查找&#xff0c;那么只能通过翻页的方式&#xff0c;每页10行&#xff08;外加一行自己&#xff09;。 爬取效果预览 本脚本爬取了个人排名和高校排名&#xff0c;可以借助WPS或MS Offi…

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…

缺失行处理(R和python)

R(complete.cases) rm(listls()) # 创建一个包含缺失值的数据框 # df <- data.frame( # x c(1, 2, NA, 4), # y c(NA, 2, 3, 4), # z c(1, NA, 3, 3) # ) # # # 使用complete.cases函数筛选包含缺失值的数据行 # missing_rows <- !complete.cases(df) # # # …

Vue2前端实现数据可视化大屏全局自适应 Vue实现所有页面自适应 Vue实现自适应所有屏幕

Vue自适应所有屏幕大小,目前页面自适应,尤其是数据可视化大屏的自适应更是案例很多 今天就记录一下使用Vue全局自适应各种屏幕大小的功能 在Vue.js中创建一个数据大屏,并使其能够自适应不同屏幕大小,通常涉及到布局的响应式设计、CSS媒体查询、以及利用Vue的事件系统来处理…

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

通俗易懂的信道复用技术详解:频分、时分、波分与码分复用

在现代通信网络中&#xff0c;信道复用技术 扮演着至关重要的角色。今天&#xff0c;我们将用通俗易懂的语言来讲解几种常见的信道复用技术&#xff1a;频分复用、时分复用、波分复用 和 码分复用。这篇文章特别适合基础小白&#xff0c;希望能帮助你快速理解这些概念。 一、频…

Bean的管理

1.主动获取Bean spring项目在需要时&#xff0c;会自动从IOC容器中获取需要的Bean 我们也可以自己主动的得到Bean对象 &#xff08;1&#xff09;获取bean对象&#xff0c;首先获取SpringIOC对象 private ApplicationContext applicationContext //IOC容器对象 (2 )方法…

[算法] 优先算法(四):滑动窗口(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Springboot 敏感词过滤

参考&#xff1a;网站是怎么屏蔽脏话的呢&#xff1a;简单学会SpringBoot项目敏感词、违规词过滤方案_springboot 项目关键词过滤-CSDN博客 【敏感词过滤】_wx60d2a462203aa的技术博客_51CTO博客 1、添加依赖 <dependency><groupId>com.github.houbb</groupI…

模型训练之数据集

我们知道人工智能的四大要素&#xff1a;数据、算法、算力、场景。我们训练模型离不开数据 目标 一、数据集划分 定义 数据集&#xff1a;训练集是一组训练数据。 样本&#xff1a;一组数据中一个数据 特征&#xff1a;反映样本在某方面的表现、属性或性质事项 训练集&#…

输入Rviz打不开,显示could not contact Ros master at[..],retrying

直接输入rviz会报错无法打开 解决方法&#xff1a; 先输入roscore&#xff0c;再用ctrlaltt打开新终端&#xff0c;在新终端输入rviz/rosrun rviz rviz即可

深度学习3 基于规则的决策树模型

1.决策树是一种归纳学习算法&#xff0c;从一些没有规则、没有顺序、杂乱无章的数据中&#xff0c;推理出决 策模型。不管是什么算法的决策树&#xff0c;都是一种对实例进行分类的树形结构。决策树有三个要素&#xff1a;节点(Node)、分支(Branches)和结果(Leaf)。 训练决策树…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

VMware Workstation Pro 17.5.2 + license key

Workstation Pro是专为Windows操作系统设计的功能强大的虚拟化软件平台,它允许用户在其计算机上创建和运行虚拟机,这使他们能够同时与多个操作系统、应用程序和开发环境一起工作。 Workstation Pro的主要特点之一是其易用性,程序提供了直观的界面,允许用户轻松创建、配置和…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

Ubuntu24.04清理常见跟踪软件tracker

尽量一天一更&#xff0c;不刷视频&#xff0c;好好生活 打开系统监视器&#xff0c;发现开机有个tracker-miner-fs-fs3的跟踪程序&#xff0c;而且上传了10kb的数据。 搜索知&#xff0c;该程序会搜集应用和文件的信息。 删除tracker 显示带tracker的apt程序 sudo apt lis…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

基于Java+SpringMvc+Vue技术的图书管理系统的设计与实现(60页论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…

回顾 DTC 2024 大会——聚焦数据技术创新:揭秘下一代纯实时搜索引擎 INFINI Pizza

2024 年 4 月 12 日至 13 日&#xff0c;备受瞩目的第十三届“数据技术嘉年华”&#xff08;DTC2024&#xff09;在北京新云南皇冠假日酒店盛大开幕。本次大会由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办&#xff0c;以“智能云原生一体化——DB 与 AI 协…