免费注册 查看新帖 |

Chinaunix

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

内核构建TCP头的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-11 10:18 |只看该作者 |倒序浏览
(内核版本:2.6.32)

在 tcp_output.c 里面的 tcp_transmit_skb() 函数中,
构建 TCP 头部分有下面一条语句:

        *(((__be16 *)th) + 6)   = htons(((tcp_header_size >> 2) << 12) |
                                        tcb->flags);

tcp_header_size >> 2 是 tcp_header_size 除以4,用于填写 th->doff。
(tcp_header_size >> 2) << 12 是填写完 th->doff 后,填写 th->doff 后面的6位保留未。
                                              (th->doff为4位,保留位6位,即一共10位。而右移2位再左移12位刚好10位)

问题:
1.  等式左边的“+6”是什么意思呢?
2.  最后的 tcb->flags 是怎样解释的?

谢谢各位指教!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2011-12-11 16:44 |只看该作者
回复 1# heray1990
其实,看一下代码就应该可以想到使计算 tcp header 的长度以及 标记位的。

看一下详解1 中 TCP 头部结构中,按照 16bit 偏移 6 的位置是保存 TCP 什么信息的。

论坛徽章:
0
3 [报告]
发表于 2011-12-13 10:56 |只看该作者
回复 2# Godbach

Thanks! 之前没有看 __be16 这个类型是什么,导致不理解是以16bit为单位+6。
看来 TCP/IP 详解不能不看了。。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2011-12-13 11:03 |只看该作者
回复 3# heray1990
详解1 是基础理论知识,当然也包含了不少实践内容,搞网络的,岂能不看

论坛徽章:
0
5 [报告]
发表于 2011-12-16 14:45 |只看该作者
问题:
1.  (__be16 *)th 强制转换th为__be16类型  ; sizeof(__be16) 是2字节, 16bit ;

2.  tcp_header_size >> 2 计算出了tcp首部长度, 因为 首部长度是指 4字节的个数,所以要要用真正的字节数来除以4;

3.    ((tcp_header_size >> 2) << 12) 左移12位,  这样首部长度就位于13-16bit处,
      空出来的12bit就留给保留位4位,flag 8位(新内核从6增加到8位)
      (比如:0x5000  , 5表示首部大小为20字节,接下来0,是保留位,剩下的就是flag.这时候保留位和flag都是0)
      tcb->flags是在control buffer(即sock->cb)中取的标记位的值 ;flag = CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
      如果有标记在sock处理过程中被置1了(比如SYN置1和ACK置1,此时flag=0x0011),
      此时相或的话, 0x5000|0x0011 == 0x5011就可以把tcp头部的相应位置置1了; 我们也就填充好了flag位.
   
回答:
1.  等式左边的“+6”是什么意思呢?这时候th 偏移了6*16个bit(+1,偏移16bit,以此类推), 正好指向了 首部长度 的位置
2.  最后的 tcb->flags 是怎样解释的?在第3条里面.

论坛徽章:
0
6 [报告]
发表于 2011-12-17 09:48 |只看该作者
回复 5# 疯尼克斯


好详细!
   Thanks!!!

论坛徽章:
0
7 [报告]
发表于 2012-11-09 09:32 |只看该作者
正在学习网络这一块 学习啦  谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP