目录
1. UNIX的 5 种IO模型
1.1. 基本概念
-
同步与异步:
- 同步:
- 异步:
-
阻塞与非阻塞
- 阻塞:
- 非阻塞:
1.2. UNIX–5 种I/O模型
- 5 种IO
- blocking IO
- nonblocking IO
- IO multiplexing
- signal driven IO
- asynchronous IO
1.2.1. 介绍
-
IO multiplexing 多路复用IO
- 单个Process可以处理 多个网络连接的IO;
- select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达,然后通知用户进程;
-
signal driven IO 信号驱动I/O
- 进程通过接受到的信号确认数据是否准备就绪;
-
asynchronous IO
- 进程不受阻塞,将任务交给内核处理;
- 数据的拷贝在内核进行;
1.2.2. 对比 & 区别
- blocking IO & nonblocking IO
- 优点:等待任务完成的时间里,“后台”可以进行多个任务;
- 缺点:任务完成的响应延迟 增大了,导致整体数据吞吐量降低;
注意:
- IO多路复用+多线程处理基本满足 高性能并发服务程序;
- IO多路复用 比 异步IO 更加常用;
2. 线程模型
- 阻塞式I/O服务模型
- Reactor模式
- Proactor模式
3. 套接字编程
- 概述
- UNIX/Linux的网络连接可以看成一个文件,拥有文件描述符,相当于windows系统中的 “文件句柄”;
3.1. socket的类型:
-
Internet域套接字
- 流格式(sock_stream): 可靠的双向通信数据流,数据损坏或丢失可以重新发送;
- 数据报格式(sock_dgram): 计算机只管传输数据,不进行数据校验;
-
Unix域套接字
同一台机器上的进程之间的通信,Internet域也可以完成,但UNIX域效率更高;
3.2. 面向连接和无连接的套接字
- 面向连接
- 在正式通信之前,先确定路径;
- 优势:可靠,万无一失,传输效率低,耗费资源多;
- 使用场景:(TCP服务)HTTP、FTP服务等;
- 无连接套接字
- 传输效率高,但不可靠,有丢失数据包、捣乱数据的风险;
- 使用场景:(UDP服务),DNS,即时聊天工具;
3.3. 网络模型
3.3.1. 网络通信中确认身份
- IP地址、
- MAC地址
- 端口号
- web服务:80
- ftp服务:21
- smtp服务:25
4. 套接字编程
4.1. 基本概念和原理
- 网络数据的大小端问题:
- 大端序: 高位字节存储在低位地址;-- 高字节在前
- 小端序: 高位字节存储在高位地址;-- 低字节在前
4.2. 函数
- int bind(int sock, struct sockaddr *addr, socklen_t addrlen);
- connect() 函数
- 用于建立连接;
- listen()
- 让套接字进入被动监听状态;
- accept()函数
- 当套接字处于监听状态,该函数用于接收用户请求;
4.3. 发送数据 & 接收数据
-
Linux
- Linux 不区分套接字文件和普通文件;
- 使用write() 向套接字中写入数据,使用read() 从套接字中读取数据;
-
函数说明
4.4. socket缓冲区以及阻塞方式
4.4.1. 缓冲区
- socket 建立以后,会分配输入缓冲区和输出缓冲区;
- 数据先发送到缓冲区,而不是直接发送到网络;
4.4.2. 阻塞方式
4.4.3. TCP协议的粘包问题
-
问题
-
解决方法
5. TCP协议与套接字
3次握手,4次挥手;