(一)前言
       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相关推荐

  1. tcp报文格式_34.TCP取样器

    阅读文本大概需要3分钟. 1.TCP取样器的作用 TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据. 2.TCP取样器详解 TCPClient classname:TCP报 ...

  2. 由 TCP 报文格式谈 TCP — 源端口号、目的端口号、报文段序号(一)

    博主曾经学 Linux 的时候,觉得知识点很多很难很困惑,遂问一前辈,怎么才能学通学精达到融会贯通,前辈意味深长地丢给博主三个字:写博客.博主于是屁颠屁颠儿地跑过来写博客了,本人大三网络工程专业,最近 ...

  3. TCP 的那些事 | TCP报文格式解析

    TCP(Transmission Control Protocol 传输控制协议)提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之 ...

  4. (一)深入浅出TCPIP之理解TCP报文格式和交互流程

    目录 1.引入TCP: 1.1 TCP用户代码 2. TCP数据报文格式 3 TCP栈及socket的初始化

  5. 网络:传输层 TCP报文格式解析

    一.TCP报文格式 1.为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图: 图2 TCP报文格式 16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数 ...

  6. tcp报文格式_腾讯面试中的TCP/IP协议简述+经典面试题

    面试题有福利 TCP/IP协议简述+ TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器, ...

  7. TCP报文格式及三次握手详解

    一.TCP报文格式 TCP 报文是 TCP 层传输的数据单元,也称为报文段.TCP 报文中每个字段如图所示. 在Wireshark中查看 图中 TCP 报文中每个字段的含义如下: 源端口和目的端口字段 ...

  8. UDP/TCP报文格式

    1.UDP 报文格式 UDP 报文中每个字段的含义如下: 源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口.接收端的应用程序利用这个字段的值作为发 ...

  9. WireShark ICMP报文和TCP报文格式分析

    目录 添加链接描述安装及基本使用 ICMP报文格式分析 源IP-->目的IP 目的IP-->源IP TCP报文格式分析 源IP-->目的IP 目的IP-->源IP 其他参考资料 ...

最新文章

  1. Nanopore测序
  2. 团队任务4-每日例会(2018-12-6)
  3. 文件操作(stat)
  4. 美团开源 Logan Web:前端日志在 Web 端的实现
  5. python部署工具fabric
  6. 诗歌,一路走来...
  7. 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题
  8. Deployment vs ReplicationController in Kubernetes
  9. [导入]玩 VSX 第一步,创建VsPkg
  10. Mysql数据库安装和配置
  11. 拓端tecdat|R语言实现k-means聚类优化的分层抽样(Stratified Sampling)分析各市镇的人口
  12. 云原生时代企业级应用架构设计的思考
  13. Java的企业级开发项目--OA办公系统
  14. 【WLM200Think无线鼠标拆解】鼠标中键有什么用?如何用鼠标中键提高效率? 鼠标中键不灵敏如何修理?
  15. 服务器带宽打开网页很慢,移动宽带打开网页慢?两招治本移动宽带打开网页速度慢的解决方法...
  16. 常见的肾囊肿症状有哪些?
  17. 快慢指针(java)
  18. sqlzoo-day7
  19. linux的内存占用分析,Linux 内存占用分析
  20. 关于SAP 启用新公司时 选用的会计准则

热门文章

  1. 网站设计和平面设计区别_平面网站设计终极指南
  2. 使用前端QrCode.js实现根据输入内容生成二维码,并提供二维码下载功能(已使用在交付项目中)
  3. 好和弦-3-伴奏入门
  4. 手机地图哪个好?从老虎地图说开去(转帖)
  5. [CocoaPods]使用CocoaPods进行测试
  6. nginx 常见状态码源码分析
  7. 学画画要从什么开始学?零基础怎么学好画画?
  8. SpringCloud(10)—— 国寿i动项目经验之(解决前后端跨域请求技术)
  9. 八年级计算机考试中考成绩查询,中考成绩查询系统入口
  10. IBDP学生如何申请中国香港的大学?