求思路系列(三),有对网络编程熟悉的老师吗,求指点一二。

shifeng310 发布于 2013年10月24日
无人欣赏。

情景:ios手机端A用usb线连接在另外一个嵌入式系统B上,B不能上网,要通过A完成代理上网功能。详情如:在B操作系统的浏览器上点击一个 “百度”的网页连接,我们的程序将利用MFI通过usb线,将该网页请求截获并发送到手机A上,手机A解析该网络请求,提取出IP地址和端口,利用手机上网,访问“百度”主页,并将服务器返回的内容,再用MFI通道回馈给B系统,让其呈现给用户,从而实现通过手机代理上网的功能。

任务:手机A接受到以截获的网络请求后,解析数据包,发送到指定的服务器,并获取返回内容,传送给系统B。

困惑: 在ios中如何解析网络传输的数据包? 如何区分出该包是tcp协议,还是udp协议? 如何从数据包中分离出,目的地址ip 和 端口号?

请各位老师,提示一二,本人对ios的文档也不太熟悉,对网络知识也很匮乏,不知道处理该网络编程的框架和库是用哪些,还望指点,谢谢!

共23条回复
shifeng310 回复于 2013年10月24日

在线坐等指导一二

tinyfool 回复于 2013年10月24日

你们的目的是什么看你的描述很奇怪的样子

指针为空 回复于 2013年10月24日

为啥我觉得像是面试题?

Archfeed 回复于 2013年10月24日

为什么我觉得你的问题和前面“情景”“任务”都不搭边呢 ?

shifeng310 回复于 2013年10月24日

2楼 @tinyfool 说白了 就是用手机连着车载导航,让车载导航上网(在国内不是每个人都愿意,为车载导航配置一张3g流量卡的)

shifeng310 回复于 2013年10月24日

3楼 @指针为空 不是面试题哦,是生产过程中碰到的问题,不过以后可以从中提炼出一道面试题,去考考未来校招的孩子

Archfeed 回复于 2013年10月24日

5楼 @shifeng310 。。。开车的时候车载导航不用来导航用来上网 ?。。。为什么会有这种需求?

shifeng310 回复于 2013年10月24日

4楼 @Archfeed 问题就是解析数据包,不知道怎么解析

shifeng310 回复于 2013年10月24日

7楼 @Archfeed 未来的汽车估计就是个大的IT产品了 哈哈

Archfeed 回复于 2013年10月24日

第一个嘛,文档我也不熟,但我觉得一般iOS开发不会接触到这个层面的细节问题吧。除了第一个问题,其他都是跟报文格式相关。其实都可以通过对报文字段的提取获得。

tinyfool 回复于 2013年10月24日

5楼 @shifeng310 哦,那么貌似代码量不会很大,也不需要你去探测什么流量,就是你的设备要支持iPhone的Usb共享上网协议,这个我不太懂,你往这个方向寻找资料吧

不过,都要连iPhone了,而且需要流量的话,谁还用车载导航呢?

shifeng310 回复于 2013年10月24日

10楼 @Archfeed 我也想的跟你差不多,觉得不同的协议的报文格式不同,报文里包含了ip和端口,只要去解析报文应该能解决,可是我也不知道从哪里找文档啊。。。 而且网络上关于ios的网络编程都是应用层面了,没这么底层啊,没找到什么太多有价值的资料

shifeng310 回复于 2013年10月24日

11楼 @tinyfool 连iphone 不是为了给车子导航,主要是拓展一些其他功能,比方现在比较多的是,iphone和车机,屏幕同步,反控互操作等等。。。 (不过跟本题无关咯)

nickel 回复于 2013年10月25日
  1. 如果只是网页请求,相对来说简单一点,不需要考虑TCP还是UDP(http一定是TCP,https是SSL/TLS)。
  2. 其实你相当是要在iOS上做一个Proxy Server,但Proxy一般是有针对性的协议处理的,所以其实要分辨tcp和ud其实没有什么难度,因为每一种应用协议(http,smtp,ftp,sip,rtp,h323等等)对才使用的承载协议都有明确定义,例如http只是采用tcp的,不需要分析,而SIP是可以同时采用udp和tcp的,默认采用udp,协议的文档里有明确定义。就是说你很难做一个通用型的proxy自动去管理多种应用协议,一般都是针对性处理的,就是说例如在一个实现基础通讯的核心上通过不同的协议处理模块来实现对具体应用协议的处理。

从上面两点以及你的初步需求来看,你最好说明或者明确要针对哪种应用协议来进行代理,否则你要做的是就太复杂了。

假设只是针对http,你最好先找找有没有现成实现代理http的库,一个Back2Back Server:一端是客户端逻辑(像真正的服务器发出请求以及接受回复),一端是服务器逻辑(作为你的B设备的服务器,处理B的请求以及向B回复)。因为你这个应用不需要做任何数据处理(我假定),所以也就是一个restful服务器,仅仅做转发。

但这里有一个前提是,因为你的B是完全没有上网能力的设备(至少你没说明有),所以B不能直接通过设置网络代理的方式来通过A上网。如果你需要采用标准浏览器来访问,你必须修改B的网络核心层,估计这一步最难了,要改动到socket底层的实现,那么底层的部分我也没做过,估计你没有网络通讯开发经验更难。

我建议你最好采用自己修改过的浏览器,在浏览器核心中,把原来建立socket的逻辑全部修改为通过MFI(话说MFI是啥?)通讯。浏览器核心还是自己组装http请求和解释http回复。

因为是自己实现的通讯接口,所以协议可以自己定,大概把目标服务器IP/域名和端口,以及http请求数据一起传给A端;A端的APP处理这个自定义协议的数据,把http请求(根据需要做一定的数据修改,这里我不清楚会有什么需求)发到目标服务器;等待到回复后,除非你要做中间处理,否则基本上可以直接将http回复通过你的协议传回给B端。所以A上的APP其实不太需要对数据包进行处理(但这里只针对http来说,每种应用协议得单独分析)。

至于你问iOS如何解释网络数据包,这个问题还是得先清楚你问得是哪种协议,http的话iOS里面已经有封装,不需要你自己做,你只需要通过API来获取对应数据就可以了。如果是其他协议,例如smtp、sip之类的,得查查有没有系统支持(smtp应该有,sip不确定),没有就得找第三方库(自己实现协议栈其实很麻烦的,很少会这么干)。

上面回复的还是比较笼统,因为你的需求描述得相当不明确。

shifeng310 回复于 2013年11月04日

14楼 @nickel 感谢nickel如此认真的回复,上个星期临时去更改一个app的bug,增加新功能;则把这个网络代理的项目暂时搁浅了十天。看到你的回复真是倍感欣慰,而且内容对我帮助很大,因为刚接触ios 三个月,网络编程更是零经验所以很多地方我也不知道怎么用较为专业的语言来描述。 我现在是要做的最核心的一个功能是:从一个tcp、udp或icmp的数据包中,解析出我要的目标地址和端口号; 至于mfi(make for ipad,iphone,itouch) 是苹果手机和外界系统有线链接,传输数据的一种方式

玉楼 回复于 2013年11月05日

看TCP/IP协议,有中文版的实体书,很详细的。

nickel 回复于 2013年11月05日

如果要分析tcp/udp甚至icmp的包,你要用到比socket还下一层的底层通讯技术,这个你最好还是自己买书看看吧,我也不是很懂。另外,估计你用不了objc的oo层接口,得直接用c了,我相信一般框架都只提供socket以上的封装接口,socket以下应该需要自己用c来处理。

我只是怀疑,你是不是真的需要自己去处理socket一下的逻辑?!最好还是找高层封装的库,或者直接修改浏览器核心。你完全可以用自己的协议来把自定义的数据封装起来传输,然后到另一端后拆出再组装成标准协议继续处理,这样应该不需要去直接分析和处理tcp/udp的包。

玉楼 回复于 2013年11月05日

socket就可以解析IP层的协议,不过看你是如何实现了。如果你就是做一HTTP代理,那相对容易些;如果你做的是个hook类的东西,把截到的包自己分析就累一些。网络编程我还有点经验,不过都是*unix下的,没在iOS下做过开发,只能给你些参考意见。

shifeng310 回复于 2013年11月05日

17楼 @nickel 是的今天找了几个资料,关于解析网络数据包的都是c语言写的了,还好在xcode的项目里面能够直接加载适用.c文件;了解了.pcap格式的网络数据包,但是目前还是不知道如何把ip地址,目标端口号从 tcp中解析出来,明天再查查资料

nickel 回复于 2013年11月05日

ip地址和端口很好办的,不需要自己分析包。我同意 18楼 @玉楼 的意见,做代理容易,尽量不要去做截包分析的方式,太麻烦了,况且你还没有太多网络编程经验。

shifeng310 回复于 2013年11月05日

20楼 @nickel 不需要自己分析包啊? 我都一直在这折腾怎么解析出ip地址和端口号,拿个tcp的报文在研究从哪一位到哪一位是ip目标地址,哪几位是目标端口,然后数着读取出来

nickel 回复于 2013年11月05日

因为你现在做的是类似钩子的逻辑,把包给拦截然后处理,这就辛苦了。做代理模式比较简单,你最好往这边多研究一下,不要老是想着自己去拦截处理包,这是最笨最累的方法。

shifeng310 回复于 2013年11月06日

22楼 @nickel 嗯,谢谢指导,我感觉我是在做了一件效率最低难度最大的事情。

本帖有23个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]