struct tcphdr
包含在/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的更多相关文章
- ethhdr、ether_header、iphdr、tcphdr、udphdr 结构介绍
转自:http://blog.csdn.net/petershina/article/details/8573853 ************************eth的结构*********** ...
- tcphdr结构
包含在/usr/src/linux/include/linux/tcp.h 1 struct tcphdr { 2 __be16 source; 3 __be16 dest; 4 __be32 seq ...
- Linux网络驱动--snull
snull是<Linux Device Drivers>中的一个网络驱动的例子.这里引用这个例子学习Linux网络驱动. 因为snull的源码,网上已经更新到适合最新内核,而我自己用的还是 ...
- Linux2.6内核协议栈系列--TCP协议2.接收
1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队 ...
- C语言位域
转载自 http://tonybai.com/2013/05/21/talk-about-bitfield-in-c-again/ 再谈C语言位域 五 21 bigwhite技术志 bitfield, ...
- netfilter的钩子——数据包在内核态得捕获、修改和转发
转发:http://blog.csdn.net/stonesharp/article/details/27091391 数据包在内核态得捕获.修改和转发(基于 netfilter) 忙活了好几天 ...
- Linux内核--网络栈实现分析(四)--网络层之IP协议(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7514017 更多请看专栏,地址 ...
- Linux内核--网络栈实现分析(二)--数据包的传递过程(上)
本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7492423 更多请看专栏,地址 ...
- 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)
一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...
随机推荐
- linux 压力测试工具之ab
简介 Apache Benchmark(简称ab) 是Apache安装包中自带的压力测试工具 ,简单易用 在此提供 ab 在 centOS7 下的安装和使用方法注:个人发现,之前安装的centos6. ...
- 2019 东软java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.东软等公司offer,岗位是Java后端开发,最终选择去了东软. 面试了很多家公司,感觉大部分公司考察的点都差不多 ...
- IDEA自动清理优化import包
IDEA自动清理优化import包 直接上图: Add unambiguous imports on the fly:快速添加明确的导入. Optimize imports on the fly:快速 ...
- 【转】java 环境变量:path与classpath区别
path指示java命令的路径,像javac.java.javaw等: classpath是javac编译器的一个环境变量,它的作用与import.package关键字有关,当你写下improt ja ...
- 【BBED】bbed常用命令
[BBED]bbed常用命令 一.1 相关知识点扫盲 BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是O ...
- Node: 开发命令行程序英文版 (Create Your Own CLI)
CLI, as an abbreviation of Command-line Interface, can receive user's input and give an immediate re ...
- Flask--登录验证(多个装饰器)
登录验证(多个装饰器) from flask import Flask,url_for,session,render_template import functools app = Flask(__n ...
- Qt编译出错 GL/gl.h:No such file or directory
系统:Ubuntu18.04 软件:QtCreator4.8 Qt5.9.8 编译Qt Widgets Application类型的项目时,出现错误,提示: GL/gl.h: No such file ...
- Github 上 36 个最实用的 Vue 开源库
任何一个开发者,都是十分喜欢使用开源软件包的.因为它使开发工作变得更快速.高效.容易.如果没有开源软件包,开发工作将变得疲惫不堪,不断的重复造轮子! 下面整理了 Github 上 36 个实用的 Vu ...
- golang读写文件之Scan和Fprintf
1. 标准输入输出 os提供了标准输入输出: Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = NewF ...