三次握手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...