包含在/usr/src/linux/include/linux/tcp.h

struct tcphdr {
__be16 source;
__be16 dest;
__be32 seq;
__be32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
__u16 res1:,
doff:,
fin:,
syn:,
rst:,
psh:,
ack:,
urg:,
ece:,
cwr:;
#elif defined(__BIG_ENDIAN_BITFIELD)
__u16 doff:,
res1:,
cwr:,
ece:,
urg:,
ack:,
psh:,
rst:,
syn:,
fin:;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
__be16 window;
__be16 check;
__be16 urg_ptr;
};

tcphdr->source

16位源端口

tcphdr->dest

16位目的端口

tcphdr->seq

表示此次发送的数据在整个报文段中的起始字节数。序号是32位bit的无符号数。为了安全起见,它的初始值是一个随机生成的数,它到达32位最大值后,又从零开始。

tcphdr->ack_seq

指定的是下一个期望接收的字节,而不是已经正确接收的最后一个字节。

tcphdr->doff

TCP头长度,指明了TCP头部包含了多少个32位的字。此信息的必须的,因为option域的长度是可变的,所有整个TCP头部的长度也是可变的。从技术上讲这个域实际上指明了数据部分在段内的起始地址(以32位字作为单位进行计量),因为这个数值正好是按字为单位的TCP头部的长度,所以,二者的效果是等效的。

tcphdr->res1

保留位

tcphdr->window

16位滑动窗口大小,单位为字节,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数,其最大值为63353字节。

TCP中的流量控制是同一个可变大小的滑动窗口来完成的。window域指定了从被确认的字节算起可以接收多少个字节。window=0也是合法的,相当于说到现在为止多达ack_seq-1个字节已经接收到了,但是接收放现在状态不佳,需要休息一下,等一会再接收更多的数据。以后接收方可以通过发送一个同样ack_seq但是window不为0的数据段,告诉发送方继续发送数据段。

tcphdr->check

校验和,覆盖了整个tcp报文端,是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。

tcphdr->urg_ptr

这个域被用来指示紧急数据在当前数据段中的为止,它是一个相当于当前序列号的字节偏移量。这个设置可以代替中断信息。

fin、syn、rst、psh、ack、urg为6个标志位,含义如下:

tcphdr->fin   :释放一个连接,它表示发送方已经没有数据要传输了。

tcphdr->syn  :同步序号,用来发送一个连接。syn被用于建立连接的过程,在连接请求中,syn=1;ack=0表示该数据段没有使用捎带的确认域。连接应答捎带了一个确认,所以有syn=1;ack=1。本质上,syn位被用于表示connection request和connection accepted,然而进一步用ack位来区分这两种情况。

tcphdr->ret   :该位用于重置一个混乱的连接,之所以混乱,可能是因为主机崩溃或者其他原因。该位也可以被用来拒绝一个无效的数据段,或者拒绝一个连接请求,一般而言,如果你得到的数据段设置了rst位,说明你这一端有了问题。

tcphdr->ack  :ack位被设置为1表示tcphdr->ack_seq是有效的,如果ack为0,则表示该数据段不包含确认信息,所以tcphdr->ack_seq域应该被忽略。

tcphdr->urg  :紧急指针有效

tcphdr->ece  :用途暂时不明

tcphdr->cwr :用途暂时不明

struct tcphdr的更多相关文章

  1. ethhdr、ether_header、iphdr、tcphdr、udphdr 结构介绍

    转自:http://blog.csdn.net/petershina/article/details/8573853 ************************eth的结构*********** ...

  2. tcphdr结构

    包含在/usr/src/linux/include/linux/tcp.h 1 struct tcphdr { 2 __be16 source; 3 __be16 dest; 4 __be32 seq ...

  3. Linux网络驱动--snull

    snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...

  4. Linux2.6内核协议栈系列--TCP协议2.接收

    1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队 ...

  5. C语言位域

    转载自 http://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/ 再谈C语言位域 五 21 bigwhite技术志 bitfield, ...

  6. netfilter的钩子——数据包在内核态得捕获、修改和转发

    转发:http://blog.csdn.net/stonesharp/article/details/27091391 数据包在内核态得捕获.修改和转发(基于 netfilter)    忙活了好几天 ...

  7. Linux内核--网络栈实现分析(四)--网络层之IP协议(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7514017 更多请看专栏,地址 ...

  8. Linux内核--网络栈实现分析(二)--数据包的传递过程(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...

  9. 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)

    一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...

随机推荐

  1. Java自学-控制流程 break

    Java的break语句 结束循环 示例 1 : break; 直接结束当前for循环 public class HelloWorld { public static void main(String ...

  2. IDEA中Tomcat热部署不生效问题解决办法

    IDEA中Tomcat热部署不生效问题解决办法 1.设置完热部署后 2.一定要在Debug模式下运行不要点RUN!!!!!!!!!!!!!!!!!

  3. JavaScript学习笔记(6月份)

    由于笔记比较杂,本身学习程度并不理想,所以暂时没有整理这些繁杂的笔记. ps:博客园markdown用起来和看起来都舒服太多了,这才是我了解的那个markdown,又回来了! 笔记 DOM对象 doc ...

  4. GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率

    GitHub Java项目推荐|功能丰富的 Java 工具包|提高开发效率 功能丰富的 Java 工具包.它帮助我们实现了常用的工具方法,从而减少代码的体积,提高开发效率.该项目最初是作者工作项目中的 ...

  5. 【DATAGUARD】物理dg配置客户端无缝切换 (八.2)--Fast-Start Failover 的配置

    [DATAGUARD]物理dg配置客户端无缝切换 (八.2)--Fast-Start Failover 的配置 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读 各 ...

  6. PDF 补丁丁 0.6.2.3572 测试版发布

    近日有网友反馈 3571 测试版的补丁丁无法正常工作.请下载新发布的 3572 版本.

  7. Spring AOP无法拦截内部方法调用

    当在同一个类中,A方法调用B方法时,AOP无法工作的问题 假设一个接口里面有两个方法: package demo.long; public interface CustomerService { pu ...

  8. 实验之RSTP基础配置

    STP升级版之RSTP 实验环境 实验拓扑图 实验编址 实验步骤 1.基本配置配置PC端 测试i相通性 2.配置RSTP基本功能在S1-S4上都使用命令stp mode rstp更改生成树模式(因为华 ...

  9. python编程之字符bytes转换str问题

    之前学习bytes转换str的时候,场景比较简单,这次是python中使用subprocess模块输出Linux下的执行命令的结果,默认是bytes类型,因此输出的结果并不是我们想要的,bytes的输 ...

  10. 二级数组省市表(二维数组json)

    <一省份.城市二级联动+vue搭架> a. template部分 <section class="edit__place"> <select v-mo ...