1、三次握手
第一次握手,建立连接时候,客户端发送syn包(syn = j)到服务器,并进入syn_send状态,等待服务器确认;syn:同步序列号。
第二次握手:服务器收到syn包,必须确认客户的syn(ack = j+1),同时自己也发送一个syn包(syn = k),就是syn+ack包,此时服务器进入syn_recv状态。
第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack = k+1),磁暴发送完毕,客户端和服务器进入established状态,完成三次握手。
完成三次握手,客户端和服务器开始传送数据。
2、四次挥手
所谓四次挥手就是终止TCP的链接,就是指断开一个TCP连接时候,需要客户端和服务端总共发送4个包已确认链接的断开。在socket编程中,这一过程有客户端或者服务器端任一方执行close来触发。
由于TCP链接时候是全双工的,因此每个方向都必须要单独进行关闭,这一原则是当乙方完成数据发送任务后,发送一个fin来种植这一方向的链接,收到一个fin只是意味着这一方向上没有数据流动了,就不会再收到数据了,但是在这个TCP连接上任然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的乙方将执行主动关闭,而另一方则执行被动关闭,上图描述的就是这样!
(1)第一次挥手:client发送一个fin来关闭client到server的数据传送,client进入fin_wait_1状态。
(2)第二次挥手:server收到fin后,发送一个ack给client,确认序号为收到序号+1(与syn相同,一个fin占用一个序号),server进入close_wait状态。
(3)第三次挥手:server发送一个fin,用来关闭server到client的数据传送,server进入last_ack状态。
(4)地四次挥手:client收到fin后,client进入time_wait状态,接着发送一个ack给server,确认序号为收到序号+1,server进入close状态,完成四次挥手。、
上面是一方主动关闭,另一方被动关闭的情况,实际中还会出现同时发起主动关闭的情况,具体流程如下图:
流程和状态在上图中已经很名显了。
注意:
1、三次握手是什么或者流程?四次挥手那?
2、为什么建立连接是三次握手,而关闭连接确实四次挥手那?
这是因为服务端在listen状态下,收到建立连接请求的syn报文后,吧ack和syn放在一个报文里发送给客户端。儿关闭连接时候,当受到对方的fin保温时候,仅仅表示对方不在发送数据了但是还能接受数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送fin报文给对方来表示同意现在关闭链接,因此,己方ack和fin一般都会分开发送。