ss-libev 源码解析udp篇 (4)

本篇分析remote_recv_cb,这是整个udp转发的反方向,即读取从后端发送过来的数据再发送给前端。对于ss-server,读取到的数据是目标地址的udp服务器发送回来的响应数据,ss-server需要将其包装成ss的格式并加密发送给ss-local;对于ss-local接收到的数据就是ss-server发送过来的加密数据,ss-local解密后需要再将其包装成socks5的格式发送给sock...
阅读(662) 评论(1)

ss-libev 源码解析udp篇 (3)

本篇分析server_recv_cb,这个是udp转发中最重要的函数。server_recv_cb: 当ss-local或ss-server接收到来自前端的udp数据包时调用。这个函数代码比较多,除了local和remote(即ss-server),还有redir, tunnel,android的代码。我们只关注local和remote。 首先,这个函数是注册给server_ctx_t的io的,处理...
阅读(184) 评论(0)

ss-libev 源码解析udp篇 (2)

UDP relay的代码基本都在udprelay.c中,无论ss-local还是ss-server的代码都在一起,使用宏MODULE_LOCAL,MODULE_REMOTE等区分开。代码虽然不是很多,但是由于ss-local和ss-server以及ss-redir,ss-tunnel等夹杂在同一个函数中,不断有宏去打断读代码的思路,并且很多代码还是同时被ss-local和ss-server执行到,所...
阅读(138) 评论(0)

ss-libev 源码解析udp篇 (1)

shadowsocks-libev udp转发原理简介 ss_local作为一个sock5服务器,接收来自socks5客户端的数据包。在ss_local启动后,即创建一个udp socket,并bind到一个端口。该udp socket用于接收所有来自socks5客户端的udp包。 根据socks5规范,socks5客户端和ss_local建立一个tcp连接进行握手,握手成功后ss_local返回上...
阅读(201) 评论(0)

ss-libev 源码解析local篇(5):ss-local之remote_send_cb

remote_send_cb这个回调函数的工作是将从客户端收取来的数据转发给ss-server。在之前阅读server_recv_cb代码时可以看到,在STAGE_STREAM阶段有几种可能都会开启remote->fd的写事件的监听,从而当有写事件触发时调用remote_send_cb。从代码结构看,外层的分支是remote->send_ctx->connected是否为0,内部的分支是是否fast...
阅读(123) 评论(0)

ss-libev 源码解析local篇(4): server_recv_cb之STAGE_STREAM

继续探索server_recv_cb,我们已经来到了STAGE_STREAM状态。如果在0.05秒的timer来之前客户端就有数据过来,server_recv_cb被调用,此时已经在stream状态就会读入数据到remote的buf中;如果timer先到了就是直接调用的server_recv_cb,并先进入wait状态所以不读取数据。另外在之前的parse状态,remote的buf里面也有一些数据,...
阅读(157) 评论(0)

iOS TUN之避免UDP包ip分片

iOS的NetworkExtension给应用暴露了一个虚拟网卡TUN设备,可以设置其MTU值。如果上层应用发送的IP包大于这个MTU就会被分片。(详见:http://www.jianshu.com/p/741cb12ab0c9 ) * TUN转发UDP包时遇到分片的问题 使用iOS网络扩展开发时,往往需要在TUN中处理数据包,进行处理后重新发送出去。由于通过TUN拿到的是ip包,如果要进行ud...
阅读(177) 评论(0)

ss-libev 源码解析local篇(3): server_recv_cb之SNI和STAGE_PARSE

上一篇看到STAGE_HANDSHAKE中的处理,到发出fake reply。这之后会从socks5 request中解析出remote addr and port,即客户端实际想要访问的服务器地址和端口。根据request->atyp,有三种情况,atyp为1,请求中带的是ipv4的地址,为3是域名,为4是ipv6地址。ss-local会把remote addr & port填入server->a...
阅读(196) 评论(0)

ss-libev 源码解析local篇(2):ss_local和socks5客户端握手

上一篇说到ss-libev创建listen_ctx_t对象用于监听客户端连接,调用accept_cb处理来自客户端的新连接,创建server_t对象用于处理和客户端之间的交互。本篇分析来自客户端的SOCK5连接的建立以及传输数据的过程。 首先,回忆一下使用new_server()函数创建server_t对象时,注册了客户端连接的读写事件的回调:ev_io_init(&server->recv_ct...
阅读(379) 评论(0)

linux TCP Fast Open开启和测试

linux上要开启TCP Fast Open,内核版本至少为3.7.0, 且需要设置 /proc/sys/net/ipv4/tcp_fastopen 为3. 开启后,如果有连接进来,使用如下命令查看: grep ‘^TcpExt:’ /proc/net/netstat | cut -d ’ ’ -f 91-96 | column -t 例如:[root@vmxxx ~]# grep '^TcpE...
阅读(413) 评论(0)

ss-libev 源码解析local篇(1): ss_local的启动,客户端连入

学习研究ss-libev的一点记录(基于版本3.0.6) ss_local主要代码在local.c中,如果作为一个库编译,可通过start_ss_local_server启动local server。所以先从这个函数入手,看local的启动过程。STEP0: int start_ss_local_server(profile_t profile) profile_t profile 是ss-lib...
阅读(299) 评论(0)

iOS编译集成linux开源c库的一些记录

最近一个iOS项目需要使用一些Linux下面的开源c库,说是Linux的其实是跨平台的,各种Unix系统都有支持。理论上iOS来自MacOS,而MacOS其实是一种兼容的Unix系统,所以这些库应该也可以在iOS上跑。当然了这些库并没有直接操作系统硬件的。目的是在iOS中使用开源c库,那么第一步得能在Linux或Mac上编译他们吧,所以需要点一点Linux 编译安装c库的技能点。 最基本的就是gc...
阅读(360) 评论(0)

TCP服务器端口数,最大连接数以及MaxUserPort的关系辨真

原文连接:http://www.jianshu.com/p/4a58761d758f关于TCP服务器最大并发连接数有一种误解就是“因为端口号上限为65535,所以TCP服务器理论上的可承载的最大并发连接数也是65535”。先说结论:对于TCP服务端进程来说,他可以同时连接的客户端数量并不受限于可用端口号。并发连接数受限于linux可打开文件数,这个数是可以配置的,可以非常大,所以实际上受限于系统性能...
阅读(280) 评论(0)

linux, windows, mac, ios等平台GCC预编译宏判断

写跨平台c/c++程序的时候,需要搞清各平台下面的预编译宏,区分各平台代码。而跨平台c/c++编程,GCC基本在各平台都可以使用。整理了一份各平台预编译宏的判断示例。 需要注意几点: * windows32/64平台_WIN32都会被定义,而_WIN64只在64位windows上定义,因此要先判断_WIN64 * 所有的apple系统都会定义 __APPLE__,包括MacOSX和iOS * ...
阅读(697) 评论(0)

ip分包研究-以UDP为例

测试环境: 利用iOS的NE从TUN抓取IP packets,如下代码分析ip包: uint16_t iphid = IPH_ID(iphdr); uint16_t iphflagoff = ntohs(IPH_OFFSET(iphdr)); uint16_t iphoff = iphflagoff & IP_OFFMASK;...
阅读(551) 评论(0)
213条 共15页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:611559次
    • 积分:8363
    • 等级:
    • 排名:第2249名
    • 原创:199篇
    • 转载:12篇
    • 译文:0篇
    • 评论:330条
    博主链接
    最新评论
    同道中人