linux TCP头部的构造的简单分析
来源:互联网 发布:php扩展开发中文教程 编辑:程序博客网 时间:2024/05/16 10:49
TCP的头部的构造是在函数tcp_transmit_skb()中进行的
函数片段如下:
/* Build TCP header and checksum it. */th = tcp_hdr(skb);th->source= inet->inet_sport;th->dest= inet->inet_dport;th->seq= htonl(tcb->seq);th->ack_seq= htonl(tp->rcv_nxt);*(((__be16 *)th) + 6)= htons(((tcp_header_size >> 2) << 12) |tcb->flags);
我想分析的的是 最后一条代码,
*(((__be16 *)th) + 6)= htons(((tcp_header_size >> 2) << 12) |tcb->flags);
咋一看还没有看清楚,这个要结合TCP的头部结构来分析,下面是TCP结构图
代码解释如下:http://bbs.chinaunix.net/forum.php?mod=viewthread&action=printable&tid=3628923
1. (__be16 *)th 强制转换th为__be16类型 ; sizeof(__be16) 是2字节, 16bit ;
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位.
0 0
- linux TCP头部的构造的简单分析
- linux TCP头部的构造的简单分析
- TCP的头部
- tcp 头部选项的机制
- TCP头部格式的了解
- Linux下TCP/IP协议栈的简单脉络分析
- 简单头部姿态的估计
- TCP头部的ACK与SEQ
- Linux内核分析——构造一个简单的Linux内核MenuOS
- Linux内核分析课程--构造一个简单的Linux系统MenuOS
- Linux内核分析(三):构造一个简单的Linux系统MenuOS
- 简单的tcp socket编程及分析
- 简单的tcp socket编程及分析
- TCP协议的学习(二)TCP头部信息
- TCP-IP详解:TCP的头部与选项
- Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统
- 构造一个简单的Linux系统MenuOS
- Linux下socket TCP的简单例子
- Android中Intent传递对象的两种方法(Serializable,Parcelable) .
- LeetCode Spiral Matrix II
- 如何阅读KVM代码
- android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
- 有点无聊,重写的四则运算
- linux TCP头部的构造的简单分析
- mac osx网络共享,
- MYSQL创建BBS表,表外键自己加,仅供参考
- 24点游戏随机显示扑克牌在客户区
- RAC--配置SSH
- SpringMVC与Ibatis整合
- 我的技术博客
- 巧克力
- 那些数据库的小事