一、三次握手
1、客户端处于closed状态,服务端处于listen状态;
第一次握手:客户端给服务端发送一个SYN报文,并指明客户端的初始化序列号ISN(c)。此时客户端处于SYN_Send状态;
第二次握手:服务端收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s),同时会把客户端的ISN(c)+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务端处于SYN_Revd状态;
第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,当然也是一样把服务端的ISN(s)+1作为ACK的值,表示已经收到了服务端的SYN报文,此时客户端处于establised状态。
服务端收到ACK报文之后,也处于establised状态,此时,双方已建立起了连接。
三次握手的作用:
1、确认双方的接收能力、发送能力是否正常;
2、指定自己的初始化序列号,为后面的可靠传送做准备;
3、如果是https协议,三次握手的这个过程还会进行数字证书的验证以及加密密钥的生成等;
4、为了防止攻击,ISN是动态生成的。
半连接队列:
服务端第一次收到客户端的SYN之后,就会处于SYN_REVD状态,此时双方还没有完全建立其连接,服务端会把此种状态下的请求连接放在一个队列里,这种就是半连接队列
全连接队列:
三次握手已经完成,这种状态下的请求连接放在全连接队列里;
第三次握手的时候是可以携带数据的
二、四次挥手
刚开始的时候,客户端和服务端都处于establised状态,假如是客户端先发起关闭请求,则:
第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号,此时客户端处于FIN_WAIT1状态;
第二次挥手:服务端收到FIN之后,会发送一个ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到了客户端的报文了,此时服务端处于CLOSE_WAIT状态;
第三次挥手:如果服务端也想断开连接了,就和客户端一样,发给客户端一个FIN报文,且指定一个序列号,此时服务端处于LAST_ACK状态;
第四次挥手:客户端收到服务端发过来的FIN报文之后,一样发送一个ACK确认报文作为应答,且把服务端的序列号值+1作为自己的ACK报文的序列号值,此时客户端处于TIME_WAIT状态,需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态;
服务端收到客户端发过来的ACK确认包之后就处于关闭连接了,处于CLOSED状态。
第四次挥手时,客户端会有一个TIME_WAIT状态,要确保服务端已经收到了客户端的ACK报文,如果没有收到,服务端会重新发送FIN报文给客户端,客户端再次收到FIN报文之后,就知道之前的ACK报文丢失了,然后再次发送ACK报文给服务端
网友评论