网络:不同主机,进程间通信
目的
1, 解决主机之间的硬件层面的互联互通
2,解决主机间软件层面的互联互通
IP地址:区分不同主机(软件地址)
MAC地址:硬件地址
端口号:区分同一主机上的不同进程
协议:定义的网络标准
网络协议
1,OSI七层模型
OSI:开放系统互联模型
应用层:要传输的数据信息,如文件传输,电子邮件等
表示层:数据加密,解密操作,压缩,解压缩
会话层:建立数据传输通道
传输层:传输的方式UDP TCP 端口号
网络层:实现数据路由 路由器ip
数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP
物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流bit 0 1
2,TCP/IP模型(五层模型)
应用层:
HTTP:超文本传输协议
HTTPS:超文本传输协议
FTP:文件传输协议
TFTP:简单文件传输协议
MQTT:消息队列遥测传输协议(物联网协议)
传输层:
UDP:用户数据报协议
TCP:传输控制协议;
DNS:域名解析协议(域名和ip地址转换)
网络层:
IP协议:IPv4,IPv6
网络接口层
ARP:地址解析协议
IPv4: 32位 192.168.1.23 ---》点分十进制
IPv6: 128位:解决IP地址不够用问题
ipv4的:
网络位:子网掩码全为1的位是ip地址的网络位
主机位:子网掩码全为0的位是ip地址的主机位
端口号:16位的数据 0~65535,用于区分数据包属于哪个进程
数据链路层:
物理层:
网络配置
1,虚拟机---》设置----》网络适配器---》桥接模式
2,编辑----》虚拟网络编辑器----》更改设置 ---》VMnt0----》桥接至---》PC正在上网的网卡----》应用---》确定
3,配置网络文件
打开网络配置文件:
sudo vim /etc/network/interfaces
auto loiface lo inet loopback
auto ens33iface ens33 inet dhcp
重启网络服务
sudo /etc/init.d/networking resta1t
4,网络相关命令
ping IP/域名
www.baidu.com
ifconfig:查看当前主机ip地址
网络协议:
传输层协议:
1.UDP(User Datagram Protocol)协议:用户数据报协议
User Datagram Protocol
2,网络编程框架
B/S模型:browser/server(浏览器/服务器)通用的客户端(浏览器)----专业的服务器
C/S模型:client/server(客户端/服务端)专用的客户端-----专用的服务器
3,UDP编码
client / server
网络套接字:文件描述符,代表了底层封装出来的用于网络通信收发数据的端口。
UDP特点:
1,尽最大努力交付(不安全,不可靠(丢包,乱序))
2,无连接
3,面对数据报
4,机制简单,传输效率高
应用场景:
要求实时性高,但是允许数据丢失(eg:直播)
4,函数接口
int socket(int domain, int type, int protocol); ***
功能:创建一个通信套接字参数:
domain:IP层协议族
AF_INET:IPv4
AF_INET6:IPv6
type:传输层使用的协议类型
SOCK_DGRAM: UDP
SOCK_STREAM: TCP
protocol: 0 按照默认协议方式
成功:返回套接字
失败:返回-1
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:向套接字发送数据参数
sockfd:套接字
buf:要发送的数据的首地址
len:要打送的数据的大小
flags:0 默认方式发送
dest_addr:保存接收方地址信息的指针
socklen_t addrlen:接收方地址变量的大小
返回值
成功:实际发送的字节数
失败:-1
网络字节序:大端
主机字节序:小端
uint32 thtonl(uint32 t hostlong);主机转网络
uint16 t htons(uint16 t hostshort);主机转网络
uint32 t ntohl(uint32 t netlong);网络转主机
uint16 t ntohs(uint16 t netshort);网络转主机
bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen)
功能:绑定当前主机的ip和进程的端口
参数: sockfd:套接字
addr:自己信息的地址
addrlen:地址信息的大小
返回值:成功:0失败:-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:从套接字接收数据参数:
sockfd:套接宁buf:存储接收到数据的位置的首地址
len:期待接收到的字节数
flags:默认方式:0
src addr:送发地址信息的首地址
返回值:
成功:实际接收到的字节数
失败: -1
2,TCP :传输控制协议
UDP | TCP |
面向数据报 | 面对数据流(流式套接字) |
不安全不可靠 (尽最大努力交付) | 安全可靠的传输协议 |
无连接 | 建立连接 |
三次握手:TCP建立连接时,需要进行三次握手,确保收发数据前,双方都已准备就绪
四次挥手:TCP断开连接时,需要进行四次挥手,从而确保通信双方都已收发数据结束
TCP编程:
C/S模型:
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从TCP套接字接收数据参数
sockfd:套接字
buf:保存接受数据内容的首地址
len:期待接收到的字节数
flags:0:默认方式
返回值
成功:实际收到的字节数
失败:返回-1
0:当发送端套接字关闭时,recv将不在阻塞,返回0;
int listen(int sockfd, int backlog);
功能:监听套接字
参数
sockfd:监听套接字
backlog:最多允许同时访问的客户端个数
返回值:
成功 : 0
失败: -1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:接收建立三次握手的客户端并产生与之通信的套接字参数:
sockfd:监听套接字
addr:保存客户端地址信息的变量指针
addrlen:客户端地址大小的变量指针
返回值
成功:返回通讯套接字
失败:-1
HTTP协议:超文本传输协议
万维网www:大规模的联机式的信息储存所 英文名 web(服务器)
1,万维网服务器如何标记万维网文档?----->url:统一资源定位符
2,万维网客户端和万维网服务器如何通信?------>http:超文本传输协议
3,万维网客户端如何显示数据?------>heml:超文本标记语言
URL:
eg : https://mp.csdn.net/mp_blog/creation/editor/145919630?spm=1001.2014.3001.45
https://www.baidu.com/------>主页
应用层:
HTTP协议:浏览器与服务器直接的通信标准
端口号:80
传输层:tcp协议
2,HTTP报文格式:
连接方式:
Connextion:keep-alive
http的(tcp)连接方式
keep-alive:长连接,服务器不会立马断开,会等待一段实际断开
close:短链接,服务器在发送完数据的时候立马断开
(记上3~4个方法)
单循环服务器:服务器同一时刻只能相应一个客户端的请求
并发服务器:服务器同一时刻可以相应多个客户端的请求
UDP:无连接
TCP:有连接
构建TCP并发服务器:
让TCP服务端具备同时响应多个客户端的能力。
1多进程
资源消耗大,同资源平台下,并发量小
2多线程
创建线程,进程比较耗时
3,线程池
提前预创建大量线程,避免任务执行过程中创建线程的耗时问题
4,IO多路复用
在不创建新的进程和线程的前提下,可以在一个进程中
同时检测多个IO(文件描述符fd/sockfd/connfd)
阻塞IO:read,recv,fgets,recvform
IO多路复用(转接):
在不创建新的进程和线程的前提下,可以在一个进程中同时检测多个IO
(文件描述符fd/sockfd/connfd)
优势:节省资源
不足:不利于处理比较耗时,延时比较长的任务
1,创建文件描述符集合
2,将关注的文件描述符加入到集合中
3,等待IO事件到达(调取函数)
4,根据不同的IO事件处理不同的任务
select:实现IO多路复用
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);功能:阻塞等待IO事件,返回事件结果
参数:
nfds:关注的最大文件描述符+1
readfds:文件描述符读事件集合表
writefds:写事件集合表
exceptfds:其他事件集合表
time out :超时时间(不设置超时则置为空NULL)
返回值
成功: 返回到达的事件个数
失败:-1
返回 0:超时时间到达但没有IO事件到达
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
select不足之处
1,使用位图管理文件描述符,最多允许同时检测1024个文件描述符(有上限)
2,文件描述符集合在应用层创建,需要实现应用层和内核层的反复拷贝
3,需要应用层对集合表进行遍历,寻找到达的事件
4,只能工作在水平触发模式(低速模式),不能工作在边沿触发模式(高速模式)