网络
网络层
传输层
TCP、UDP
特点
UDP:无连接,尽最大可能交付数据,面向报文,支持一对一、一对多、多对一、多对多的交互通信,不可靠(快、实时性好)
- DNS、TFTP
TCP:面向连接,可靠交付,有流量控制、拥塞控制,全双工通信,面向字节流,只能点对点(一对一)
- HTTP、FTP、TELENT、SMTP
TCP三次握手
- 防止失效的连接请求到达服务器,导致服务器打开无用的连接
TCP四次挥手
TIME_WAIT=2MSL
- 确保最后一个确认报文能到达,因为如果丢失会重传
- 让本次连接产生的所有报文都从网络中消失
TCP可靠传输
- 超时重传RTT
TCP滑动窗口
TCP流量控制
- 控制发送方速率,保证接收方来得及接收(通过确认报文的窗口字段控制发送方窗口大小)
TCP拥塞控制
- 慢启动、拥塞避免、快重传、快恢复
应用层
DNS
- UDP+TCP
DHCP
- 动态主机配置
Web页面请求过程
- DHCP配置主机信息
- ARP解析MAC地址
- DNS解析域名
- HTTP请求页面
- 三次握手建立连接
- 开始通信
Socket
阻塞式I/O
- 直到数据从内核缓冲区复制到应用进程缓冲区才返回(cpu并不会阻塞,其他进程还可以执行,cpu利用率较高)
非阻塞式I/O
- 应用进程执行系统调用后内核返回一个错误码,需要轮询来获知IO操作是否完成(CPU利用率低)
I/O多路复用
select、poll等待数据,当监听的某个套接字可读,再使用recvfrom把数据从内核复制到进程中
select
- 会修改fd,默认只能监听少于1024个,轮询
poll
- 提供了更多的事件类型,对fd的重复利用更高
epoll
比上述两种更加灵活,对多线程更友好
epoll_create
- 创建一个epoll句柄
epoll_ctl
- 为fd注册事件并绑定一个回调函数,当设备就绪callback把fd加入就绪队列(列表)
epoll_wait
- 轮询就绪队列(schedule_timeout())
信号驱动I/O
- sigaction系统调用,当数据到达时内核会向进程发送SIGIO信号,收到信号后调用recvfrom(相比轮询的非阻塞I/O模型CPU利用率更高)
异步I/O
- aio_read系统调用,内核会在数据复制完成后向应用进程发送信号(注意和信号驱动I/O的区别)
HTTP
HTTP状态码
1xx:信息性
2xx:成功
3xx:重定向
- 301:永久重定向,会缓存
- 302:临时重定向,不缓存,有url劫持问题
4xx:客户端错误,服务端无法处理的请求
5xx:服务器错误
Cookie
- 客户端保存状态
Session
- 服务器保存状态
HTTPS
- HTTP+SSL
- 使用非对称加密协商对称加密使用的Secretkey
- 使用Secretkey对称加密数据
- 使用数字证书保证公钥的正确性
HTTP2.0
- 二进制分帧层
- 服务端推送
- 首部压缩