标签:tcp
哈喽!大家好,今天我们来共同认识一下什么是三次握手和四次挥手,来了解一下TCP客户端和服务器之间是如何进行通信的,又如何释放连接的呢?
其实,实际上三次握手就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包;而四次挥手则是两者之间在数据传输后关闭连接的四次过程,下面就分别来介绍客户端和服务器之间是如何进行三次握手和四次挥手。
一、TCP三次握手
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的
序列号和确认号并交换 TCP 窗口大小信息。在socket编程中,客户端执行connect()时,将触发三次握手。
第一次握手:
建立连接时,客户端A发送一个TCP的SYN标志位置1的包指明客户打算连接的服务器B的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里,并且客户端A进入SYN-SENT状态,等待服务器B的确认。
就比如A要告诉B两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
第二次握手:
服务器B发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1同时,将确认序号(Acknowledgement Number)设置为客户A的I S N加1以.即x+1,此时服务器B进入SYN-RCVD状态。
此时就像B要告诉A两件事:我已经收到你的请求了,你可以传输数据了;你可以用哪个序列号作为数据段来回应我。
第三次握手:
客户端A再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器B发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段的ISN+1。
这时A就会给B回复:我已经收到回复了,现在我们可以正常传输数据了。
这样3次握手就完成了,客户端A和服务器B就能传输数据了。
具体如图1所示。
图1—TCP三次握手图
二、TCP四次挥手
TCP连接的释放需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
第一次挥手:
TCP客户端发送一个FIN,用来关闭客户端A到服务器B的数据传送。此时客户端A进入到FIN-WAIT1状态。
第二次挥手:
服务器B收到这个FIN,随后就会给客户端A发回一个ACK,确认序号为收到的确认号加1。此时服务器B进入到CLOSE-WAIT状态,而客户端A进入到FIN-WAIT2状态。
第三次挥手:
服务器关闭与客户端的连接,发送一个FIN给客户端。此时服务器B进入到LAST-ACK状态。
第四次挥手:
客户端发回ACK报文确认,并将确认序号设置为收到确认序号加1。而此时客户端A进入到TIME-WAIT状态,等待对方关闭连接。
图2—TCP四次挥手图
经过以上步骤,TCP客户端和服务器之间就建立起了连接,在数据传输后,又经过四个过程释放了两者的连接,完整地完成了数据从开始传输到传输结束的整个步骤。
标签:tcp
原文地址:http://jieruma.blog.51cto.com/13158701/1962045