一.三次握手与四次挥手
1.挥手时FIN和ACK 可能在同一包里吗?
可以。一般情况下,服务端收到客户端的FIN后,很有可能还要继续向客户端发送数据,因此一般只回复ACK,当数据传送完成后再发送FIN。但是有一种特殊情况,当服务端收到FIN后,它恰好也要关闭连接,则可以在一个包内发送FIN和ACK(从tcp包头格式可以看出是正确的,FIN和ACK不是在同一个bit位上的,可以同时发),此时对应tcp状态转移图来说,客户端从fin_wait1跳过fin_wait2直接到time_wait。还有一种特殊情况,因此,由于延时应答机制(tcp保证可靠传输的机制的一种),服务端有些情况下ACK在不会立刻发送,而会等待一段时间,且在这段时间内FIN包刚好准备就绪,系统就会在发送ACK包的同时捎带的发送FIN包,此时的4次挥手也就变成3次挥手了。