16.6 KB, 下载次数: 41
原帖由 故哈 于 2009-8-18 14:46 发表
现在的问题是client受到了返回的http包.但是浏览器没有显示返回包的内容,还依旧不停的给真正的服务器发get包
通过抓包发现数据是发过来了
首先感谢一下Godbach版主。
tmp=tcph->ack;
printk("tmp=%02X\n", tmp);
tcph->ack=htons(ntohs((tcph->seq)+ tcp_datalen));
printk("tcp->ack=%02X\n", tcph->ack);
tcph->seq= tmp;
tmp=tcph->ack_seq;
tcph->ack_seq=htonl(ntohl(tcph->seq)+ tcp_datalen);
tcph->seq= tmp;
printk("old tcph->ack_seq=%u\n", ntohl(tcph->ack_seq));
printk("old tcph->seq=%u\n", ntohl(tcph->seq));
tmp=tcph->ack_seq;
tcph->ack_seq=htonl(ntohl(tcph->seq)+ tcp_datalen);
tcph->seq=tmp;
printk("tcph->ack_seq=%u\n", ntohl(tcph->ack_seq));
printk("tcph->seq=%u\n", tmp);
old tcph->ack_seq=2847419816
old tcph->seq=2484901326
tcph->ack_seq=2484904361
tcph->seq=2821568681
原帖由 故哈 于 2009-8-18 15:21 发表
序列号都是重新赋值的
tmp=tcph->ack;
printk("tmp=%02X\n", tmp);
tcph->ack=htons(ntohs((tcph->seq)+ tcp_datalen));
printk("tcp->ack=%02X\n", tcph->ack);
tcph->seq= tmp;
ntohl old tcph->ack_seq=4179092007
ntohl old tcph->seq=1997420798
ntohl tcph->ack_seq=1997423833
ntohl tcph->seq=4179092007
原帖由 Godbach 于 2009-8-18 16:31 发表
用十六进制打印收到报文的seq和ack_seq, 以及构造的seq和ack_seq
并且打印出收到报文载荷的长度,和新构造报文载荷的长度
old tcp_datalen 3035
old tcp_totlen 3055
old tcph->ack_seq=f2026212
old tcph->seq=fb686a5d
tcph->ack_seq=d6746a5d
tcph->seq=f2026212
new tcp_datalen 55256
new tcp_totlen 55276
原帖由 platinum 于 2009-8-18 16:41 发表
真正的 seq 和 ack 就是一个乱七八糟的数
wireshark 里看到的数实际上是与第一个 syn 的差值
如果想得到真正的序号,你需要把 syn 时候的数值记录下来,之后的序号去减这个 syn 的值就可以了
原帖由 Godbach 于 2009-8-18 16:47 发表
old tcp_datalen 3035
new tcp_datalen 55256
新的报文这么大啊,不对吧,MTU在以太网上也就1500啊,有分片了吗?
tcp_totlen = iph->tot_len - iph->ihl*4;
tcp_datalen = tcp_totlen - tcph->doff*4;
printk("new tcp_datalen %d\n", tcp_datalen);
printk("new tcp_totlen %d\n", tcp_totlen);
ret=dev_queue_xmit(skb);
if(ret==-1){
printk("send error\n");
}
原帖由 故哈 于 2009-8-18 16:45 发表
这样的话 如果我想要知道正确的值的话 就只能在握手的时候就记录每一条连接的seq值?
这样岂不是涉及到连接跟踪了?
god版主 也是这么做的么?
原帖由 故哈 于 2009-8-18 16:45 发表
这样的话 如果我想要知道正确的值的话 就只能在握手的时候就记录每一条连接的seq值?
这样岂不是涉及到连接跟踪了?
god版主 也是这么做的么?
old tcp_datalen 3035
old tcp_totlen 3055
old tcph->ack_seq=6032b51e
old tcph->seq=bc7226e2
tcph->ack_seq=977e26e2
tcph->seq=6032b51e
new tcp_datalen 55256
new tcp_totlen 55276
HTTP/1.0 304 OK
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Connection: close
<html>
<body>
OK OK Ok
</body>
</html>
old tcph->ack_seq=6032b51e
old tcph->seq=bc7226e2
tcph->ack_seq=977e26e2
tcph->seq=6032b51e
old tcp_datalen 3035
old tcp_totlen 3055
old tcph->ack_seq=f545a42c
old tcph->seq=90ea3357
tcph->ack_seq=90ea3f32
tcph->seq=f545a42c
new tcp_datalen 55256
new tcp_totlen 55276
原帖由 故哈 于 2009-8-18 16:49 发表
我在对端接收的包是没有分片的
我是在新包发送之前取的值
tcp_totlen = iph->tot_len - iph->ihl*4;
tcp_datalen = tcp_totlen - tcph->doff*4;
printk("new tcp_datalen %d\n", tcp_datalen);
printk("new tcp_totlen %d\n", tcp_totlen);
ret=dev_queue_xmit(skb);
if(ret==-1){
printk("send error\n");
}
tcp_totlen = iph->tot_len - iph->ihl*4;
原帖由 故哈 于 2009-8-19 14:53 发表
把iph的totlen转换之后, 第一次回包的ack和seq不再报错了, 但是从第二次开始还是报错。 而且浏览器依然不行
ie chrome firefox 都试了
原帖由 Godbach 于 2009-8-19 15:31 发表
head和end指针是没法移动的,这是申请skbuff的时候已经笃定好了。可以修改的只有data和tail。且data>=head, tail
我在内核打印出来end-tail=1416
old tcp_datalen 445
old tcp_totlen 465
old tcph->ack_seq=20577665
old tcph->seq=9629a5ac
tcph->ack_seq=9629a769
tcph->seq=20577665
new tcp_datalen 176
new tcp_totlen 196
tail-data=230
end-tail=1416
new tcp_datalen 176
new tcp_totlen 196
tail-data=230
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |