TCP:SYN ACK FIN RST PSH URG简析
三次握手Three-way Handshake
Understanding TCP Connection with Examples
一个虚构连贯的建设是通过三次握手来实现的
- (B) –> [SYN] –> (A)
如果服务器A和客户机B通信. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,通知A申请建设连贯.
留神: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 意识到这点很重要,只有当A受到B发来的SYN包,才可建设连贯,除此之外别无他法。因而,如果你的防火墙抛弃所有的发往外网接口的SYN包,那么你将不 能让内部任何主机被动建设连贯。
- (B) <– [SYN/ACK] <–(A)
接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,示意对第一个SYN包的确认,并持续握手操作.
留神: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
- (B) –> [ACK] –> (A)
B收到SYN/ACK 包,B发一个确认包(ACK),告诉A连贯已建设。至此,三次握手实现,一个TCP连贯实现
Note: ACK包就是仅ACK 标记设为1的TCP包. 须要留神的是当三此握手实现、连贯建设当前,TCP连贯的每个包都会设置ACK位
这就是为何连贯跟踪很重要的起因了. 没有连贯跟踪,防火墙将无奈判断收到的ACK包是否属于一个曾经建设的连贯.个别的包过滤(Ipchains)收到ACK包时,会让它通过(这相对不是个 好主见). 而当状态型防火墙收到此种包时,它会先在连贯表中查找是否属于哪个已建连贯,否则抛弃该包
Understanding TCP Sequence Number with Examples
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG.
其中,对于咱们日常的剖析有用的就是后面的五个字段。
它们的含意是:
URG:Urget pointer is valid (紧急指针字段值无效)
SYN: 示意建设连贯
FIN: 示意敞开连贯
ACK: 示意响应
PSH: 示意有 DATA数据传输
RST: 示意连贯重置。
Understanding PSH ACK TCP Flags
其中,ACK是可能与SYN,FIN等同时应用的,比方SYN和ACK可能同时为1,它示意的就是建设连贯之后的响应,如果只是单个的一个SYN,它示意的只是建设连贯。TCP的几次握手就是通过这样的ACK体现进去的。但SYN与FIN是不会同时为1的,因为前者示意的是建设连贯,而后者示意的是断开连接。RST个别是在FIN之后才会呈现为1的状况,示意的是连贯重置。个别地,当呈现FIN包或RST包时,咱们便认为客户端与服务器端断开了连贯;而当呈现SYN和SYN+ACK包时,咱们认为客户端与服务器建设了一个连贯。PSH为1的状况,个别只呈现在 DATA内容不为0的包中,也就是说PSH为1示意的是有真正的TCP数据包内容被传递。
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。
Understanding TCP Flags
各个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时失效。序列号分片的方向和流的方向同方向,而确认序列号分片方向和流方向反方向.
Understanding TCP Socket With Examples
Exploring TCP Connection Time_Wait in Linux Netstat