- 论坛徽章:
- 0
|
做过类似的。如果只是象你说的这样,那比较好解决。
就是指插入的数据很少,可能就几个字符,所以不需要重传,不跨越包界限。可能就插入或删除一次。但是一般都是想完全劫持TCP的,所以重组重传都是需要的。
TCP连接跟踪,这个你一定已经做了。 记录offset和插入的开始点。将offset加到syn 上,减到反向的ack上。
1、在系统中维护这个 TCP 连接的序号,重新计算,但应该怎么计算?
newsyn = htonl (ntohl(oldsyn) + offset)
然后tck checksum还需要重算。
注意最后的fin-ack也需要更改。要不可能长时间这个连接在来回发fin .
2、不清楚是否滑动窗口也要重新计算?
不需要改变。
3、如果 TCP 连接正常,这个规律还相对简单,如果遇到丢包、重传、乱序、复制包怎么办?如何判断?
如果你根据单个包就可以分辨出要改哪里,这些就可以不管,你改过的那个包丢了,你也不需要重传,等重传包来了以后,你再改一次就是了。
如果不能单个包确定插入点和完成插入,就麻烦了一点。就需要自己TCP重组了。
如果要插入大段数据,比如几十K,当然需要自己重传,需要有发送队列,还需要拥塞控制了。
4、如果改变了 seq,那么 ack_seq 肯定也要改的,win 呢?是否也需要一起修改?
这边的ack不需要改,要是你插入了两个字节,回来的ack就要减去两个字节了。否则就乱套了。win还是不需要更改。
5、上面的解决思路是否正确?是否有什么好方法可以解决这个问题呢?
据我所知,没有更好的方法了。本来squid有种透明代理的,好像你说不适合你用。
libnids中TCP重组的部分, honeyd(honeyd.c)中的模拟TCP连接部分,可以做为参考。 |
|