首先理解部分字符意思: URG:紧急指针(urgent pointer)有效。 ACK:确认序号有效。(为了与确认号ack区分开,我们用大写表示) PSH:接收方应该尽快将这个报文交给应用层。 RST:重置连接。 SYN:发起一个新连接。 FIN:释放一个连接。
seq:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 ack:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。
三次握手
第一次:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认
第二次:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手
四次挥手
第一次:当客户端client的应用程序通知TCP数据已经发送完毕时,TCP向服务端server发送一个带有FIN附加标记的报文段(FIN表示英文finish)
第二次:服务端server收到这个FIN报文段之后,并不立即用FIN报文段回复客户端client,而是先向客户端client发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三次:服务端server的应用程序告诉TCP:我要彻底的关闭连接,TCP向客户端client送一个FIN报文段。
第四次:客户端client收到这个FIN报文段后,向服务端server发送一个ACK表示连接彻底释放。