TCP 报文格式及TCP Flags
(一)前言
TCP 是一个基于连接的四层协议,提供全双工地,可靠地传输系统。它能够保证数据被远程主机接收。并且能够为高层协议提供flow-controlled 服务。
(二)TCP 报文格式(rfc793)
各个Field说明:
源端口(Source Port):长度为16 bits(2个字节)。源端口。
目的端口(Destination Port):长度为16 bits(2个字节)。目的端口。
序列号(Sequence Number):长度为32 bits(4个字节)。指定了当前数据分片中分配给第一字节数据的序列号。在TCP传输流中每一个字节为一个序号。如果TCP报文中flags标志位为SYN,该序列号表示初始化序列号(ISN),此时第一个数据应该是从序列号ISN+1开始。
确认序列号(Acknowledgment Number):长度为32bits(4个字节)。表示TCP发送者期望接受下一个数据分片的序列号。该序号在TCP分片中Flags标志位为ACK时生效。序列号分片的方向和流的方向同方向,而确认序列号分片方向和流方向反方向。
数据偏移或首部长度(Data Offset/Header Length): 长度为4bits。数据偏移也叫首部长度。因为首部长度实际也说明了数据区在分片中的起始偏移值。它表示TCP头包含了多少个32-bit的words。因为4bits在十进制中能表示的最大值为15,32bits表示4个字节,那么Data Offset的最大可表示15*4=60个字节。所以TCP报头长度最大为60字节。如果options fields为0的话,报文头长度为20个字节。
预留字段(Reserved field):长度为6bits。值全为零。预留给以后使用。
标志位(Flags): 长度为6bits。表示TCP包特定的连接状态。一个标签位占一个bit,从低位到高位值依次为FIN,SYN,RST,PSH,ACK,URG。新定义的TCP头还扩展了ECE,CWR,NS.
窗口(Window):长度16bits(2个字节)。表示滑动窗口的大小,用来告诉发送端接收端的buffer space的大小。接收端buffer大小用来控制发送端的发送数据数率,从而达到流量控制。最大值为65535.
校验和(Checksum):长度16bits(2个字节)。用来检查TCP头在传输中是否被修改。
紧急指针(Urgent pointer):长度为16bits(2个字节)。表示TCP片中第一个紧急数据字节的指针。只有当URG标志置1时紧急指针才有效。
选项和填充(Option和pading):可变长度。表示TCP可选选项以及填充位。当选项不足32bits时,填充字段加入额外的0填充。
数据(Data):长度可变。用来存储上层协议的数据信息。可以为空。比如在连接建立和连接中止时。
TCP 采用全双工模式,在连接建立后和连接中止前进行数据传输,数据传输是单向的,从发送端传输给接受端。TCP通过序列号能够保证数据被接受端接受。TCP建立连接是通过三次握手的方式来建立连接的。
(三) TCP Flags
TCP 在连接过程中,通过Flags标志位来表示传输过程中的连接状态。因此可以通过标志位来进行问题定位或者控制指定的连接是否提交。TCP 三次握手过程如下:
对于旧版本的TCP头定义,Flags有6bits,新版TCP头对flags扩展了3bits。每个TCP flag对应于1bit位。所以旧版TCP头flags值有6个,新版扩展了3个值。从低位到高位分别是:FIN,SYN,RST,PSH,ACK,URG,ECE,CWR,NS。
旧版TCP Flags字段:
新版TCP Flags字段:
Flags值说明:
FIN: "finished"简写。表示发送者以及发送完数据。通常用在发送者发送完数据的最后一个包中。
SYN: "Synchronisation"简写。表示三次握手建立连接的第一步,在建立连接时发送者发送的第一个包中设置flag值为SYN。
RST: "reset"简写。重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者发送包发送到一个不是期望的 目的主机时,接收端发送reset 重置连接标志的包。
PSH: "push"简写。通知接收端处理接收的报文,而不是将报文缓存到buffer中。
ACK: "Acknowledgment"简写。表示包已经被成功接收。
URG: "urgent"简写。通知接收端处理在处理其他包前优先处理接收到的紧急报文(urgent packets)。详见RFC6093。
ECE: "ECN-Echo"简写。ECN表示Explicit Congestion Notification。表示TCP peer有ECN能力。详见RFC3168。
CWR: "Congestion Window Reduced"简写。发送者在接收到一个带有ECE flag包时,将会使用CWR flag。 详见RFC3168。
NS: "nonce sum"简写。该标签用来保护不受发送者发送的突发的恶意隐藏报文的侵害。详见 RFC 3540。
(四) 使用tcpdump抓取响应flag值得报文
因为TCP Flags 位于TCP头的第14个字节中。所有可以通过如下命令进行抓取:
抓取FIN包: tcpdump -i eth0 "tcp[13] & 1" -ennnv
抓取SYN包: tcpdump -i eth0 "tcp[13] & 2" -ennnv
抓取RST包: tcpdump -i eth0 "tcp[13] & 4" -ennnv
抓取PSH包: tcpdump -i eth0 "tcp[13] & 8" -ennnv
抓取ACK包: tcpdump -i eth0 "tcp[13] & 16" -ennnv
抓取URG包: tcpdump -i eth0 "tcp[13] & 32" -ennnv
参考:
https://tools.ietf.org/html/rfc793
https://tools.ietf.org/html/rfc3168
https://tools.ietf.org/html/rfc3540
TCP 报文格式及TCP Flags相关推荐
- tcp报文格式_34.TCP取样器
阅读文本大概需要3分钟. 1.TCP取样器的作用 TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据. 2.TCP取样器详解 TCPClient classname:TCP报 ...
- 由 TCP 报文格式谈 TCP — 源端口号、目的端口号、报文段序号(一)
博主曾经学 Linux 的时候,觉得知识点很多很难很困惑,遂问一前辈,怎么才能学通学精达到融会贯通,前辈意味深长地丢给博主三个字:写博客.博主于是屁颠屁颠儿地跑过来写博客了,本人大三网络工程专业,最近 ...
- TCP 的那些事 | TCP报文格式解析
TCP(Transmission Control Protocol 传输控制协议)提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之 ...
- (一)深入浅出TCPIP之理解TCP报文格式和交互流程
目录 1.引入TCP: 1.1 TCP用户代码 2. TCP数据报文格式 3 TCP栈及socket的初始化
- 网络:传输层 TCP报文格式解析
一.TCP报文格式 1.为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图: 图2 TCP报文格式 16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数 ...
- tcp报文格式_腾讯面试中的TCP/IP协议简述+经典面试题
面试题有福利 TCP/IP协议简述+ TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器, ...
- TCP报文格式及三次握手详解
一.TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 在Wireshark中查看 图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 ...
- UDP/TCP报文格式
1.UDP 报文格式 UDP 报文中每个字段的含义如下: 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口.接收端的应用程序利用这个字段的值作为发 ...
- WireShark ICMP报文和TCP报文格式分析
目录 添加链接描述安装及基本使用 ICMP报文格式分析 源IP-->目的IP 目的IP-->源IP TCP报文格式分析 源IP-->目的IP 目的IP-->源IP 其他参考资料 ...
最新文章
- Nanopore测序
- 团队任务4-每日例会(2018-12-6)
- 文件操作(stat)
- 美团开源 Logan Web:前端日志在 Web 端的实现
- python部署工具fabric
- 诗歌,一路走来...
- 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题
- Deployment vs ReplicationController in Kubernetes
- [导入]玩 VSX 第一步,创建VsPkg
- Mysql数据库安装和配置
- 拓端tecdat|R语言实现k-means聚类优化的分层抽样(Stratified Sampling)分析各市镇的人口
- 云原生时代企业级应用架构设计的思考
- Java的企业级开发项目--OA办公系统
- 【WLM200Think无线鼠标拆解】鼠标中键有什么用?如何用鼠标中键提高效率? 鼠标中键不灵敏如何修理?
- 服务器带宽打开网页很慢,移动宽带打开网页慢?两招治本移动宽带打开网页速度慢的解决方法...
- 常见的肾囊肿症状有哪些?
- 快慢指针(java)
- sqlzoo-day7
- linux的内存占用分析,Linux 内存占用分析
- 关于SAP 启用新公司时 选用的会计准则