TCP的三次握手和四次挥手以及状态转移过程
1、TCP的三次握手即客户端与服务器端建立连接的过程
(三次握手一般是由客户端发起的建立连接请求,connect返回连接成功表示三次握手完成)
第一次握手:客户端发起建立连接请求,并发送SYN和一个***i
第二次握手:服务器确认与客户端建立连接,发送SYN和一个自己的***j,同时发送ACK以及确认值i+1
第三次握手:客户端向服务器发送ACK以及确认值j+1
2、TCP的四次挥手即客户端与服务器端断开连接的过程
(四次挥手可能由客户端执行主动断开也可能由服务器端主动断开)
第一次挥手:主动断开方要求关闭连接,并且发送FIN
第二次挥手:被动断开方确认关闭连接发送ACK和确认值i+2
第三次挥手:被动断开方紧接着发送FIN
第四次挥手:主动断开方发送ACK和确认值J+2表示确认
3. TCP状态转移过程
SYN_SENT:客户端向服务器端发送连接请求
ESTABLISHED :客户端收到服务器端的同步报文段和确认
FIN_WAIT_1:主动断开方发送结束报文段
FIN_WAIT_2:主动断开方收到被动断开方的确认报文段
TIME_WAIT:主动断开方收到结束报文段
SYN_RCVD: listen开始时就创建监听队列,若已完成三次握手的队列为空,则accept阻塞,一旦监听到连接请求,就将其放入内核等待队列中,并向客户端发送SYN确认,此时该连接处于该状态。
ESTABLISHED :服务器端接收到客户端发送的确认报文段,连接双方能够进行双向数据传输的状态
CLOSE_WAIT:主动断开方关闭连接,被动断开方发送确认报文段,进入等待关闭连接状态
LAST_ACK:被动断开方给主动断开方发送结束报文段关闭连接进入该状态,等待主动断开方的最后一次确认
4. TIME_WAIT状态存在的意义
(1)保证可靠的终止TCP连接
解释:若最后一条确认报文段丢失,被动断开方则会重发一条结束报文段,主动断开方则会在该状态下处理这条重发的结束报文段,重新向被动断开方发送一条确认报文段。
(2)保证迟来的数据能被识别并丢弃
解释:处于该状态下,不能使用这个被占用的端口建立一个新的连接,防止这个新的连接接收到之前的连接的报文段。
5.为什么是三次握手呢?
(1)数据延时
假如客户端向服务器端发起的连接请求报文段因为某些原因滞留,过了一段时间之后服务器端才接收到,但是这个报文段已经无效了并未丢失。服务器端就会向客户端发送一个确认的同步报文段。如果是两次握
握手,这样连接已经建立,服务器端就会一直等待客户端发送数据,但是客户端并未建立这次连接,这就造成了资源的浪费。
(1)SYN溢出攻击
6.四次挥手可不可以是三次挥手?
主动断开方与被动断开方同时要关闭连接的情况下,四次挥手也可以是三次挥手,就是当FIN_WAIT_1状态下的主动断开方收到被动断开方带有确认的结束报文段时转入TIME_WAIT状态,不必再经过FIN_WAIT_2状态。