软件开发相关概念
Table of Contents
OSI 模型
开放式系统互联模型(英语: Open System Interconnection Model,缩写: OSI; 简称为OSI模型)

用wireshark抓取 http://example.com 请求, 同时标注了实际应用的5层模型

TCP
详细资料: http://www.tcpipguide.com/free/t_TCPBasicOperationConnectionEstablishmentManagement.htm
| ACK | 确认序号有效(用来应答) |
| SYN | 发起一个连接(用来同步) |
| FIN | 释放一个连接 |
| Seq number | 序列号, 初始值随机, 其他情况下: Seq(send) = Ack(recv) |
| Ack number | 确认序号, 有效的情况下: Ack(send) = Seq(recv) + 1 |
TCP 有限状态机

三次握手和四次挥手

Linux 网络 I/O 模型
基本概念
| df | file descriptor |
| 同步/异步 | 关注的是消息通信机制 |
| 阻塞/非阻塞 | 关注的是程序在等待调用结果时的状态 |
5种模型
| Blocking I/O | 阻塞 I/O | 常用 | |
| Nonblocking I/O | 非阻塞 I/O | - | |
| I/O Multiplexing | I/O 复用 | (select and poll) | 常用 |
| Signal-Driven I/O | 信号驱动 I/O | (SIGIO) | 罕见 |
| Asynchronous I/O | 异步 I/O | (the POSIX aio_ functions) | - |
http://www.cs.toronto.edu/~krueger/csc209h/lectures/Week11-Select-4.pdf

阻塞 I/O 和 非阻塞 I/O

https://linux.die.net/man/2/recvfrom
If no messages are available at the socket, the receive calls wait for a message to arrive,
unless the socket is nonblocking, in which case the value -1 is returned and the external variable errno is set to EAGAIN or EWOULDBLOCK.
I/O 复用

- select
https://linux.die.net/man/2/select synchronous I/O multiplexing
几个缺点:
- 使用数组存储, 被监控的 fds 集合限制为1024
- fds 集合需要从用户空间拷贝到内核空间的问题
- 当被监控的 fds 中某些有数据可读的时候, 需要遍历整个 fds 来收集
- 使用数组存储, 被监控的 fds 集合限制为1024
- poll
https://linux.die.net/man/2/poll wait for some event on a file descriptor
对 select 的改进:
- 改用链表存储, fds 集合限制远大 于select 的1024
- 改用链表存储, fds 集合限制远大 于select 的1024
- epoll (性能最优, Linux中的Java Selector默认选择)
https://linux.die.net/man/4/epoll I/O event notification facility
终极改进:
- 改用红黑树来管理fds集合, 提高增、删、改的性能
- 拷贝问题: epoll通过内核与用户空间mmap(内存映射)同一块内存来解决
- (低频)epollctl通过(ADD、MOD、DEL)更改fds集合的状态
- (高频)epollwait只处理修改的fds集合
- 改用红黑树来管理fds集合, 提高增、删、改的性能
信号驱动 I/O

由内核通知开发者何时可以开始一个 I/O 操作.
异步 I/O

由内核通知开发者 I/O 操作何时已经完成.
CPU 缓存

CPU 缓存的出现主要是为了解决 CPU 运算速度与内存读写速度不匹配的矛盾, 因为 CPU 运算速度要比内存读写速度快的多.
越靠近 CPU 的部分速度越快.