Linux——网络(1)

一、IPC(进程间通信方式)

IPC:Inter Process Communication

共享内存(最高效的进程间通信方式)

虚拟地址 mmu(memory management unit )

共享内存:

1.是一块,内核预留的空间

2.最高效的通信方式

(避免了用户空间 到 内核空间的数据拷贝)

二、IPC通信方式 ---操作流程类似的操作

system v : 共享内存

IPC对象操作通用框架:

key值 ==> 申请 ==》读写 ==》关闭 ==》卸载

1、产生key值

key_t ftok(const char *pathname, int proj_id);

功能:

将pathname 和 proj_id 转换为 key值

参数:

@pathname //给一个路径名

@proj_id //工程id eg: 'A'

返回值

成功 key值

失败 -1

2、通过key获取ipc对象 (共享内存)

申请对象:shmget() shared memory get

int shmget(key_t key, size_t size, int shmflg);

功能:

使用唯一键值key向内核提出共享内存使用申请

参数:key 唯一键值

size 要申请的共享内存大小

shmflg 申请的共享内存访问权限,八进制表示

如果是第一个申请,则用IPC_CREAT

如果要检测是否存在,用IPC_EXCL

返回值:

成功 返回共享内存id,一般用shmid表示

失败 -1;

share memory attach

3、共享内存 绑定

映射对象:shmat()

void *shmat(int shmid, const void *shmaddr, int shmflg);

功能:将指定shmid对应的共享内存映射到本地内存。

参数:shmid 要映射的本地内存

shmaddr 本地可用的地址,如果不确定则用NULL, 表示由系统自动分配。

shmflg 0 , 表示读写

SHM_RDONLY, 只读

返回值:

成功 返回映射的地址,一般等于shmaddr

失败 (void*)-1

4、解除绑定(映射)

撤销映射:shmdt

int shmdt(const void *shmaddr);

功能:将本地内存与共享内存断开映射关系。

参数:shmaddr 要断开的映射地址。

返回值:成功 0

失败 -1;

5、销毁IPC对象

删除对象:shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf); //ctl = control

功能:

修改共享内存属性,也可以删除指定的共享内存对象。

参数:shmid 要删除的共享内存对象

cmd IPC_RMID 删除对象的宏

buff NULL 表示只删除对象。

返回值:成功 0

失败 -1

三、实现网络通信

1.物理层面

有一个信息通路

  1. 有线
  2. 无线 5G、4G、星链

2.软件层面(逻辑层面)

也需要 一个通路

3、osi七层模型

osi参考模型

  1. 物理层

规定了物理层面的电气特性及相关机械特性

物理层面数据的传输 --- 一位一位二进制数据 //比特流

  1. 数据链路层

规定了 传输数据的格式 //帧数据

//控制传输过程可靠

  1. 网络层 (网际层)

用于解决 网络 与 网络之间 数据传输 //数据包

  1. 传输层

传输控制层,控制传输过程,保证数据完整和可靠

  1. 会话层

处理一次会话过程

  1. 表示层

规定了 传输数据的格式 和 方式 //加密

  1. 应用层

就是直接获取要收发的数据

实际应用到的是 tcp/ip 模型

  • 应用层
  • 传输层
  • 网络层
  • 数据链路层
  • 物理层

4层模型

  • 应用层
  • 传输层
  • 网络层
  • 网络接口层

每个层次中,都有自己的一套规范 --- 协议

操作系统角度:

用户层 应用层 <---- 程序员

-----------------[socket]----------------------

内核层 传输层 //这些层次 操作系统已经实现

网络层 //tcp/ip 协议 栈 (网络协议栈)

数据链路层

物理层

4、IP (用来标识网络中的一台主机)

通过ip可以找到对应一台主机

本质: 32位整型数值

表示方式 点分十进制 ( 0~255)

ip地址的组成:

网络号 + 主机号

网络号 ---表示所处的网络

主机号 ---表示能容纳的主机

端口号 (用来表示主机中某一个具体(进行网络通信)进程 )

ip+端口 //进程在网络的 地址

5、网络编程

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数

据无误、数据无丢失、数据无失序、数据无重复到达的通信)

适用情况:

  1. 适合于对传输质量要求较高,以及传输大量数据

的通信。

  1. 在需要可靠数据传输的场合,通常使用TCP协议

  2. QQ等即时通讯软件的用户登录账户管理相关

的功能通常采用TCP协议

tcp协议特点:

  1. 面向连接 //类似打电话通话之前 ,必须先打通

  2. 可靠传输 //保证数据准确可靠 (tcp协议机制 里面的功能 )

  3. 面向字节流程

UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。

在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输。

适用情况:

  1. 发送小尺寸数据(如对DNS服务器进行IP地址查询时)

  2. 在接收到数据,给出应答较困难的网络中使用UDP。(如:无

线网络)

  1. 适合于广播/组播式通信中。

  2. MSN/QQ/Skype等即时通讯软件的点对点文本通讯以及音视频通

讯通常采用UDP协议

  1. 流媒体、VOD、VoIP、IPTV等网络多媒体服务中通常采用UDP

方式进行实时数据传输

UDP特点:广播

1.不可靠

2.无连接

3.数据报

6、编程

编程模型

c/s client server 客户端,服务器模型 --- 专用客户端

b/s browser server 浏览器,服务器模型 --- 通用的客户端

p2p peer to peer 点对点传输

基于UDP c/s通信模型:

//client ---客户端 --- 角色 --- 主动的角色

socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)

//2.socket 编程接口 --- socket 函数

//提供了一个可以访问 操作系统 网络功能的接口

sendto //发数据

//server --- 服务器端 --角色 --- 被动的角色

recvfrom //接收数据

1)、socket

int socket(int domain, int type, int protocol);

功能:程序向内核提出创建一个基于内存的套接字描述符

参数:

//domain --域 (范围) ---socket 用于什么范围的通信

// ipv4

// ipv6

domain 地址族,PF_INET == AF_INET ==>互联网程序

PF_UNIX == AF_UNIX ==>单机程序

type 套接字类型:

SOCK_STREAM 流式套接字 ===》TCP

SOCK_DGRAM 用户数据报套接字===>UDP

SOCK_RAW 原始套接字 ===》IP

protocol 协议 ==》0 表示自动适应应用层协议。

返回值:

成功 返回申请的套接字文件描述符

失败 -1

ssize_t sendto( int sockfd, //用于通信的socket对应的fd

const void *buf, //表示要发送的数据所在的一块空间

size_t len, //表示发送的字节数

int flags, //0 --- 默认

const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )

socklen_t addrlen //表示dest_addr 这个参数的长度

);

返回值:

成功 发送出去的字节的数

失败 -1

2)、端口号

16位数值(unsigned short ) //0~65535 (65536个数) //标示一个进程

TCP和 UDP 的端口号是独立的

(1) 作用

唯一的标识一个进程

每一个应用程序进程有一个端口号,

通讯时区分数据包属于哪个应用程序进程

(2) 分类

端口号一般由IANA (Internet Assigned NumbersAuthority) 管理

众所周知端口:

1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)

知名端口号(已经分配给标准应用服务软件)

如:

http协议用到的端口号 80

已登记端口:

1024~49151

注册端口号(非标准应用服务软件的软件可以申请的端口号范围)

动态或私有端口://50000 以上的端口号

49152~65535 动态分配的端口号(系统动态分配给应用程序使用的)

(3) 长度

2字节(16bit)

数字转换函数:

主机转网络:

uint32_t htonl(uint32_t hostlong);

ipv4 192.168.0.1 1~65535

uint16_t htons(uint16_t hostshort);

网络转主机:host to net

net to host

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

htonl --- h(host) to n(network) l (long) //32位的数据

htons --- h(host) to n(network) s (short) //16位的数据

ntohs --- n(network) to h(host) s (short)

字符串转换函数:

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

主机转网络:

in_addr_t inet_addr(const char *cp);

inet_addr("192.168.1.20");

cli.sin_addr

网络转主机:char *inet_ntoa(struct in_addr in); //a -- ascii

相关推荐
陈大爷(有低保)12 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
爱吃涮毛肚的肥肥(暂时吃不了版)17 分钟前
计算机网络34——Windows内存管理
网络·计算机网络·udp
kinlon.liu25 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
gopher95111 小时前
linux驱动开发-中断子系统
linux·运维·驱动开发
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode