当前位置: 技术问答>linux和unix
急,请教一个将TCP数据包修改为UDP包的问题,高手请进!
来源: 互联网 发布时间:2015-10-23
本文导语: 我利用netfilter实现了一个将TCP数据包重定向并修改为UDP数据包的程序: 说明如下: A : 192.168.225.233 B : 192.168.225.234 现从A发送TCP数据到B,PORT=8989,然后B加入钩子对此TCP数据进行判断处理,转换成UDP数据并返回给A的POR...
我利用netfilter实现了一个将TCP数据包重定向并修改为UDP数据包的程序:
说明如下:
A : 192.168.225.233
B : 192.168.225.234
现从A发送TCP数据到B,PORT=8989,然后B加入钩子对此TCP数据进行判断处理,转换成UDP数据并返回给A的PORT口:8988。
现在的问题是,如果在B中我的钩子函数只做包头的修改并转发此数据包到A,A可以收到一些UDP数据,然后就再也收不到数据了。很显然这是由于没对从A发进来的TCP数据进行ACK应答处理引起的。由于B没有对A的TCP数据进行应答和滑动窗口的更新处理,从而不能接受到新的数据。
现在的问题是,我在程序中加入了对TCP的应答处理,可是却没有任何作用,我发现我的应答数据根本就没有发送出去(用ethereal抓包查看),代码如下,还请高手帮忙解答:
说明如下:
A : 192.168.225.233
B : 192.168.225.234
现从A发送TCP数据到B,PORT=8989,然后B加入钩子对此TCP数据进行判断处理,转换成UDP数据并返回给A的PORT口:8988。
现在的问题是,如果在B中我的钩子函数只做包头的修改并转发此数据包到A,A可以收到一些UDP数据,然后就再也收不到数据了。很显然这是由于没对从A发进来的TCP数据进行ACK应答处理引起的。由于B没有对A的TCP数据进行应答和滑动窗口的更新处理,从而不能接受到新的数据。
现在的问题是,我在程序中加入了对TCP的应答处理,可是却没有任何作用,我发现我的应答数据根本就没有发送出去(用ethereal抓包查看),代码如下,还请高手帮忙解答:
|
如果在服务端和客户端加上校验(如包序号、长度等),TCP包可以转换为UDP包吗 ? 应该可以吧
|
如果是应用层程序,b上也应该是两个进程,各自完成TCP,UDP通信,共享数据缓冲区,就不用考虑这么多了。
但你写的是内核程序,为什么在内核实现?
但你写的是内核程序,为什么在内核实现?
|
从理论上就行不通:
A和B是用TCP协议方式通信,也就是说通信中有序列号,应答机制,不论你怎么将数据包换成UDP形式给A和B中的任意一方,由于A和B都需要对数据进行验证,发现数据包内根本就不是它要的数据,它就会认为是错误的,然后就丢弃,然后再要求远端重发数据,所以你这样做了,任何一方都认为没有收到任何数据的!!!!!!那么就相当于没有数据传输(在TCP层看来)
A和B是用TCP协议方式通信,也就是说通信中有序列号,应答机制,不论你怎么将数据包换成UDP形式给A和B中的任意一方,由于A和B都需要对数据进行验证,发现数据包内根本就不是它要的数据,它就会认为是错误的,然后就丢弃,然后再要求远端重发数据,所以你这样做了,任何一方都认为没有收到任何数据的!!!!!!那么就相当于没有数据传输(在TCP层看来)
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。