问题是这样的:  现在有很多网关防火墙,都设置为只允许TCP的80端口通过,其它的端口都封掉了。这样想传输数据,就只能通过80端口了,比如QQ对于这种情况,可以使用http代理。这样就实现了使用http协议传输自己的数据的功能,因为是走的tcp的80端口,所以防火墙就不会拦截。  但是现在我需要传输实时语音数据,这种语音数据都是用UDP来传输的,为什么不用TCP来传输语音数据,是因为语音对实时性的要求很高,不要求可靠,对于部分丢失了的包,不必重传,可以用语音算法来弥补。如果用这种走TCP 80端口中转的方式,就会牺牲了实时性,因为TCP会自动丢包重传、滑动窗口拥塞控制等。  现在的一个想法是:不用TCP的这些丢包重传等特性,只用TCP的标志头,通过自己封包来传输数据(比如raw socket),这样就即满足了语音传输的要求,又能通过防火墙。也就是说使用TCP的标记,但像UDP一样使用,自己来控制丢包、拥塞等问题。  需要同时考虑发送端和接收端。我想发送端自己封包发送,可能相对简单一点;对于接收端,在数据链路层或网络层,通过某种技术(如NDIS等)判断如果是自己的数据包就拦截下来,否则就交给上层正常处理。  实现上不限技术,不知这种想法可行么?欢迎讨论。

解决方案 »

  1.   

    呵呵,这东东应该别人在出TCP/UDP协议时,就早考虑过了这样能综合两者的优点,你说为何别人不早设计出来咧呵呵,看来不是一般D难主要是中间那个控制, TCP协议倒是公开,具体实现只要标志,控包,拥塞 等呵呵,只能说LZ好运
      

  2.   

    QQ用UDP传消息传文件,不就是自己来控制丢包重传的么
      

  3.   

    tcp转udp到就像ccproxy一样,不过用80的http隧道不是很好吗,这样也是效率考虑,当然了端口复用也不错的,怎么要往udp上走,udp的传输.... en....
      

  4.   

    不太可行,因为想直接修改报文,把tcp改为udp的一些特性,不就直接变异拉!这种变异,直接关系到tcp/ip协议的实现。这种想法,如果只讨论它的技术研究,我想可以走两条路!一就是直接修改tcp/ip协议的实现。二就是利用现在的tcp/ip用迂回的办法去实现这种功能,而不去动基层协议!
      

  5.   

    可行是可以的,snake的跳板不就实现了,不过使用udp不好玩啊
      

  6.   

    我想从实现上分为3个部分:发送、传输和接收
    如果不可行,发送传输和接收,我想知道究竟是哪部分不可行呢?个人的分析:`
    1. 对于发送部分,我想采取类似raw socket的方法,参考
    http://www.langzhou.com/lz_48716_e9.htm
    http://www.chinaspx.com/archive/develop/7162.htm
    (使用NDIS驱动等是否可以达到相同的功能?NDIS我不熟,还希望熟悉NDIS的朋友指点)2. 对于数据包在网络中的传输,会有问题吗?首先网关防火墙是不会拦截的,那么是否会受到IP分片与重组的影响呢,我个人觉得不会。3. 对于接收部分,在数据包到达传输层之前,判断是自己的包,就拦截下来,就像网络防火墙(如天网)一样,用NDIS。
      

  7.   

    nonocast(如果没有如果)
    首先需要你要在80端口上做拦截
    这样会有被认为是木马的可能性
    ------
    这个先暂时不担心。只讨论技术是否可行。
    N3Software(N3软件网络) 
    网关内可不只一台机器, 如果要外网访问访问网关内机器, 就算可以用80端口传送数据也是不行的.
    ------
    是内网主动访问外网的80端口。
    对于网关(路由器)防火墙来说,通过它的数据包和浏览器上网、网际快车下载文件是一样的
    sevencat(七猫)
    不可行!!!
    ------
    可以具体说说吗
      

  8.   

    我觉得是可行的不过工作量比较大楼主可以做NDIS驱动,不必要使用Raw Socket,关键的地方就是encode和decode协议数据。
      

  9.   

    >> sevencat(七猫) ( ) 信誉:76  2006-7-10 14:43:25  得分: 0  
       
    不可行!!!
    ----------可以具体说说吗
      

  10.   

    楼主想的太简单了,可以用udp代替tcp,然后自己封装包头,这样处理对数据传输准确性不高的应用,完全可行,而且这样处理,在某些情况下,传输效率还要更高。
    不过,即使用udp一样会面对防火墙封端口的问题,还是需要单做个中间接收程序,来检测80端口接收服务器端发送过来的封装后的数据报,如果是检测到本应用包,再还原到原来的数据包。
    也就是常说的httptunnel技术。
    所以不管楼主使用什么协议,这一步都是必不可少。
      

  11.   

    >>nuaawenlin(飘人) ( ) 信誉:105 
    非常感谢,你给了我一些自信 :)
    >> pig_2000() ( ) 信誉:82 
    你可能没有明白我的意思。httptunnel的本质上还是TCP。
    其实我所想要的,既不是TCP,也不是UDP,因为它们都有缺点(TCP的速度慢,UDP不能过防火墙),我要的是一个“非标准TCP”,一个不带丢包重传功能的TCP,它不可靠,但是效率比标准TCP高,就像UDP一样。实现上,只可能从驱动上入手,是否可行还不确定
    也许试了才知道,目前正在研究NDIS中间层驱动
      

  12.   

    感谢各位的回复,我已经基本上实现了
    用的NDIS IMD驱动
      

  13.   

    搞得挺不错
    牛!!!!
    顶,玩驱动,是不是就等于组合拉tcp/ip的一些功能(或者说修改拉传统的协议达到一定的创新)!