回顾:
进程间的通信:
同一主机内通信:
传统的进程间通信方式(管道、信号);
IPC对象(共享内存,消息队列,信号量集);
不同主机间进程的通信:
IP地址:
作用:用来标识网络中一台主机的,解决了如何在网络中找到一台主机
IP地址 == 网络位 + 主机位
IP地址的分类: 点分十进制(方便人看) ipv4 712934
网关(局域网的门)192.168.0.1 // ip地址 与 子网掩码(默认网络掩码:255.255.255.0) 与运算 192.168.0.0(网络号)
设备(路由器)--- 路由(route)--- 网络路径的选择
192.168.0.255 boardcast广播 全发
C类地址最多连接254台主机
端口号:
编号----16位的数据、2个字节、范围:0~65535
作用:唯一标识计算机中用于通信的某个进程的
IP + 端口号 --》网络中通信的进程 //地址
源IP + 源端口 《=》目标IP + 目标端口
通信的四元组
网络链接:
物理层面:
有线 -- wifi -- 宽带(光纤)--- 光信号
5G -- 毫米波
逻辑层面:
osi标准(open system interconnect)
OSI 模型 ===》开放系统互联模型 ==》分为7层:
7应用层
6表示层 加密解密 gzip
5会话层 网络断开,连接状态,keep-close keep-alive
4传输层tcp udp 协议 文件 视频,音频 ipx
3网路层ip NAT 网际层
2链路层 交 换机 数据的格式化 帧 校验
尾|1010 1010|头 --- 帧格式。
1物理层 100Mb/8 10Gbits 100MB 同轴电缆,发送比特流
TCP五层或四层结构
举例:网络的封包和解包
每一层都封包协议,因为要保证各个层的功能实现,这是由协议实现的
协议:
IP--》mac地址 //ARP地址解析协议 ,mac地址就是物理地址
mac地址--》IP // 反向地址协议
IPV4 标准,因为只有32位 不够用了 ----》ipv6 128位可以解决ip地址不够用的问题
TCP/UDP协议:
TCP(Transmission Control Protocal)
特点:(1.面向连接 2.可靠连读,3.字节流) //字节流 一个字节一个字节发
通过内部各层特性保证数据正确性
socket
1、socket函数接口-系统调用
2、socket是一种特殊的文件,专门用于“网络通信,用于不同主机间进程的通信,相同主机也可以
3、socket是网络通信中,抽象出来的函数接口。
基于TCP的模型:
两种常见的网络通信模型:
1、C/S client - server 客户端/服务器模型 专有的客户端
2、B/S browser - server 浏览器--通用的客户端
tcp通信 步骤
1、进行连接 2、进行通信
举例
客户端://主动的一方,发起通信请求 服务器端:
socket //买了一部手机 socket 买了一部手机
bind (可选) 绑定一个sim卡 bind 绑定sim卡
connect 拨打电话 listen 待机 -- 来电
write 收发消息 accept 接听电话
read write
close read close
1、socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:程序向内核提出创建一个基于内存的套接字描述符
参数:
@domain 地址族,PF_INET == AF_INET ==>互联网程序
PF_UNIX == AF_UNIX ==>单机程序
@type 套接字类型:
SOCK_STREAM 流式套接字 ===》TCP
SOCK_DGRAM 用户数据报套接字===>UDP
SOCK_RAW 原始套接字 ===》IP
@protocol protocol 协议 ==》0 表示自动适应应用层协议。
返回值:成功 返回申请的套接字id ;失败 -1。
网络接口
1、sokcet 套接字 ==》BSD socket ==》用于网络通信的一组接口函数。
2、ip+port 地址+端口===》地址用来识别主机
bzero
结构体清零
#include <strings.h>
void bzero(void *s, size_t n);
inet_addr()
将ip地址转换为二进制 并以网络字节序(大端)放置
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
htonl
#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort); 将端口转换为字节序放置
2、bind()
#include <sys/types.h>
#include <sys/socket.h>
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 的长度。