TCP协议中FLAG的含义

本文详细介绍了TCP连接的三次握手和四次挥手过程,探讨了基于TCP标记的数据包匹配原理及其在网络防火墙中的应用。此外,还深入分析了RST攻击手段及防御措施。

TCP FLAG 标记基于标记的TCP包匹配经常被用于过滤试图打开新连接的TCP数据包。 TCP标记和他们的意义如下所列

F : FIN - 结束; 结束会话 

S : SYN - 同步; 表示开始会话请求 

R : RST - 复位;中断一个连接 

P : PUSH - 推送; 数据包立即发送 

A : ACK - 应答 

U : URG - 紧急 

E : ECE - 显式拥塞提醒回应 

W : CWR - 拥塞窗口减少

三次握手Three-way Handshake

一个虚拟连接的建立是通过三次握手来实现的

1. (B) --> [SYN] --> (A)

假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.

注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你

的防火墙丢弃所有的发往外网接口的SYN包,那么你将不 能让外部任何主机主动建立连接。

2. (B) <-- [SYN/ACK] <--(A)

接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.

注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.

3. (B) --> [ACK] --> (A)

B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成

Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位

这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是

个 好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包

四次握手Four-way Handshake

四次握手用来关闭已建立的TCP连接

1. (B) --> ACK/FIN --> (A)

2. (B) <-- ACK <-- (A)

3. (B) <-- ACK/FIN <-- (A)

4. (B) --> ACK --> (A)

注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上

ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的

连接复位Resetting a connection

四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部

分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记

请注意RST包是可以不要收到方确认的?

无效的TCP标记Invalid TCP Flags

到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.

最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.

由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻了。 

别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。"NULL"包就是没

有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。

到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。

RST攻击

A和服务器B之间建立了TCP连接,此时C伪造了一个TCP包发给B,使B异常的断开了与A之间的TCP连接,就是RST攻击了。实际上从上面RST标志位的功能已经可以看出这种攻击

如何达到效果了。

那么伪造什么样的TCP包可以达成目的呢?我们至顶向下的看。

假定C伪装成A发过去的包,这个包如果是RST包的话,毫无疑问,B将会丢弃与A的缓冲区上所有数据,强制关掉连接。

如果发过去的包是SYN包,那么,B会表示A已经发疯了(与OS的实现有关),正常连接时又来建新连接,B主动向A发个RST包,并在自己这端强制关掉连接。


这两种方式都能够达到复位攻击的效果。似乎挺恐怖,然而关键是,如何能伪造成A发给B的包呢?这里有两个关键因素,源端口和序列号。

一个TCP连接都是四元组,由源IP、源端口、目标IP、目标端口唯一确定一个连接。所以,如果C要伪造A发给B的包,要在上面提到的IP头和TCP头,把源IP、源端口、目标IP、目

标端口都填对。这里B作为服务器,IP和端口是公开的,A是我们要下手的目标,IP当然知道,但A的源端口就不清楚了,因为这可能是A随机生成的。当然,如果能够对常见的OS如

windows和linux找出生成source port规律的话,还是可以搞定的。

序列号问题是与滑动窗口对应的,伪造的TCP包里需要填序列号,如果序列号的值不在A之前向B发送时B的滑动窗口内,B是会主动丢弃的。所以我们要找到能落到当时的AB间滑动

窗口的序列号。这个可以暴力解决,因为一个sequence长度是32位,取值范围0-4294967296,如果窗口大小像上图中我抓到的windows下的65535的话,只需要相除,就知道

最多只需要发65537(4294967296/65535=65537)个包就能有一个序列号落到滑动窗口内。RST包是很小的,IP头+TCP头也才40字节,算算我们的带宽就知道这实在只需

要几秒钟就能搞定。

那么,序列号不是问题,源端口会麻烦点,如果各个操作系统不能完全随机的生成源端口,或者黑客们能通过其他方式获取到source port,RST攻击易如反掌,后果很严重。

RST攻击的防御

对付这种攻击也可以通过防火墙简单设置就可以了。建议使用防火墙将进来的包带RST位的包丢弃就可以了。

转载于:https://www.cnblogs.com/wen858636827/archive/2012/12/26/2834405.html

<think>好的,我现在需要回答用户关于TCP协议中8位标志位的具体含义及作用的问题。用户提到了之前提供的引用内容,其中涉及标志位的不同版本,比如有的保留6位,有的保留4位或3位,这可能让用户感到困惑。因此,我需要先理清TCP头部中标志位的标准定义和不同文献中的差异,然后详细解释每个标志位的含义和作用。 首先,TCP头部结构中的控制位(标志位)位于第13字节开始的6位,但根据不同的文献和实现,可能会有不同的解释。例如,用户提供的引用[2]提到三种不同的版本:保留6位、保留4位或3位,标志位的数量和名称有所不同。这可能是因为不同资料对TCP头部的保留位和扩展标志位的处理方式不同,尤其是在RFC标准更新后,新增了一些标志位,如CWR、ECE等,导致不同资料中的描述存在差异。 接下来,我需要确认最新的RFC标准中关于TCP标志位的定义。根据RFC 793,最初的TCP头部定义了6个标志位:URG、ACK、PSH、RST、SYN、FIN,占用6位,保留2位(共8位中的后6位)。但随着TCP扩展选项的引入,如ECN(显式拥塞通知)和SACK(选择性确认),新增了CWR和ECE标志位,占用了保留位中的部分,因此现在常见的标志位有8个,即保留位减少为4位或更少,而标志位增加到8个。 用户的问题是关于8位标志位的具体含义,因此需要结合最新的标准来解释。可能存在的标志位包括:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN,共8位,占用第14字节的前8位中的高2位和接下来的6位?或者需要更仔细地分析头部结构。 根据TCP头部结构,数据偏移(4位)+ 保留(4位,但后来被重新定义为包含CWR和ECE标志)+ 控制位(6位:URG, ACK, PSH, RST, SYN, FIN)。然而,RFC 3168引入了ECN,将原来的保留位中的两位用于ECE和 CWR,因此现在的情况是:数据偏移(4位),保留(4位中的前两位作为CWR和 ECE,剩下的2位保留),然后是控制位6位(URG, ACK, PSH, RST, SYN, FIN)。这样总共有8个标志位:CWR, ECE, URG, ACK, PSH, RST, SYN, FIN。因此,正确的标志位是8个,占据数据偏移后的一个字节中的高4位中的两位和后面的6位中的6位,总共有8位? 这里可能存在混淆,需要明确。根据RFC 793,控制位是6位,但在RFC 3168中,ECN使用了保留位中的两位,即原来的保留位(4位)中的前两位被重新定义为CWR和 ECE,因此现在控制位包括原来的6位加上这两个新的标志位,总共8个标志位:CWR(1位)、ECE(1位)、URG(1位)、ACK(1位)、PSH(1位)、RST(1位)、SYN(1位)、FIN(1位)。因此,现在的TCP头部中,标志位共有8个,占用一个字节(8位),其中前两位是CWR和 ECE,后面6位是原来的URG到FIN。这可能与用户提到的不同资料中的不同版本有关,比如有的资料可能没有包含CWR和 ECE,只保留原来的6位。 因此,回答时需要说明不同文献中的差异,并解释最新的标准中的8个标志位。同时,用户引用的文献[3]提到了FIN和ACK标志在连接关闭过程中的应用,这也需要在解释标志位时提到。 接下来,需要逐个解释每个标志位的含义和作用: 1. CWR(Congestion Window Reduced):拥塞窗口减少,用于ECN机制,通知对方拥塞窗口已减小。 2. ECE(ECN-Echo):显式拥塞通知回应,指示接收到了ECN拥塞通告。 3. URG(Urgent):紧急指针有效,指示报文中有紧急数据,需要优先处理。 4. ACK(Acknowledgment):确认号有效,表示确认号字段包含有效的确认信息。 5. PSH(Push):推送功能,要求接收方尽快将数据提交给应用层,而不是缓冲。 6. RST(Reset):重置连接,用于异常终止连接。 7. SYN(Synchronize):同步序列号,用于建立连接。 8. FIN(Finish):结束连接,用于正常终止连接。 需要详细说明每个标志位在TCP通信中的具体应用场景和触发条件,例如三次握手中的SYN和ACK,四次挥手中的FIN和ACK,以及RST在连接重置中的应用。同时,需要提到URG和PSH的实际使用情况较少,可能在某些特定场景下使用。 此外,用户提到的文献[2]中不同版本的标志位差异需要解释,说明不同资料可能因标准更新或实现差异而描述不同,但当前RFC标准中的标志位应为8个,包含CWR和 ECE。 最后,总结各个标志位的作用,并可能生成相关问题,如关于ECN机制、三次握手和四次挥手的具体过程,或标志位在抓包分析中的应用等。</think>### TCP协议8位标志位详解 --- #### 一、TCP头部标志位结构 根据RFC 793及后续扩展(如RFC 3168),TCP头部控制位共包含**8个标志位**,具体布局如下: ``` 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 数据偏移(4位)| 保留(含CWR/ECE) | URG | ACK | PSH | RST | SYN | FIN | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ``` - **标志位占用1字节(8位)**: - **CWR**(1位) - **ECE**(1位) - **URG**(1位) - **ACK**(1位) - **PSH**(1位) - **RST**(1位) - **SYN**(1位) - **FIN**(1位) > 注:早期RFC 793仅定义后6位(URG至FIN),前2位为保留位;RFC 3168引入ECN机制后,前2位被重新定义为CWR和ECE[^2]。 --- #### 二、各标志位的具体含义及作用 | 标志位 | 全称 | 作用 | 典型应用场景 | |--------|--------------------------|----------------------------------------------------------------------|---------------------------------| | **CWR** | Congestion Window Reduced | 发送方通知接收方已减少拥塞窗口(配合ECN机制) | 网络拥塞控制(如ECN生效时) | | **ECE** | ECN-Echo | 指示接收方检测到网络拥塞(ECN机制)或协商ECN支持 | SYN报文协商ECN,数据报文反馈拥塞| | **URG** | Urgent | 紧急指针字段有效,数据需优先处理 | 传输中断信号(如Telnet Ctrl+C) | | **ACK** | Acknowledgment | 确认号字段有效,表示已成功接收数据 | 所有非SYN报文的确认(如数据传输)| | **PSH** | Push | 要求接收方立即将数据提交给应用层,无需等待缓冲区填满 | 实时交互场景(如SSH命令执行) | | **RST** | Reset | 强制终止异常连接或拒绝非法请求 | 端口未监听、连接超时重置 | | **SYN** | Synchronize | 发起连接请求,同步序列号(ISN) | TCP三次握手第一步 | | **FIN** | Finish | 正常关闭连接,表示数据发送完毕 | TCP四次挥手 | --- #### 三、标志位的组合使用场景 1. **三次握手建立连接** - **SYN**:客户端发送SYN=1, ACK=0, Seq=ISN - **SYN-ACK**:服务端回复SYN=1, ACK=1, Seq=ISN, Ack=ISN+1 - **ACK**:客户端确认ACK=1, Seq=ISN+1, Ack=ISN+1 $$ \text{连接建立公式:SYN \rightarrow SYN+ACK \rightarrow ACK} $$[^3] 2. **四次挥手终止连接** - **FIN**:主动关闭方发送FIN=1, ACK=1 - **ACK**:被动方确认FIN - **FIN**:被动方发送FIN=1, ACK=1 - **ACK**:主动方最终确认 $$ \text{连接终止公式:FIN+ACK \rightarrow ACK \rightarrow FIN+ACK \rightarrow ACK} $$[^3] 3. **异常处理** - **RST+ACK**:收到非法报文(如未建立连接的ACK)时强制终止连接 - **RST**:直接拒绝连接请求(如端口关闭) --- #### 四、标志位的实现差异与注意事项 1. **文献差异解析** - **RFC 793原始定义**:仅包含后6位(URG至FIN),前2位为保留位[^2]; - **RFC 3168扩展**:前2位被定义为CWR和ECE,支持ECN拥塞控制; - **Wireshark抓包显示**:可能包含实验性标志位(如Nonce),需结合具体版本分析[^2]。 2. **实际应用要点** - **URG/PSH使用限制**:现代协议栈中URG常被忽略,PSH仅在特定场景生效(如HTTP响应结束); - **ECN协商机制**:SYN报文中ECE=1表示支持ECN,若双方支持则在后续通信中使用CWR/ECE标志[^1]; - **RST攻击防护**:随机化序列号可防止伪造RST报文攻击[^1]。 --- #### 五、抓包示例分析(Wireshark) 1. **建立连接** ```plaintext No. Time Source Destination Protocol Length Info 1 0.000 192.168.1.2 192.168.1.3 TCP 66 [SYN] Seq=0 Win=64240 2 0.001 192.168.1.3 192.168.1.2 TCP 66 [SYN, ACK] Seq=0 Ack=1 Win=65535 3 0.002 192.168.1.2 192.168.1.3 TCP 54 [ACK] Seq=1 Ack=1 Win=64240 ``` 2. **关闭连接** ```plaintext 4 5.000 192.168.1.2 192.168.1.3 TCP 54 [FIN, ACK] Seq=100 Ack=200 5 5.001 192.168.1.3 192.168.1.2 TCP 54 [ACK] Seq=200 Ack=101 6 5.002 192.168.1.3 192.168.1.2 TCP 54 [FIN, ACK] Seq=200 Ack=101 7 5.003 192.168.1.2 192.168.1.3 TCP 54 [ACK] Seq=101 Ack=201 ``` --- ### 表格总结:标志位与TCP状态机的关系 | 标志位组合 | 触发状态转换 | |------------------|-------------------------------| | SYN | CLOSED → SYN_SENT | | SYN+ACK | SYN_SENT → ESTABLISHED | | FIN+ACK | ESTABLISHED → FIN_WAIT_1 | | ACK | FIN_WAIT_1 → FIN_WAIT_2 | | FIN+ACK | FIN_WAIT_2 → TIME_WAIT | --- ### 相关问题 1. ECN机制如何通过CWR和ECE标志实现拥塞控制? 2. 为什么PSH标志在现代网络中较少被使用? 3. 如何通过Wireshark过滤包含RST标志的异常TCP报文? 4. TCP协议中SYN洪泛攻击的原理及防御方法是什么? [^1]: TCP协议介绍和作用。TCP/IP与OSI的区别主要有哪些呢?除了TCP/IP与OSI在分层模块上稍有区别,更重要的区别为:OSI参考模型注重“通信协议必要的功能是什么”,而TCP/IP则更强调“在计算机上实现协议应该开发哪种程序”。 : 其他文献和博客中关于TCP报文中Flag位看到了几种不同的版本。 [^3]: 第二次挥手:正常情况下,在收到了主动断开方发送的FIN断开请求报文后,被动断开方会发送一个ACK响应报文。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值