TCP协议和UDP协议
TCP是面向连接,可靠的传输层协议。
UDP是无连接的,不保证可靠的传输层协议。
TCP的三次握手:
TCP的四次挥手:
TCP如何保证可靠性:
- 预备知识
- Socket
- IP地址
IP地址用于区分不同主机的
- 端口号
端口号用于区分不同进程。
TCP端口号与UDP端口号独立,TCP端口号和UDP端口号允许相同。
- 字节序
CPU架构决定了字节序。
- 系统调用
- 创建套接字
成功:返回创建的套接字文件描述符,失败:返回-1。
- 绑定IP地址和端口号
- 设置监听套接字(将主动套接字改为被动套接字)
- 接受客户端的连接
- 客户端连接服务器
- 发送消息
- 接收消息
关闭套接字
- IO模型
- 阻塞IO
-
缺省情况下,套接字创建后所处的IO模式就是阻塞IO。
对于接收函数,如果对端没有发送数据,接收函数就会阻塞不返回。
对于发送函数,如果发送数据大小大于发送缓冲区剩余空间大小,发送函数就会阻塞不返回。
优点:简单,常用。
缺点:如果对端不发送消息,或者对端崩溃了,接收函数就会挂住不返回,不能处理其他业务。
- 非阻塞IO
-
对于接收函数,如果对端没有发送数据,接收函数会返回错误。
对于发送函数,如果发送数据大小大于发送缓冲区剩余空间大小,发送函数会返回错误。
while (1) {
ret = recv();
if (ret < 0 && errno == EAGAIN) {
// 没有数据可读
continue;
}
// 对读取到的数据做处理
……………
}
优点:可防止进程阻塞在I/O操作上。
缺点:需要循环不停检测是否有数据,很浪费CPU资源。
- 信号驱动IO
-
void sig_handler(int signo)
{
recv();
}
signal(SIGIO, sig_handler);
- IO多路复用
-
Linux进程默认能打开1024个文件,对应1024个文件描述符。
文件描述符的特点:
- 文件描述符都是非负的整数
- 文件描述符一般从小到大分配
- select
- poll
- epoll
- 创建一个文件描述符集合,集合里有1024个bit位,对应1024个文件描述符。每一个文件描述符对应一路IO通道。将关注的.文件描述符加入文件描述符集合,就是将文件描述符对应的bit位置1,其余文件描述符对应的bit位置为0。
- 调用select监控文件描述符集合,如果关注的文件描述符上有数据发生,将文件描述符对应的bit位置1,其余bit位置0,返回有数据发生的文件描述符的数量。
- 循环遍历select返回的文件描述符集合,用FD_ISSET判断关注的文件描述符上是否有数据发生,如果有数据发生,处理对应文件描述符IO通道上的数据。