目录
三次握手是用来建立TCP连接的,四次挥手是用来断开TCP连接的。
1.几个重要的标识符:
SYN:表示建立连接;
FIN:表示断开连接;
ACK:表示响应;
序列号Seq代表当前端成功发送到的位置;
确认号ack代表当前端成功连接收到的位置;
注意:刚开始建立连接时两个是随机的。
规定:计算Seq和ack的时候
SYN标志位和FIN标志位算一个位置。
2.三次握手
第一次握手:首先客户端向服务端发送请求连接报文,报文的SYN位=1,同时选择一个初始序列号Seq=x。SYN报文请求不能写携带数据,但需要消耗一个序列号。此时客户端就进入SYN-SENT(同步已发送)状态。
第二次握手:服务端收到请求报文后,如果同意连接,发出确认报文,这个报文中标记ACK=1,SYN=1,他还要有一个确认号ack=x+1,同时还有有一个自己的初始序列号Seq=y 。这个时候这个TCP服务器进程进入SYN-RCVD(同步收到)状态,这个报文也不能携带数据,但是同样要消耗一个序号。
第三次握手:客户端收到确认之后,还要向服务端给确定。确认报文的ACK=1,ack=y+1,自己的序列号seq=x+1。这个时候tcp连接建立,客户端进入ESTABLISHED(已建立连接)状态。TCP规定,ACK报文段可以携带数据,但是如果不携带数据的话则不消耗序号。
![](https://i-blog.csdnimg.cn/blog_migrate/ff502bd823a60e19144cfadf9f026153.png)
3.为什么是三次握手,不是两次,四次
如果是两次握手的话,第一次握手时A向B发送了一个SYN请求报文,因为网络延迟没有送到B。长时间收不到B的SYN/ACK回应的话,A会重新想B发送SYN请求报文,当B收到后回应后并建立了链接。当数据发送完关闭tcp链接之后,如果此时A第一次发送的SYN请求包到达了B,并且B做出回应后就直接建立了TCP链接,此时就造成了资源的浪费。
三次握手是在安全可靠的基础上,握手次数最少的方案。两次握手并不能保证可靠性。四次握手又浪费了效率
4.四次挥手
第一次挥手:客户端发出连接释放报文FIN ,并且停止发送数据, 其序列号为 seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序列号。
第二次挥手:服务端收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时服务端就进入了CLOSE-WAIT(关闭等待)状态,TCP服务器通知高层的进程应用,客户端向服务端的方向就释放了,这时候处于半关闭状态,就是客户端不再向服务端发数据了,但是服务员向客户端发数据,客户端仍要接受。这个状态要持续一段时间,也就是整个CLOSE-WITE状态持续的时间.
第三次挥手:服务端最后的数据发送完后,就向客户端发送连接释放报文,FIN=1,ack=u+1,还有他的序号seq=w(半关闭状态也发送的数据报文),此时服务端就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到服务端的链接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时客户端就进入TIME-WAIT(时间等待)状态。此时tcp还没有释放,还需要等待2MSL的时间后,客户端撤销相应的TCB后,就结束了这次tcp链接。