三次握手
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。在socker编程中,客户端执行connect()时,将触发三次握手。第一次握手(SYN=1,seq=x):
客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号x,保存在包头的序列号(Sequence Number)字段里。发送完毕后,客户端进入SYN_SEND状态。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):
服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1。服务器端选择自己的ISN序列号,放到Seq域里,同时将确认序号(Acknowledgement Number)设置为客户端的ISN加1,即x+1。发送完毕后,服务器端进入SYN_RCVD状态。
第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在数据端放写ISN的+1发送完毕后,客户端进入ESTABLISHED状态,当服务器端接收到这个包时,也进入ESTABLISHED状态,TCP握手结束。
(1)第一次握手:客户端发送SYN包(SYN=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
(2)第二次握手:服务器收到SYN包,必须确认客户的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
(3)第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
四次挥手
由于TCP连接是全双工的,连接的拆除需要发送四个包,因此称为“四次挥手”。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。(1)第一次挥手:客户端发送一个FIN,用来关闭客户到服务器的数据传输。
(2)第二次挥手:服务器收到这个FIN,他发回一个ACK,确认序号为收到的序号加1。
(3)第三次挥手:服务器关闭与客户端的连接,发送一个FIN给客户端。
(4)第四次挥手:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。