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连接
  • 维护此连接对,将一个连接上收的到数据转发到另一个连接上
Created with Raphaël 2.1.2CCPEPsalPEPsalSS建立连接<C,S>连接建立建立连接<PEPsal,S>连接建立发往S的数据data1data1发往PEPsal的数据data2data2

在原始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 之间采用条件变量实现同步互斥。

0 0
原创粉丝点击