一、协议
1. TCP/IP 协议
- 应用层:http/ftp/DNS/Telnet/..
- 传输层:TCP/UDP..
- 网络层:IP…
- 链路层:
二、TCP三次握手、四次挥手
1. 三次握手
- c请求链接;
- s接受链接,并回复ack报文, 分配资源;
- c接受到ack报文后,也向s发ack报文,并分配资源, 连接建立
2. 四次挥手
- s请求断开连接,FIN报文;
- s回复c ack报文,告诉c收到请求,但是还得处理未完成的数据,请等待, c收到进入FIN_WAIT;
- s处理完,则向c发送FIN报文,告诉c可以关闭;
- c回复ack报文,并进入TIME_WAIT, 等待2MSL后关闭, s收到ack报文, 关闭
三、Http
1. 在TCP/IP协议分层中的位置
应用层, TCP协议之上(三次握手,四次挥手等), HTTPS为http加入TLS和SSL
2. 请求相应模型
永远是client发起请求,无状态协议。 无法反向通知
3. HTTP2.0
- 核心:二进制分帧层
- 多路复用、首部压缩
- 瓶颈可能出现在TCP阻塞问题等
4. HTTPS
- 在应用层和传输层,加入了安全层(SSL/TLS)
- 公钥加密的内容只有对应的私钥能解。
- 要保证client和server间的通信是安全的,就需要用对称加密算法(DES), 即对话密钥;但是协商对称加密算法的过程, 需要用非对称加密算法(server下发公钥到各个client, RSA);但是这样又可能被中间人篡改公钥给client端,所以需要使用数字证书来保证非对称加密过程本身的安全, md5啥的验证,当然如果client本身被攻破,则凉凉。 通过这个机制来协商出一个对称加密算法。 这一过程是就是SSL/TLS干的事情。
四、 网络模型
1. I/O的五种模型
前四种都属于同步, 最后一种是异步
2. 三种工作方式
- Prefork: 主进程预先分配一堆工作进程,一对一响应请求
- Worker:主进程生成一堆工作进程,每个工作进程再生成一堆线程, 线程去响应请求
- Event:主进程生成一堆工作进程,响应多个客户端请求。 当遇到I/O请求时,交由内核去处理,然后继续处理其他请求, 当内核通知完成后(回调函数), 继续处理改用户请求
3. Select、poll、epoll
nginx的事件驱动模型,其实是基于epoll
本质上都是同步I/O模型
Select 和 poll相似
3.1. Select、poll的优劣
- 劣:每次调用select 需要把集合中所有的fd拷到内核态; 需要在内核轮询遍历所有的fd; fd上限。。1024
- 优:fd少。。。
3.2. Epoll
- 优:fd在整个过程知会被拷贝一次;每个fd, 通过回调函数,把就绪的fd加到就绪列表, 那么就只需看就绪列表有没有就绪的fd了;没有限制,和系统一致
- ET模式:系统调用少点, 但是代码实现复杂。 系统状态变化(空到有,满到空),才触发。 所以实现上需要一直read/write到出错,否则会发现还有数据,但是没通知。
- LT模式:系统调用多点, 只要有数据,就一直通知。
五、HTTP长连接&短连接
- 长连接是HTTP1.1引入的新特性;握手后不立即断开,而是在此链接基础上进行多次消息(心跳包等)交互,直到有一方主动断开。 Connection:keep-alive
- http的长连接,一个req只能对应一个rsp, 并且svr不能主动发起,即还是不能反向通知
- 真正的长连接:websocket
六、二进制协议
protobuf