文章目录
1. 网络
滑动窗口协议:https://juejin.im/post/5c9f1dd651882567b4339bce
拥塞控制:https://mp.weixin.qq.com/s?__biz=Mzg2NzA4MTkxNQ==&mid=2247486586&idx=2&sn=88e9835deb2c1b85ea42b5de13b81e72&scene=0#wechat_redirect
TCP四次挥手:
- 主动关闭方FIN
- 被动关闭方ACK
- 被动关闭方进入close wait
- 被动关闭方FIN
- 主动关闭方ACK,同时进入time wait状态。
CLOSE_WAIT过多原因:被动关闭方没有主动关闭连接。
epoll
epoll一共两种模式,水平触发(LT)和边缘触发(ET),主要的区别在于对读,写数据的处理:
操作 | 读 | 写 |
---|---|---|
LT | 只要读缓冲区有数据可读,就返回EPOLLIN | 只要写缓冲区有空间可写,就返回EPOLLOUT |
ET | 读缓冲区从无数据变成有数据可读,返回一次EPOLLIN | 写缓冲区从不可写变成可写(不可写通常是写缓冲区满了),返回一次EPOLLOUT |
LT模式下,如果注册了EPOLLOUT事件,epoll_wait几乎都会返回EPOLLOUT,除非写缓冲区满了,所以LT模式下EPOLLOUT事件需要特殊处理。下面给出LT模式和ET模式下处理的读写的伪代码:
//LT初始化
epoll_ctrl(connect_socket, EPOLLIN, ADD);
// LT读
void lt_handle_read() {
// 如果读不完,下次epoll_wait一定会返回EPOLLIN
while((n = read(connect_socket, read_buffer)) > 0) {
// read_buffer为当前循环读取到的数据
}
// n=0表示对端关闭连接,需要关闭socket
if (n < 0 && errno == EAGAIN) {
// Resource temporarily unavailable, 无数据可读
}
}
// LT写
void lt_handle_write() {
// 一次性发满写缓冲区,这里写满的意图是:判断是否需要添加EPOLLOUT
while((n = write(connect_socket, write_buffer)) > 0) {
// write_buffer为当前循环发送的数据
}
if (write_left == 0) {
// 数据发送完毕,删除EPOLLOUT
epoll_ctrl(connect_socket, EPOLLOUT, DELETE);
}
if (n < 0 && errno == EAGAIN) {
// Resource temporarily unavailable, 写缓冲区满了,添加EPOLLOUT
epoll_ctrl(connect_socket, EPOLLOUT, ADD);
}
}
//ET初始化
epoll_ctrl(connect_socket, EPOLLET | EPOLLIN | EPOLLOUT, ADD);
// ET读
void et_handle_read() {
// 这里要把数据读完,否则就是BUG了
while((n = read(connect_socket, read_buffer)) > 0) {
// read_buffer为当前循环读取到的数据
}
if (n < 0 && errno == EAGAIN) {
// Resource temporarily unavailable, 无数据可读
}
}
// ET写
void et_handle_write() {
// 一次性发满写缓冲区
while((n = write(connect_socket, write_buffer)) > 0) {
// write_buffer为当前循环发送的数据
}
if (n < 0 && errno == EAGAIN) {
// Resource temporarily unavailable, 写缓冲区满了,等待可写触发EPOLLOUT
}
}
于是总结出两种模式的优缺点:
操作 | 优点 | 缺点 | 应用场景 |
---|---|---|---|
LT | 编码灵活,不容易出错 | 多两次epoll_ctrl调用 | 写数据小,不会触发EPOLLOUT,比如Redis |
ET | 比LT模式少了动态添加和删除EPOLLOUT事件,少了2次epoll_ctrl调用 | ET模式只在状态发送变化时触发一次,在处理读时,需要一次性把读缓冲区读完,在处理写时,需要一次性把缓冲区写满 | 写数据大,频繁触发EPOLLOUT,比如Nginx |
2. RPC
2.1 dubbo
Provider xml配置(可以配置多个服务):