基于丢包的拥塞控制算法缺陷
Bufferbloat导致的高延迟
现代网络设备内置了非常大的缓冲区,基于丢包的算法会持续增加发送速率,直到填满缓冲区导致丢包才降速。大量的数据卡在网络设备的缓冲区中,导致排队延迟增大,从而使得整体的网络出现极高的延迟和抖动。
无法区分拥塞性丢包与随机性丢包
在无线网络(...
阅读更多
在一个没有符号的release版本二进制文件发生coredump时,由于缺乏符号信息,无法直接看到函数名和变量名。
根据地址偏移定位
收集和分析coredump文件
使用gdb加载core文件
gdb <可执行文件名> <coredump文件>
...
阅读更多
每个进程都有自己独立的虚拟地址空间,一个进程不能直接访问另一个进程的内存。但在很多应用场景中,多个进程需要协同工作,交换数据。IPC 机制就是操作系统提供的一套让不同进程能够互相通信、同步操作的机制。
进程间通信方式主要有:
匿名管道
命名管道
消息队列
共享内存
信号量
套接字
...
阅读更多
C++14
std::make_unique
// 旧方式 (不安全)
// std::unique_ptr<Foo> p(new Foo());
// C++14 方式 (安全、简洁)
auto p = std::make_unique<Foo>();
...
阅读更多
重传超时定时器
建立连接、传输数据,在发送SYN或FIN时,会启动一个定时器, 如果在定时器超时前没有收到ACK,就会重新发送。
SYN发送的次数也有限制:cat /proc/sys/net/ipv4/tcp_syn_retries
传输数据过程中,当发送方发送一个...
阅读更多
TCP使用滑动窗口机制来进行流量控制。
窗口
滑动窗口机制机制的核心在于发送方和接收方都维护一个可变窗口,这个窗口的大小代表了当前可以发送或接收的数据量。
发送窗口:
已发送并已确认的数据: 这部分数据已经安全到达,将被移出窗口。
已发送但未确认的数据: 这部分数据已经发出,但还没有收到接收方的确认...
阅读更多
产生原因
网络中数据传输需要超过了网络能够处理的最大容量:
数据管道容量
网络设备缓冲区
产生控制拥塞后,数据包累积导致延迟,超过缓冲限制则大量丢失,影响传输效率和吞吐。
算法分类
拥塞控制大类
具体算法
特点
...
阅读更多
I/O多路复用实现单个线程同时监控多个socket的状态,当任何一个socket文件描述符就绪(可读、可写)时,内核会通知应用程序,从而避免了阻塞和轮询的低效。
Linux中提供了select、poll和epoll三种IO多路复用机制。
select
select 函数原型:
int select(int...
阅读更多