阅读:3854回复:11
怎么用原始套接字模拟三次握手、。
项目要求使用原始套接字模拟三次握手,但是到第二次握手的时候,系统老是自作聪明发送了一个RST标志的TCP,
我已经尝试 m_socket=socket(AF_INET,SOCK_STREAM,0); bind(m_socket,(struct sockaddr *)&RegPort,sizeof(struct sockaddr)); listen(m_socket,SOMAXCONN); 绑定端口,和监听端口,防止端口不可到达,但是系统还是自作聪明发送一个RST数据包 |
|
沙发#
发布于:2004-05-28 14:25
你这不是用原始套接字
你用的是SOCK_STREAM 原始套接字的类型为SOCK_RAW //初始化 Raw Socket if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == INVALID_SOCKET) throw Exception(\"socket setup error!\"); //设置IP头操作选项 if (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag)) == SOCKET_ERROR) throw Exception(\"setsockopt IP_HDRINCL error!\"); //把 sock 绑定到本地地址上 if (bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR) throw Exception(\"bind error!\"); 以上是RAWSOCKET的一些代码用法 |
|
|
板凳#
发布于:2004-05-28 14:34
还有,你的表述不是很明确
我无法判断你的具体需求 是拦截TCP通讯的三次握手,并干预三次握手过程呢,还是就是自己实现协议栈。 如果是第一种情况,分你是发起方还是接受方两种情况处理: 接受方: 检查SYN标志-》复制SYN+设置ACK标志,保存序列,校验,构造syn+ack报文-》设置超时-》发送-》监听 太多了,不写了,你找个扫描软件的源代码看看; 是那种半开扫描的代码,改改就是你要的功能。 |
|
|
地板#
发布于:2004-05-28 15:56
m_socket=socket(AF_INET,SOCK_STREAM,0);
bind(m_socket,(struct sockaddr *)&RegPort,sizeof(struct sockaddr)); listen(m_socket,SOMAXCONN); 这段代码不是原始套接字的代码,是打开一个用于TCP的端口,防止发送ICMP端口不可到达的协议。 但是我不清楚,为什么打开端口后客户机还是要产生RST的tcp报文 |
|
地下室#
发布于:2004-06-01 09:24
因为你的客户端超时没有响应,这时,服务端查询是否已经建立连接,结果当然是没有建立连接,此时。客户端有义务发回RST信号,重置服务端连接
你看看协议 或者去看看半连接扫描器的源代码就知道了 |
|
|
5楼#
发布于:2004-06-01 09:34
半开放式连接(handshake cheating connection)
Client--------Syn------->Server Client<-----Syn/Ack------Server Client----->\\\\延迟回应---Server Client-connected--?<-----Server Client--------RST------->Server 你的问题就出现在第二步结束以后 因为延迟回应,导致第四步动作,从而产生第五步的动作 问题的原理是在这里 可是你还没有回答我你到底是做的什么功能,自己实现那一边(C?/S?) |
|
|
6楼#
发布于:2004-06-01 09:40
还有
我感觉你做这样的事情,用RAW SOCKET有一些问题 WINDOW下需要考虑WINDOW本省协议栈对连接的响应。 RAW SOCKET是获得数据报的旁路拷贝,而不是拦截。所以用来实现自己的底层通讯协议可以考虑,但是实现机器已经安装的协议受到的干扰太多了。越是高层协议,受到的干扰越多,而且行为不稳定,网络轻载和重载的行为有很大差异。 |
|
|
7楼#
发布于:2004-06-02 16:29
兄弟,谢谢你的回复
我做的是网关的问题 |
|
8楼#
发布于:2004-06-03 16:10
网关要考虑什么三次握手
好像不需要考虑高层协议吧 IP包转发不就可以了吗?乱说的 |
|
|
9楼#
发布于:2004-06-03 16:11
你不会做电话网关吧,IP网关好像现在大多都不 用做协议转换
|
|
|
10楼#
发布于:2004-06-03 18:05
谢谢楼上的兄弟热情的回复,
不知道用TDI能否很好地处理这个问题,也就是截获握手的数据包,和构造这种数据包来发送. 另外TCP是面向连接协议,要向系统堆栈注册的,我的ICMP,和UDP都工作得很好,现在一直没有进展就是因为TCP做不了, |
|
11楼#
发布于:2004-06-03 18:08
再说一句,在底层可以不用理会各个协议的关系,
但是在高层做起来麻烦,我知道用NDIS IMD可以很好处理,但是 太难,而且不支持modem,NDIS HOOK有没有相关的规范文档, 所以打算用TDI, 各位走过路过,可怜偶这个超级菜鸟程序员吧,5555~~~~ |
|