skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:5452回复:28

关于TCPIP堆栈的问题

楼主#
更多 发布于:2003-01-15 18:40
我在开发的过程中遇到了一个非常棘手的问题,希望各位高手来看看。我在98下开发VPN客户端,现在,一般的情况下都可以成功了,但是,在进行一些特殊的通讯模式的时候会出现问题,比如,我在FTP的前几个协商包里面需要改掉其协商地址,在驱动里面对包进行过滤并重新填入新的地址,但是,我发现虽然FTP的协商是成功的,但是,TCP的序列号却发生了改变,导致TCP栈不停的重发包,通信也没有办法进行,想了想问题,应该是这样的,因为长度发生了变化,序列号的确是应该改变的,而其差值正好是我改包导致的差值,这个序列号是来自TCPIP协议栈,我们改不了的,我想请教大家,该怎么办?

最新喜欢:

WY.lslrtWY.lsl... ljmmaryljmmar...
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2003-01-17 17:18
我是想知道斑竹是希望用什么方式来解决,好像他的方法和RFC中提到的 不一样的 吧?


当使用虚拟网卡之后,该问题不再出现了,还解决什么?

有什么好解决的?
不再回忆从前,我已经生活在幸福当中。
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-17 17:10
我是想知道斑竹是希望用什么方式来解决,好像他的方法和RFC中提到的 不一样的 吧?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-17 16:23
说好啊,要不就吃饭,要不就说清楚,真的很急,那边等着要改呢!斑竹,拜托了,说说资料也成啊


你的这个问题按照上面的方法改就行了吖,

还要改什么?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-17 16:13
说好啊,要不就吃饭,要不就说清楚,真的很急,那边等着要改呢!斑竹,拜托了,说说资料也成啊
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-01-17 16:04
[quote]首先还是要感谢edust,至少我在没有其他办法的时候可以使用这个办法,但总是感觉这样的使用不是非常的有效,并且效率可能会有点低。针对胡大侠的说法,我马上去看一下linux下关于NAT穿越的处理,的确,在处理NAT的时候的确会遇到同样的FTP问题,但是,我不是很明白胡斑竹后面所说的解决方法,希望再仔细说一下,先谢了


我的建议其实很简单,去读读rfc和draft。一切都会明白的。你遇到
的问题老外们都遇到过。

后面我说的那些mike luo也曾经发mail问过我。我发现国内做
vpn client/gw的有很多类似的问题,有没有人请吃饭哪?我要
申请做一个ipsec vpn发展历史和需要解决的问题以及下一步应该
解决的问题的思考报告。 [/quote]

我请你吃饭,写吧,呵呵

我这几天在考虑用mux来做,这样可以实现一个网卡,现在在看MUX和那些adsl拨号软件的层次,不过发现我用的enternet一拨号就页面错误,正在找原因。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-17 16:01
呵呵,这个我肯定相信的,如果你的改进方式和edust的方法相同,我当然不再问了,吃饭是没有问题,还有好多问题想请教呢,这不是大好机会吗?还有还是刚才所说的那个问题,我想知道具体的实现,不是要代码了,我还是想自己来做,不过,你的意思是说在驱动里面直接再虚拟一块网卡吗?想来想去都不是很明白,如果可以,请斑竹指明资料
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2003-01-17 15:52
首先还是要感谢edust,至少我在没有其他办法的时候可以使用这个办法,但总是感觉这样的使用不是非常的有效,并且效率可能会有点低。针对胡大侠的说法,我马上去看一下linux下关于NAT穿越的处理,的确,在处理NAT的时候的确会遇到同样的FTP问题,但是,我不是很明白胡斑竹后面所说的解决方法,希望再仔细说一下,先谢了


我的建议其实很简单,去读读rfc和draft。一切都会明白的。你遇到
的问题老外们都遇到过。

后面我说的那些mike luo也曾经发mail问过我。我发现国内做
vpn client/gw的有很多类似的问题,有没有人请吃饭哪?我要
申请做一个ipsec vpn发展历史和需要解决的问题以及下一步应该
解决的问题的思考报告。
不再回忆从前,我已经生活在幸福当中。
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-01-17 15:52
感谢edust的提示,我看了RFC3022,其实,在客户端里实现隧道模式 ,就是相当于实现NAT,所以解决就是使用RFC1631
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-17 14:21
首先还是要感谢edust,至少我在没有其他办法的时候可以使用这个办法,但总是感觉这样的使用不是非常的有效,并且效率可能会有点低。针对胡大侠的说法,我马上去看一下linux下关于NAT穿越的处理,的确,在处理NAT的时候的确会遇到同样的FTP问题,但是,我不是很明白胡斑竹后面所说的解决方法,希望再仔细说一下,先谢了
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2003-01-17 11:19
我在开发的过程中遇到了一个非常棘手的问题,希望各位高手来看看。我在98下开发VPN客户端,现在,一般的情况下都可以成功了,但是,在进行一些特殊的通讯模式的时候会出现问题,比如,我在FTP的前几个协商包里面需要改掉其协商地址,在驱动里面对包进行过滤并重新填入新的地址,但是,我发现虽然FTP的协商是成功的,但是,TCP的序列号却发生了改变,导致TCP栈不停的重发包,通信也没有办法进行,想了想问题,应该是这样的,因为长度发生了变化,序列号的确是应该改变的,而其差值正好是我改包导致的差值,这个序列号是来自TCPIP协议栈,我们改不了的,我想请教大家,该怎么办?



修改原ip包的地址不是一个好方法,ftp会出问题,所有nat
实现必须特殊处理的协议都会出问题,看看linux nat实现的
那些用于特殊处理的模块就知道,这不是一个小数目,还有
ldap,voiceip等等。

所以通常你可以封装,如果要remote access,为了穿透firewall,
用虚拟网卡dhcp从对方的dhcp server中得到地址。然后用eth0
或者ppp0封装。你的vpn gateway必须支持dhcp转发。



不再回忆从前,我已经生活在幸福当中。
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-17 10:47
你那样做又何必呢?!每个 Application 你都能顾及得过来吗?
看看 RFC1631 推荐的方法:

A special table is used to correct the TCP sequence and acknowledge numbers with source port FTP or destination port FTP. The table entries should have source, destination, source port, destination port, initial sequence number, delta for sequence numbers and a timestamp. New entries are created only when FTP PORT commands are seen. The initial sequence numbers are used to find out if the sequence number of a packet is before or after the last FTP PORT command (delta may be increased for every FTP PORT command). Sequence numbers are incremented and acknowledge numbers are decremented.
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-17 10:43
以下内容来自 RFC1631:

The arguments to the File Transfer Protocol (FTP) PORT command include an IP address (in ASCII!). If the IP address in the PORT command is local to the stub domain, then NAT must substitute this. Because the address is encoded in ASCII, this may result in a change in the size of the packet (for instance 10.18.177.42 is 12 ASCII characters, while 193.45.228.137 is 14 ASCII characters). If the new size is the same as the previous, only the TCP checksum needs adjustment (again). If the new size is less than the previous, ASCII zeroes may be inserted, but this is not guaranteed to work. If the new size is larger than the previous, TCP sequence numbers must be changed too.
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-01-17 09:16
是吗?我也去下一个来看一下。edust,虽然你说的有道理,但我还是在想其它的解决办法,显然,将大的内容的报文改成小的时候,是不用那么麻烦的,只要在适当的地方填入一些空的字符就可以搞定,那么将短的改长呢?如果,我们的方法能够影响IP堆栈的序列号参数,也可以达到目的,但是,我们似乎没有办法去改动这些参数,那么我们可以想点其它办法呢?比如,再通过和应用的通信将差的数据传出去,希望前面那个发送的应用程序再发一个比刚才那个大那个差值包(在内容上),这样就可以使IP堆栈改变它的设置,但是又有这样一个问题,如何才能使我们能够在应用层再次使用那个进程去发包呢?比如,开始我用一个FTP,后面又需要在我自己的应用程序里控制让这个FTP进程使用的SOCKET来发个大点的包,这好象不能实现,我只是想使用一个新的想法,见谅了
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-01-17 08:59
当然是 WDASM 了
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-01-16 19:48
我也是首次给分给你们哦,其实,说实话,我看见很多的实现都是被封装在TCPIP。SYS中了,我其实很想仔细的分析一下这个驱动,可是我将它反汇编出来以后,不太懂,我用的是IDRA,不知道哪里有资料介绍它的使用,反正想要看的东西很多了,你们知道有什么好的静态反汇编的软件吗?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-01-16 17:22
哈哈,我发现很多人第一次都找不到“给分”在哪里,我就是:)
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-01-16 14:19
第一个留言的下面,点给分即可:)

有什么心得来汇报一下。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-01-16 13:59
哎呀,不知道怎么放分了,怎么办呢?告诉我一下,我上网不是很方便,希望大家谅解,还有,只有下次给你们分了
skylgl
驱动小牛
驱动小牛
  • 注册日期2002-05-13
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-01-16 13:54
再次感谢edust和各位高手的指教,也许正如你们所说的,办法可能只有这样子,我只是想通过其它的方法考虑一下这个问题,是啊,我们没有办法看到TCPIP的实现,这也许就是只能那样做了,好吧,如果我能解决这个问题,我会回来再聊些话题的,怎么感觉上刑场,呵呵,先谢了,大家
上一页
游客

返回顶部