博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux TCP头部的构造的简单分析
阅读量:4029 次
发布时间:2019-05-24

本文共 963 字,大约阅读时间需要 3 分钟。

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结构图

代码解释如下:

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位.

你可能感兴趣的文章
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>
scrapy:xpath string(.)非常注意问题
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
单纯的把Y通道提取出来能正确显示出灰度图来为什么我的Qt就显示不出来呢转换有问题呀?
查看>>
YUV420只绘制Y通道
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt5 everywhere 编译summary
查看>>
qt5 everywhere编译完成后,找不到qmake
查看>>
arm-linux开机读取硬件时钟,设置系统时钟。
查看>>
交叉编译在x86上调试好的qt程序
查看>>
/dev/input/event0 键盘输入
查看>>
qt 创建异形窗体
查看>>
可重入函数与不可重入函数
查看>>
简单Linux C线程池
查看>>