免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 向tcp报文新增数据后,如何避免接收方校验和出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
[收藏(0)] [报告]
发表于 2018-02-14 14:18 |只看该作者 |正序浏览
目标:修改发送方内核,在报文的tcp头和ip头之间添加一段数据;修改接收方内核,解析数据内容,接收报文。
实现过程:在发送方的内核构造完tcp头(在net/ipv4/tcp_output.c文件中的tcp_transmit函数的最后),写入一段字符串;在接收方的内核接收完ip头(在net/ipv4/ip_input.c文件中的ip_local_deliver_finish函数的最后),将skb中的字符串删除。
问题:接收方进行tcp头接收时计算校验和后会将该报文丢弃(在net/ipv4/tcp_ipv4.c文件中的tcp_v4_rcv函数中判断skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo)时出错)。
接收方解析的tcp头信息有误,我将tcp头的端口、check等值都恢复成发送时的数值,但是校验和还是有问题。
还有哪儿有问题会让校验和出错,希望可以提供点思路,谢谢!

论坛徽章:
0
34 [报告]
发表于 2018-03-15 11:16 |只看该作者
回复 33# goingstudy

不是,是syn+ack那个。tcp确实麻烦,这个任务做的我好心累

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
33 [报告]
发表于 2018-03-14 21:07 |只看该作者
回复 32# cjCares

是最后一个ACK吗,肯定走协议栈了吧,对TCP这个巨复杂的协议只看过一点,还忘的差不多了

论坛徽章:
0
32 [报告]
发表于 2018-03-13 15:52 |只看该作者
回复 30# goingstudy

再请教你一个问题啊~
三次握手中的第二次握手回复的报文不走协议栈吗?

我在tcp层的tcp_transmit函数,或者是ip层的ip_queue_xmit函数中,向报文插入字符串。这些代码都没执行,对方也能收到回复的报文,它们是怎么发送出去的啊?

论坛徽章:
0
31 [报告]
发表于 2018-03-12 12:58 |只看该作者
回复 30# goingstudy

好的,非常感谢

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
30 [报告]
发表于 2018-03-12 12:17 |只看该作者
回复 29# cjCares

none 应该是表示csum 是坏的或者没有校验,按最新的代码, 在csum_init那里应该是没问题的,但是4.5里头,因为csum_bad 导致失败,而gro好像是唯一设置csum_bad的地方
没有仔细的看过gro的 代码,不知道这算不算是个bug
但是csum_bad 已经被删掉了

论坛徽章:
0
29 [报告]
发表于 2018-03-12 10:53 |只看该作者
回复 28# goingstudy

可以了哎,谢谢!为什么关了gro就行了呢?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
28 [报告]
发表于 2018-03-11 17:22 |只看该作者
你试试把gro disable 看行不行
$ ethtool -k ens32 | grep 'generic-receive-offload'
generic-receive-offload: on

论坛徽章:
0
27 [报告]
发表于 2018-03-09 15:23 |只看该作者
回复 26# goingstudy

嗯,就是if通过了我现在把goto csum_error注释了,用了一个打印输出来替代的。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
26 [报告]
发表于 2018-03-09 15:03 |只看该作者
回复 25# cjCares
skb_checksum_init挂了是什么意思?是到了csum_error吗?
1603  if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo))
1604                goto csum_error;


这样的话是怎么到tcp_v4_do_rcv?

论坛徽章:
0
25 [报告]
发表于 2018-03-09 14:45 |只看该作者
回复 24# goingstudy

两个同关同闭,我都试过了,都是一样的,都在skb_checksum_init那边挂了。
倒是tcp_v4_do_rcv里的tcp_checksum_complete,默认情况下的不通过。开了rx-checksumming,或者关了tx-checksumming,然后就能通过了...
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP