知识点
1 分客户端和服务端
2 用网线类比socket
3 参数基本是网络层和传输层的
4 指定IP协议 V4 or V6 , AF_INET AF_INET6 , TCP是数据流 SOCK_STREAM , UDP是数据报 , SOCK_DGRAM
5 服务端bind (ip,port) , 为什么要bind ip , 因为一台机器可能有多张网咖
6 服务端有两个socket队列 , 一个是已建立连接的 , 一个是处于syn_rcvd的
7 服务端accept是什么时候调用?
8 客户端 conn(ip,port) , 会分配临时端口 , 服务端的 accept会返回新的socket , 和监听的socket不是同一个
9 通过write read 像文件流一样
10 socket时序图
11 socket就是一个文件流 , socket在linux中是文件形式存在的 , 也有文件描述符fd , 通过fd读写
12 每个进程都有一个fd数组 , fd是整数 , 指向这个数组的下标
13 数组里的内容是指针 , 指向文件 , 文件有inode , 真正的文件是保存在硬盘上 , socket的是在内存里的一个数据结构
14 什么是sk_buff
15 socket的发送队列和接收队列
16 socket队列图
17 udp也需要ip和port 也需要bind , 但是只有一个socket
18 调用sendto和recvfrom 发送 , 可以发给组播地址 , 就是一对多的
19 最基本的交互 : while死循环等待接收和发送 ,只能处理一个socket
20 最大连接数的计算 = 客户端最大ip数 2^32 * 最大端口数 2^16
21 四元组 ip port remote ip remot port , 只有remot ip 和remote port 在变化
22 tcp会被文件描述符数量限制 , ulimit配置上限 , 内存也会限制tcp数量
23 改进知识点19 , 多进程, 创建子进程 , 把socket交给子进程
24 fork创建子进程 , 返回0子进程 , 其他父进程
25 父进程创建子进程的多进程 结构图
26 改进知识点13 多线程 , 共用父进程资源
27 pthread_create 创建线程 , 文件描述符,进程空间是共享的 , 多了个引用而已
28 多线程的结构图
29 什么是C10K问题 , 1万个连接要1万个进程或线程 , 操作系统无法承受
30 解决知识点29 , 一个线程维护多个socket
31 fd_set是线程维护的socket集合 , 使用select去检查是否有更新
32 改进知识点31 , 从主动轮询变成被动通知 epoll , 突破数量限制
33 epoll注册callback函数 , 某个fd变化就会通知
34 一个epoll执行流程图
35 epoll的执行过程 , 没深入下去 , 用到了红黑树
36 epoll解决C10K