文章目录
- TCP标志位
- scapy修改标志位
- 设置标志位
- 清除标志位
- 示例
TCP标志位
TCP报文段结构如图所示
下面介绍一些重要的标志位:
-
URG (Urgent):
紧急指针(Urgent Pointer)有效。当URG标志位设置为1时,表示TCP报文段中有紧急数据需要处理。接收端会优先处理带有URG标志的报文段,并根据紧急指针的值跳过其他数据,直接读取紧急数据。
-
ACK (Acknowledgment):
确认号(Acknowledgment Number)有效。当ACK标志位设置为1时,表示TCP报文段是一个确认报文,确认号字段包含了一个期待接收的字节的序号。
-
PSH (Push):
提示接收端应用程序应该立即从TCP接收缓冲区中读走这段数据,而不是等待缓冲区满后再进行读取。这通常用于实时数据传输,如音频或视频流。
-
RST (Reset):
重置连接。当RST标志位设置为1时,TCP连接将被立即终止。RST报文通常用于在出现严重错误时关闭连接,例如连接超时、无效的连接请求等。
-
SYN (Synchronize):
同步序号。在建立TCP连接时,客户端会发送一个带有SYN标志的报文段(SYN报文),请求与服务器建立连接。服务器收到SYN报文后,会回复一个带有SYN和ACK标志的报文段(SYN-ACK报文),表示同意建立连接。最后,客户端再发送一个带有ACK标志的报文段,完成连接的建立。
-
FIN (Finish):
结束连接。当FIN标志位设置为1时,表示发送端已经完成了数据的发送,希望关闭连接。接收端在收到FIN报文后,会回复一个带有ACK标志的报文,表示同意关闭连接。当双方都完成了数据发送并收到了对方的确认后,TCP连接就会关闭。
-
ECE (Explicit Congestion Notification Echo):
显式拥塞通知回声。这是一个可选的标志位,用于TCP的显式拥塞通知(ECN)机制。当发送端收到带有ECE标志的报文时,它知道之前发送的带有ECN-Echo(CE)标志的报文已经被成功接收并处理。
-
CWR (Congestion Window Reduced):
拥塞窗口减少。这也是一个可选的标志位,用于TCP的ECN机制。当接收端检测到网络拥塞时,它会向发送端发送一个带有CE标志的报文。发送端在收到CE报文后,会适当地减少其发送窗口的大小,并在后续的报文中设置CWR标志,通知接收端已经减少了发送窗口。
这些标志位共同协作,确保TCP连接能够可靠地传输数据,并在必要时进行错误处理和连接管理。
scapy修改标志位
在对网络流量包进行分析时,可能会涉及到TCP包标志位的修改,下面给出标志位的修改方法。
设置标志位
单个函数设置单个标志位
def fin_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x01
return packet
def syn_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x02
return packet
def rst_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x04
return packet
def psh_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x08
return packet
def ack_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x10
return packet
def urg_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x20
return packet
def ece_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x40
return packet
def cwr_1(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags |= 0x80
return packet
清除标志位
单个函数清除单个标志位
def fin_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x01
return packet
def syn_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x02
return packet
def rst_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x04
return packet
def psh_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x08
return packet
def ack_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x10
return packet
def urg_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x20
return packet
def ece_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x40
return packet
def cwr_0(packet: packet.Packet) -> packet.Packet:
packet[TCP].flags &= ~0x80
return packet
示例
把所有TCP/IP包的URG标志置为1: