Author Archives: chenyajun

Potatso原理解析

更新:现在可用的Potatso源在这里:https://github.com/haxpor/Potatso 其实对于iOS而言,之前有shadowsocks-iOS这个项目,我有段时间也看了这个项目,当时没有仔细看源码,只是想把它跑起来看看,折腾了一阵虽然能够跑起来了,但是并不起作用。后来在美区下载了这个app试用了一下,还是只能在应用存活期间提供代理服务,缺陷是很明显的。clowwindy在apple宣布开放networkExtension后在这个页面讨论了一下network extension的使用方法,最后大批的留言让人感动。 前几天,icodesign开源了Potatso,我看了几天源码,了解了一下大概流程: 一、需要向apple申请networkExtension的使用权限,拿到权限entitlement文件之后,需要安装一个Xcode网络扩展模版插件,地址在: /System/Library/Frameworks/NetworkExtension.framework/Resources/NEProviderTargetTemplate.pkg。 二、 安装完之后可以在Xcode新建Application Extension模版。此段参考iOS 9 VPN API – The Definitive Guide to Network Extension API NEPacketTunnelProvider and NWUDPSession。网上有对应的中文版,这里就贴英文原文吧,mac sierra上这个安装包找不到了,官方推荐的做法在这里https://forums.developer.apple.com/thread/65265。 三、之前提到过shadowsocks-iOS被系统杀死后就不能提供代理服务了, 上一条提到的Application Extension就突破了这一局限,即使app被杀死,Application Extension依然会在后台运行。持续为设备过来的数据提供代理。下面就说一下代码层面上到底是怎么实现的 四、Potatso首先会将用户的shadowsocks服务器信息存起来,用户选中某项shadowsocks配置后点击连接,Potatso会首先调用Manager.swift的”regenerateConfigFiles”方法,保存了4个配置: 保存用户定义的DNS; 生成一个antinat服务器需要的XML配置文件并保存起来,antinat是一个socks服务器,用来将需要代理的socks流量导向设备上和shadowsocks服务器连接的端口;… Read more »

网络传输

依个人浅见写的,以通俗易懂为目的,千万不要认为这个写的都对,需要确认时请翻阅权威资料。 TCP/IP是啥 TCP、IP是现在五层网络模型中的两个协议,五层网络模型中还有很多其它协议,比如UDP、ARP、RTP等。 这两个总是被单拧出来我觉得主要原因是: 1. IP这个东西我们整天接触,甚至经常会说:你的IP多少我请求下你的服务。 2. TCP决定了你怎么理解网络请求的可靠性和传输可能发生的一些细节,如果对这个有点概念对平时工作中涉及网络的时候会有一点底。 下面我说一下我对IP的理解: 每一个网卡有一个物理意义上的唯一地址,这个地址是机器生产出来之后直接被规定好的,叫做mac地址。通过mac地址我们完全可以区分不同的设备。IP则建立在mac地址固定的前提上,相对的,IP更加灵活。你的机器可以动态的通过路由器提供的服务获得自己的IP,这个时候路由器是遵守另一个协议来动态分配IP的。那是另一件事。 IP又分为公网IP和局域网IP。先说局域网IP,我们有时候看自己机器的IP都是192.168..或者10…***。这样形式的IP就是局域网IP。当我们发起目的IP地址是这样的请求的时候,路由器会将请求发到局域网中的某台机器上去。这些局域网IP的只能局域网中互相访问。在局域网之外就没法访问了。 比如如果你访问google.com 你本质上访问的就是一个或者多个公网IP。你在任何能接入互联网的地方都能访问(某些地方例外)。你输入google.com却访问的是一个数字形式的IP地址,这其中就是域名解析(DNS)在起作用了。这些都是老生常谈。 对了,额外提一下,路由器在你不注意的时候其实帮你做了很多事:通过UDP、路由表等给你机器分配IP,处理你发出的请求,将收到的回复发给你、维护一个高效的网络路径。it’s a long story。 那TCP呢: 我们除了能访问网络之外,我们分外关心的是网络传输对数据完整性和可靠性的保证是怎样的。TCP就是这样一个协议。帮助我们尽量完整的交付我们的数据。TCP会在请求开始前进行三次握手保证网络两端都准备好进行接下来的网络传输。但是数据都是一个个小的数据包持续不断的传过去的。TCP协议负责对这些数据包进行排序发送,并检查哪个序号的数据包没发送成功,将没法送成功的数据包再发出去。实在不行(比如请求超时或多次发送失败)接收方会返回数据发送失败的报告。如果发送成功接收方会根据TCP协议的规定,将按序号将数据包排列好。形成完整数据。给发送方发送成功接收的报告,请求顺利完成。 可能有人疑问假设所有数据包都发送过去了,但是有的数据包的数据被篡改或损坏怎么办?岂不是接到了错误的数据?答案是应该不会。因为最后接收方会将整个进行一次求和验证。这个应该能够保证数据不被篡改。但是也不能说死,想要彻底不被篡改就应该试试不对称加密。 shadowsocks shadowsocks真的非常赞。我看了一点原来shadowsock-iOS的源码,如同C大在issue中所说这个工程已经废弃。我弄了半天虽然跑起来了,但是不再起作用,我试图fix。但是能力有限没有成功。 后来看到了tuoxie007老师一个shadowsocks buildin的项目。学到了不少东西。对理解shadowsock有帮助。我将代码注释了一下放在这里有兴趣的人可以clone一下看看。