TCP的三次握手
TCP在建立连接时会进行三次握手,其过程如下:
1.首先client会向server发送SYN=1,ACK=0,请求建立链接,同时自身进入SYN_SENT状态.
2.当server收到client的请求后,如果client请求的端口为开启状态则,server会向client发送SYN=1,ACK=1,给client以连接确认,及向client发出建立连接的请求,同时自身进入SYN_RECV状态.
如果client请求端口没有开启,则会置RST,终止连接请求.
3.当client,收到server的ACK时,会进入ESTALISH状态,此时客户端与服务器连接建立成功!然后client会向server发送ACK=1,以回应对服务器向客户端建立连接请求的确认.
当server收到client的ACK之后,也进入ESTABLISH状态,三次握手成功!
为什么TCP握手需要三次?
那么有人可能会问了,为什么TCP是三次握手,而不是两次?
我个人觉得有两方面原因:
1.TCP提供可靠性、全双工通信,因此要确保双方都要能接受到对方应答.如果只是两次握手,只能说明client的请求server可以接受到,但server的请求client能否接受到,无法提供可靠性!
2.如果两次握手,server建立了连接,占用了server资源,但此时client是否已经建立连接是无法保证的,因此两次握手对server来说太占用资源了.
TCP四次挥手
TCP在释放连接时,会进行4次挥手:
1.首先client向server发送FIN=1的请求(或相反)
2.server收到之后,会向client发送ACK=1,此时client与server单向断开链接(server与client还没有)
3.server会向client发送FIN=1的请求.
4.client会想server进行ACK=1的确认,此时双方都以断开连接,但主动断开的一方会进入TIME_WAIT状态.
为什么要进行四次挥手?
四次挥手理解起来就更为简单,因为TCP提供全双工通信.
一方发出断开连接请求,另一方要确认.这只是单向的断开
另一方发出断开连接请求,这一方进行确认.双方彻底断开.
因此,在断开链接时需要进行四次挥手.
为什么主动断开链接一方会进入TIME_WAIT状态?
因为断开链接之后,还有可能有部分数据(可能是游离报文)没有到达,因此需要主动断开一方进行等待,时间大概是2、3分钟左右.