进程间通信方式:
1.同一主机
传统:
管道:有名管道,无名管道
信号
IPC:
共享内存
信号量
信号队列
2.不同主机
socket ---不同主机之间的通信 //网络
eg:
两个电脑进行通信,找到对方的电脑,并且找到电脑中的进程
物理基础 --- 物理层面的联通,通路
5g、4g、有线网络(光纤)、卫星通信
软件层面联通 --- 软件上的规定(协议) --- 网络协议
APRA(阿帕网)
早期的ARPA网使用NCP(Network Control Protocol)协议
不支持不同类型的操作系统,不同类型的计算机之间的通信,不支持纠错功能
OSI模型:
Open System Interconnect (开放系统互连参考模型),为了解决不同体系结构的网络的互联问题
分为7层 --->理想模型
7.应用层
6.表示层 //加密传输的需要 --- 数据的格式化,加密解密(gzip)
5.会话层 //连接状态:长连接,短链接,连接的质量问题
网络断开,连接状态,keep-close keep-alive
4.传输层 //传输控制协议
TCP、UDP、协议、文件、视频、音频
TCP:下载文件,传输文件
UDP:音频,视频
3.网络层
IP NAT //怎么找到对方
2.数据链路层 (封装成帧+差错控制)
交换机 --- 全双工,实时的工作
数据的格式化 --- 大量数据交换时,字节为单位,字节大小端
帧
校验
1.物理层 bit流
说明:
1.物理层:
主要定义物理设备标准
如:网线的接口类型,光纤的接口类型,各种传输介质的传输速率
主要作用是:传输彼特流
就是由1,0转化为电流强弱来进行传输,到达目的地之后再转化为1,0,就是数模转换与模数转换,这一层数据叫做"比特"
一帧
0101 0110
2.数据链路层:
定义了如何让格式化的数据以帧为单位进行传输,以及如何让控制对物理介质的访问,这一层通常还提供错误检测和纠正,以确保数据的可靠传输
这一层传输的数据:
帧数据 (按到一定格式组织起来的一组数据)
3.网络层(路由器)
给在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择,internet的发展使世界各地访问信息的用户数增加。网络层就是管理这些连接的层
路由器就是在这一层工作
这一层传递的数据"
数据包(段)
4.传输层:transmit control
定义了一些传输数据的协议和端口号
如:
TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据)
UDP(用户数据报协议,于TCP相反,用于传输可靠性要求低,数据量小的数据)
主要是将从下层接收的数据进行分段和传输,到达目的地之后再进行重组
常常把这一层数据叫做段
传输控制层 --- 控制传输过程 --- 根据实际需要 --- 通过不同的协议来实现
5.会话层
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路,主要在系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
6.表示层
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取
例如,
PC程序与另一台计算机进行通信,
其中一台计算机使用扩展二一十进制交换码(EBCDIC),
而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。
如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换
7.应用层
最靠近用户的OSI层,这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务
实际情况
TCP/IP模型:网际互连模型(4层)
实用模型:工业标准
TCP/IP协议栈
应用层 --- 应用程序
传输层 --- 端口号,TCP/UDP
网络层 --- IP地址
物理层 --- 网卡,驱动
4层--- tcp/ip -标准
应用层 --- 应用程序
传输层 --- 端口号,TCP/UDP
网络层 --- IP地址
网络接口层 --- 网卡,驱动
5层 osi 与 tcp/ip 模型之间的一种非标准形式
应用层 --- 应用程序
传输层 --- 端口号,TCP/UDP
网络层 --- IP地址
数据链路层
物理层 --- 网卡,驱动

函数接口:socket
1.socket是一个函数接口,用来使用网络功能的
2.linux一切皆文件的思想---socket也是一种特殊的文件----专门用来进程网络通信的文件
linux网络编程:
基于TCP协议,基于UDP协议
TCP协议:
TCP(transmit control protocol):(类似 打电话)---可靠(1.面向连接 2.可靠传输 3.字节流)
特点:
1.面向连接:就是在进行通信之前,必须建立好一条逻辑上的通路
2.提供可靠传输:四个"无",无丢失,无失序,无差错,无重复
3.字节流
建立连接:
三次握手,目的:建立连接

应用场景:
1.对可靠性要求较高的场合
2.QQ微信等 软件的登录时
UDP协议:
UDP(User Datagram Protocol):(类似 生活中的广播)
特点:
不通过可靠传输,在数据发送时,不需要建立连接
1.无连接
2.不保证可靠传输
3,数据报
应用:
1.小数据,但是对速度要求较高,(QQ.及时文本信息,语音等),实时性要求较高场合
2.广播,组播
3.无线网的传输
网路编程
TCP
cpp
通信模型 --- CS 模型 (Client Server 客户端服务器模型) ----重点
BS 模型 (Browser Server 浏览器服务器模型)
P2P模型 (Peer to Peer 点对点)
CS通信模型:
TCP通信过程:
两个阶段:1.建立连接,2.通信
客户端:客户端一般都是主动的一方
1.socket
bind(可选)
2.connect
3.read / write
4.close
服务器端:
1.socket
2.bind
3.listen
4.accept
5.read / write
6.close
cpp
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:创建通信的一端
参数:
@domain:
cpp
Name Purpose Man page
AF_UNIX, AF_LOCAL Local communication unix(7)
AF_INET IPv4 Internet protocols ip(7)
AF_INET6 IPv6 Internet protocols ipv6(7)
@type:
SOCK_STREAM //流式套接字,TCP协议使用
SOCK_DGRAM //数据报套接字,UDP协议使用
@protocol
协议:TCP / UDP,给0表示默认协议(根据type来决定)
返回值:
成功 返回socket的文件描述符
失败 -1 && errno被设置
2.connect
cpp
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:发起连接请求
参数:
@sockfd 用到的socket的fd
@addr 要通信的地址,对于客户端来说,就是服务器的地址(IP+端口号)
@addrlen 表示addr参数地址的大小
返回值
成功 0
失败 -1,并且errno被设置
cpp
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address -- ip地址 */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
字节序:
网络字节序:大端
将端口号转换为网络字节序的端口号
cpp
htons
uint16_t htons(uint16_t hostshort);
功能:将hostshort值转换为网络字节序并返回
将IP地址转换为网络字节序的IP地址
cpp
inet_addr
in_addr_t inet_addr(const char *cp);
功能:将字符串形式的IP地址(点分十进制)转换为网络字节序形式的IP地址并返回
网络中的地址:
IP地址:
1.IP地址是网络中主机的唯一标识,它由网络地址和主机号组成,网络地址是子网的唯一标识,类似于区号,主机号是子网内每台主机的编号,
IP的本质:在现在(IPv4)的网络中,IP地址是32bit的二进制数,采用大端字节序.
2.表示方法(点分十进制)
将32位二进制码划分为4个字节,每个字节转化成相应的十进制数,字节之间用"."来分隔
3.IP地址的分类
A、B、C、D、E
4.子网掩码
作用:用来区分网络号,也可以获取主机号
进程:
网络中找到主机(IP),找到主机中的进程(端口号)
端口号
作用:用来标识一个网络进程
ip+端口号 ==> 网络中进程的唯一地址
服务器端:
cpp
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:给sockfd绑定一个名字(地址信息)
参数:
@sockfd 用到的socket的fd
@addr 要通信的地址,对于客户端来说,就是服务器的地址(IP+端口号)
@addrlen 表示addr参数地址的大小
返回值:
成功 0
失败 -1并且errno被设置
cpp
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:将sockfd设置为监听套接字(被动套接字)
参数:
@sockfd 要设置的socket
@backlog 表示等待队列的大小
返回值:
成功 0
失败 -1并且errno被设置
cpp
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:从listen的等待队列中提取第一个连接请求,完成连接,同时创建一个socket表示已经连接好的socket,最后返回这个已经连接好的socket的fd
参数:
@sockfd 监听套接字的fd
@addr 用来保存对端地址信息
@addlen 值结果参数,必须初始化(sizeof(客户端地址类型))
返回值:
成功 返回已经连接好的socket的fd
失败 -1并且errno被设置
如果想知道客户端的地址信息
cpp
struct sockaddr_in cliaddr;
socklen_t addrlen = sizeof(cliaddr);
accept(sockfd, ( struct sockaddr *)&cliaddr, &addrlen)
cpp
char *inet_ntoa(struct in_addr in);
功能:将网络字节序的IP地址转换为字符串形式的IP地址并返回
注意:
客户端 只有一个socket
服务器 有两个socket,1.监听的socket,2.通信的socket