参考链接
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc https://blog.csdn.net/sanwe3333/article/details/110110006
名词注释
序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下: URG:紧急指针(urgent pointer)有效。 ACK:确认序号有效。 PSH:接收方应该尽快将这个报文交给应用层。 RST:重置连接。 SYN:发起一个新连接。 FIN:释放一个连接。
一、三次握手
1、客户端和服务端双方都属于Closed阶段,服务端被动打开以后,进入Listen阶段。 2、客户端发送TCP报文,标志位为为SYN,请求建立新的连接,序号为Seq=x。随后客户端进入SYN-SENT阶段。 3、服务端收到消息后,结束Listen阶段,返回一段TCP报文。标志位为SYN和ACK,表示确定报文Seq需要有效,并统一创建新的连接;序号为Seq=y;确认号为Ack=x+1。随后服务端进入SYN-RCVD阶段。 4、客户端接收到消息后,明确了消息连接是正常的,结束SYN-SENT阶段,并返回一段TCP报文:标志位ACK表示收到了信号;序号Seq=x+1表示收到了服务端的确认信号,并将其作为自己的序号值;确认号为Ack=y+1,表示收到服务端序号Seq,并将其值加1作为自己的确认号Ack的值。 5、随后双方进入ESTABLISHED阶段。
二、四次挥手
1、客户端发送TCP报文,标记位为FIN,表示请求释放连接;序号为Seq=U;随后客户端进入FIN-WAIT-1阶段。 2、服务器收到信息,也结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段报文。标记位为Ack,序号为Seq=V,确认号为Ack=U+1,表示将客户端报文的序号Seq加1作为本段报文确认号Ack的值。随后服务端开始准备释放连接,而客户端收到信息后,也会结束FIN-WAIT-1阶段,进入FIN-WAIT-2阶段。 3、服务端再次发送一段报文,标记位为FIN、ACK,表示已经准备好释放连接;序号Seq=W;确认号Ack=U+1。 随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段。 4、客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,结束FIN-WAIT-2阶段,进入TIME-WAIT阶段,并向服务器端发送一段报文。标记位为Ack,表示收到了释放信号;需要为Seq=U+1,表示将服务端报文的确认号加1作为本段报文序号;确认号为Ack=W+1,表示将服务端报文序号Seq值作为本段报文确认号的值。 5、随后客户端开始在TIME-WAIT阶段等待2MSL(MSL为最大报文段生存时间,LWIP为1分钟,windows为2分钟),然后才进入CLOSED,删除TCP控制块。在2MSL等待时间内迟到的报文段将被抛弃 6、服务器端收到从客户端发出的TCP报文之后结束LAST-ACK阶段,进入CLOSED阶段。由此正式确认关闭服务器端到客户端方向上的连接。
|