基础知识
首先我们要知道TCP协议的几个标记位,这对我们这几个过程都特别重要
SYN:第一次握手首先由发送方发送一个SYN报文段给接收方,请求建立连接。
ACK:用于确认数据的传输,当成功收到数据后,接收方发送一个带有ACK标记的报文段回复发送方,确认收到了数据。
FIN:用于关闭连接。当发送方发送完数据后,就会发送一个带有FIN标记的报文段,请求关闭连接。接收方在收到FIN报文段后,发送一个带有ACK标记的报文段进行确认,确认之后则会结束。
三次握手
三次握手是用来建立连接的,具体过程如图所示,我们根据图片来加深理解
第一次握手:有客户端向服务器发送请求,发送TCP报文,SYN代表请求的新连接,seq代表序号,随后进入服务端。就像男人喜欢女生,现在在给女生寄情书,然后焦急的等待
第二次握手:收到报文之后,结束LISTEN阶段。并返回一段TCP报文。标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,并同意创建新连接”;序号为Seq=y,确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值;随后服务器端进入SYN-RCVD阶段,这就好比女孩收到男孩的情书后,心花怒放,原来我们是互相喜欢,于是给男孩写了一封回信:我收到你的情书了,也确认了你的心意,我也喜欢你。写完信之后,女孩也焦急地等待,因为不知道回信能否能顺利传达给男孩。
第三次握手:客户端接收到来自服务器端的确认收到数据的TCP报文之后,知道了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段。并返回最后一段TCP报文。其中:标志位为ACK,确认已经收到消息,序号为Seq=x+1,表示收到服务器端的确认号ACK,并将其值作为自己的序号值;确认号为ACK=Y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;随后客户端进入ESTABLISHED阶段。这就好比男孩收到回信之后很开心,因为发出的情书女孩收到了,并且从回信中确认了了女孩喜欢自己,然后男孩又写了一封信告诉女孩:你的心意和信我都收到了,谢谢你,还有我爱你!
三次握手因此就完成了
四次挥手
(1)首先客户端想要释放连接,向服务器端发送一段TCP报文,其中:标记位为FIN,表示“请求释放连接“;序号为Seq=U;随后客户端收到消息后,开始停止在客户端到服务器端方向上发送数据,但是客户端仍然能接收从服务器端传输过来的数据。
(2)服务器端接收到从客户端发出的TCP报文之后,确认了客户端想要释放连接,随后服务器端知道后就返回一段TCP报文,其中:标记位为ACK,表示接收到请求;序号为Seq=V;确认号为Ack=U+1,表示是在收到客户端报文的基础上,将其序号Seq值加1作为器端开始准备释放服务器端到客户端方向上的连接。客户端收到从服务器端发出的TCP报文之后,确认本段报文确认号Ack的值;然后服务了服务器收到了客户端发出的释放连接请求2阶段,前"两次挥手"既让服务器端知道了客户端想要释放连接,也让客户端知道了服务器端了解了自己想要释放连接的请求。于是,就可以确认关闭连接了。
(3)服务器端自从发出ACK确认报文之后,再次向客户端发出一段TCP报文,其中:标记位为FIN,ACK,说明已经释放连接了;序号为Seq=W;确认号为Ack=U+1;将Seq加1作为本段报文确认号Ack的值。
(4)客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,又开始向服务器端发送一段报文,其中:标记位为ACK,表示“接收释放连接的信号”。序号为Seq=U+1;确认号Ack值作为本段报文序号的值。确认号为Ack=W+1;将其序号Seq值作为本段报文确认号的值。