TCP:SYNACKFINRSTPSHURG三向握手简析Three-wayHandshakeUnderstandingTCPConnectionwithExamples通过三向握手建立虚连接(B)-->[SYN]-->(A)假设服务器A与客户端B通信,当A要与B通信时,B首先向A发送一个SYN(Synchronize)标记的数据包,告诉A请求建立连接。注意:SYN数据包只是SYN标志设置为1的TCP数据包(请参阅TCP标头资源)。需要注意的是,只有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连接完成。注意:ACK包是只将ACK标志设置为1的TCP包。需要注意的是,在三次握手完成并建立连接后,TCP连接的每个包都会设置ACK位。这就是连接跟踪非常重要的原因。如果没有连接跟踪,防火墙将无法确定收到的ACK数据包是否属于已建立的连接。当通用的数据包过滤器(Ipchains)收到ACK数据包时,它会通过它(这绝对不是一个好主意)。当状态防火墙收到这种数据包时,它会首先在连接表中查找它是否属于哪个已建立的连接,否则丢弃该数据包。举例理解TCP序列号在TCP层,有一个FLAGS字段,这个字段有如下标识:SYN、FIN、ACK、PSH、RST、URG。其中,前五个字段对我们日常分析很有用。它们的含义分别是:URG:Urgetpointerisvalid(紧急指针字段值有效)SYN:表示连接建立FIN:表示连接关闭ACK:表示响应PSH:表示有DATA数据传输RST:表示连接已重置。理解PSHACKTCPFlags其中,ACK可能与SYN、FIN等同时使用,比如SYN和ACK可能同时为1,表示连接建立后的响应。如果只有一个SYN,表示只建立connect。TCP的几次握手就是通过这样的ACK来表示的。但是SYN和FIN不会同时为1,因为前者表示建立连接,而后者表示断开连接。RST一般出现在FIN之后为1,表示连接被重置。一般当出现FIN包或RST包时,我们认为客户端与服务器断开连接;当一个SYN和SYN+ACK包出现时,我们认为客户端已经和服务器建立了连接。当PSH为1时,一般只出现在DATA内容不为0的数据包中,也就是说,如果PSH为1,则表示传输的是真正的TCP数据包内容。Flags值说明:FIN:“finished”的缩写。表示发送方和发送的数据。通常用在发送方发送数据后的最后一个数据包中。SYN:“同步”的缩写。表示三次握手建立连接的第一步。在连接建立时发送方发送的第一个数据包中标志值被设置为SYN。RST:“重置”的缩写。重置连接标志,用于重置由于主机崩溃或其他原因而失败的连接。或者当发送包被发送到一个意想不到的目的主机时,接收端发送一个重置包来重置连接标志。PSH:“推”的简写。通知接收端处理接收到的消息,而不是将消息缓存在缓冲区中。ACK:“确认”的缩写。表示数据包已成功接收。URG:“紧急”的缩写。通知接收端先处理收到的紧急数据包,然后再处理其他数据包。有关详细信息,请参阅RFC6093。ECE:“ECN-Echo”的缩写。ECN代表显式拥塞通知。表明TCP对等体具有ECN能力。有关详细信息,请参阅RFC3168。CWR:“减少拥塞窗口”的缩写。当发送方收到带有ECE标志的数据包时,它会使用CWR标志。有关详细信息,请参阅RFC3168。NS:“noncesum”的简写。此标签用于防止发件人发送的恶意隐藏消息的突发。有关详细信息,请参阅RFC3540。了解TCP标志每个字段的说明:源端口:长度为16位(2字节)。源端口。目的端口:长度为16位(2个字节)。目的端口。SequenceNumber:长度为32位(4字节)。指定分配给当前数据片中数据的第一个字节的序列号。TCP传输流中的每个字节都是一个序列号。如果TCP报文中的flags标志为SYN,则序号代表初始化序号(ISN),此时第一个数据应该从序号ISN+1开始。确认号:长度为32位(4个字节)。指示TCP发送方期望接受的下一个数据段的序号。当TCP段中的Flags标志为ACK时,该序号生效。序号分片方向与流向相同,确认序号分片方向与流向相反。通过示例了解TCP套接字在LinuxNetstat中探索TCP连接Time_Wait
