免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8911 | 回复: 8
打印 上一主题 下一主题

关于原始套接字的又一个棘手问题:如何设置TCP确认号 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2010-10-30 01:29 |显示全部楼层
clew_tcphdr->ack_seq = htonl (payload_len + ntohl(tcp->seq)+1);

论坛徽章:
0
2 [报告]
发表于 2010-11-01 11:38 |显示全部楼层
晕,还有checksum的问题

论坛徽章:
0
3 [报告]
发表于 2010-11-01 13:47 |显示全部楼层
本帖最后由 奇门遁甲-lu 于 2010-11-01 22:21 编辑

分析你的数据包:

   按我的方法改了后,ack_seq是对的,但是发现你发出去的数据包src_port 不对,

正确应为80,实际发现是1;
已经有  setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))了,
表明IP头部要自己构造,自然,更上层的网络层头部也要自己构造了,所以
可以不要 setsockopt(sockfd, IPPROTO_TCP, IP_HDRINCL, &on, sizeof(on));
自己构造tcp头部,包括tcp_checksum;另外你的程序3次sendto,
应该每次要修改相应的seq, ack_seq;

论坛徽章:
0
4 [报告]
发表于 2010-11-01 15:57 |显示全部楼层
你看一下你前面两个附件的pcap,
没发现构造的tcp头部源端口不对吗?

论坛徽章:
0
5 [报告]
发表于 2010-11-01 16:47 |显示全部楼层
楼主太客气了。
有失败才进步。

论坛徽章:
0
6 [报告]
发表于 2010-11-02 01:03 |显示全部楼层
本帖最后由 奇门遁甲-lu 于 2010-11-02 01:04 编辑

见鬼了,

看你的pcap数据包, ack_seq是正确了的。 你说不生效,不知道是什么意思?
tcp source_port 总是为1, 并且出现tcpmux,字样,怀疑tcp 端口成对复用了会这样。
google  tcpmux,很诡异。纳闷为什么出现在你的测试中

我在我机子上试,x86 fedora 11一切正常(只测试了ack_seq和src_port 问题),只是tcp_checksum要自己算。而你却不用,很奇怪了。

论坛徽章:
0
7 [报告]
发表于 2010-11-02 12:26 |显示全部楼层
你看到的seq 和 ack_seq都是相对于初始序列的相对值,wireshark上说明了是relative.
如在连接中带syn标志的 seq, wireshark显示0,然后双方以后就相对增加ack_seq和seq,
相对值有利于肉眼快速计算ack_seq而已,你可以用 tcpdump -S, 看到真实的seq,
你也可以在wireshark上,用鼠标点击就可在最下栏看到16进制真实值.

由于你的src_port不对,相当于是新的连接了,wireshark又没有这个连接的syn统计,因此定义ack_seq为1没什么奇怪的。

如你所述根据你的pcap,计算ack如下:

收到的seq = 0xde5bbeda, payload = 596;
你的回复 ack_seq = seq + payload + 1 = 0xde5bc12f

论坛徽章:
0
8 [报告]
发表于 2010-11-02 17:06 |显示全部楼层
是不是接收到的时候就已经是1了??,或者数据在别的地方就被改了。
你先确认了再去问也不迟。

论坛徽章:
0
9 [报告]
发表于 2010-11-02 17:10 |显示全部楼层
直接改成   clew_tcphdr->source = htons(80);;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP