PEPsal分析
来源:互联网 发布:源码投稿 编辑:程序博客网 时间:2024/04/28 23:02
- 网络连接
- 部署
- 代码分析
- 数据结构
- syn_table
- poll_resources
- active_queueready_queue
- 线程
- queuer
- listener
- poller
- time_sch
- workers
- 说明
- 数据结构
网络连接
PEPsal只是直接把从C到S的TCP连接切割成了两段(TCP Spacing),除此之外什么都没有做。
- 通过iptables配置,拦截C到S的TCP握手SYN包,与C建立连接
- 建立自身到真正目的IP地址S的TCP连接
- 维护此连接对,将一个连接上收的到数据转发到另一个连接上
在原始TCP发起者C来看,原地址和目的地址并未改变,PEPsal对其透明。从S来看,该连接的发起者为PEPsal。
部署
PEPsal对TCP的性能增强由操作系统的TCP/IP协议栈提供支持。要提升数据在特定链路网络环境下的传输速率,就需要采用适应该链路层特征的传输控制策略。就高延时的卫星网络而言,主要可采用的有Hybla拥塞避免算法和Hoe’s 信道带宽估计(Hoe’s channel bandwidth estimate)对初始ssthresh设置,还包括SACK等。
PEPsal可只在一端部署,这样仅该端发送TCP包得到性能增强。如果卫星链路的两段都部署了PEPsal,则双向的TCP传输得到性能增强。作为Linux内核的一个补丁,MultiTCP包含了TCP-Hybla作者推荐的针对卫星网络优化的TCP Pacing 和 Hoe’s initial ssthresh estimation 技术。
注:拥塞避免是发送方使用的流量控制,通告窗口是接收方使用的流量控制。
代码分析
程序采用多线程实现并发,poll实现多路复用,使用了互斥锁(pthread_rwlock_t)和条件变量(pthread_cond_t)作为同步互斥机制。主要包含4个数据结构和5类线程。
数据结构
syn_table
存放PEPsal接收的所有连接信息的哈希表,键(struct syntab_key)为TCP连接的源地址,值(struct pep_proxy)为包含两个连接端结构(struct pep_endpoint,包含IP、Port、socket描述符、对应的pep_proxy等)的连接信息。
poll_resources
存放需要poll来监听的socket描述符及其对应的pep_endpoint(为了加速查找pep_proxy)。
active_queue/ready_queue
用于将读写任务递交给worker,worker处理完的读写任务被移动到ready_queue,进而删除。
线程
queuer
根据SYN包将连接信息加入syn_table,设置状态连接为PST_PENDING。
listener
在5000端口监听(最多60000个socket等待接收连接),接收连接,并建立自身到真正目的地址的连接,设置链接状态为PST_CONNECT,发送信号POLLER_NEWCONN_SIG给poller(没用,只是能将poll中断罢了)。
poller
根据syn_table构建poll_resources,执行poll,将发生IO事件的连接添加至active_queue(连接状态PST_CONNECT迁移到PST_OPEN),等待 workers处理完毕后(任务已经被移动至ready_queue)清空ready_queue。
time_sch
定时记录日志,执行垃圾回收(每15个小时)。
workers
默认会创建10个工作线程,每个worker从active_queue获取任务,执行数据的接收和转发,并将其移动至ready_queue。
说明
SYN包的截取使用了iptables,对其进行处理(记录至syn_table)后,投递至本机5000端口。
处理过程涉及用于netfilter相关的内核和用户程序通信的底层库libnetfilter_queue 。
poller 和 workers 之间采用条件变量实现同步互斥。
- PEPsal分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 分析
- 大家帮忙分析分析!
- FFMpeg分析详细分析
- FFMpeg分析详细分析
- core 分析的分析
- 写给自己,分析分析
- FFMpeg分析详细分析
- 图像分析------直方图分析
- 静态分析 - 数据流分析
- Warning: --resource-rules has been deprecated in Mac OS X >= 10.10!
- 用OpenGL构建粒子喷泉
- 将map自动转化为xml报文
- Mantle 初步使用
- 输出当前时间和随机数
- PEPsal分析
- 【LeetCode】002.Add Two Numbers
- Java中堆内存和栈内存详解
- bin下简单工具。
- iOS 应用架构谈:view 层的组织和调用方案
- GLEW库安装和初始化
- CALayer中anchorPoint和position的用法
- VIM入门(ACM版)
- 计算机中的值与值的类型