Tcp/Ip

TCP的连接和建立都是采用客户服务器(C/S)方式。主动发起连接建立的应用进程叫做客户端(Client)。被动等待连接建立的应用进程叫做服务器(Server)。

建立TCP连接需要三次握手,断开连接需要四次挥手,如图:
Tcp/Ip

(1)三次握手:
在TCP/IP中,采用三次握手建立一个连接,连接过程就像打电话的过程,如图:
Tcp/Ip
第一次握手:Client(主机A)向Server(主机B)发送一个连接请求,在这个包中,标志为SYN=1,发送序号SEQ=x,上图中x=200,Client进入SYN_SEND状态,等待Server确认。

第二次握手:Server接受数据包后由标志位SUnder=1知道 Client 请求建立连接,Server将标志位SYN和ACK都置为1,确认序号ACK=x+1=201,随机产生一个发送序号SEQ=y,上图中y=500,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

第三次握手:Client收到确认后,检查确认序号ACK是否为x+1=201,标志位ACK是否为1,如果正确,则将标志位ACK置为1,确认序号ACK置为1,确认序号ACK=y+1=501,标志位ACK是否为1,如果正确则连接建立成功,Client和Server都进入ESTABLISHED状态。

完成三次握手建立连接,客户端与服务器就可以开始传送数据。

(2)四次挥手:
四次挥手(Four-Way Wavehand)即终止TCP连接,就是断开一个TCP连接时,需要客户机和服务端总共发送4个包以确认连接的断开,如图:
Tcp/Ip

第一次挥手:当主机A要断开TCP连接时,发送一个包给主机B,其中标志位FIN=1,ACK=1,发送序号SEQ=x,确认序号ACK=y,上图中x=200,y=500。Client进入FIN_WAIT_1状态;

第二次挥手:主机B知道A要断开的请求后,发送一个确认包,其中标志位ACK=1,发送序号SEQ=y,确认序号ACk=x+1=201,Server(主机B)进入CLOSE_WAIT状态;

第三次挥手:主机B也断开TCP连接,此时发送一个包,其中标志位FIN=1,发送序号SEQ=y+1=501,Server(主机B)进入LAST_ACK状态;

第四次挥手:主机A收到B的请求后,Client进入TIME_WAIT状态,接着发送一个确认包,标志位ACK=1,发送序号SEQ=x+1=201,确认序号ACK=y+2=502,Server进入CLOSE状态。

TCP是全双关的,因此每个方向都必须单独进行关闭,这一原则是当一方完成发送数据任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍能发送数据,知道这一方也发送了FIN包。