学习整理,纯属个人理解,如有问题欢迎联系,文末有参考大神资料说明
tcp的三次握手:
1.第一次握手,客户端尝试建立连接,发送SYN包(syn=j)到服务器,并且进入SYN_SENT状态进行等待;
2.第二次握手, 服务器收到客户端syn包,确认客户端的syn 并且生成ACK(j+1)和自己的SYN(k),发送SYN+ACK包给客户端,然后服务端进入SYN_RECV状态
3.第三次握手,客户端收到服务器的SYN+ACK包,向服务端发送ACK(k+1),此包发送完成,客户端和服务器同时进入ESTABLISHED状态(tcp连接成功),至此三次握手完成
通俗点的理解(打电话:)
A:歪?能听到么?( 第一次握手,发起连接)
B:能听到,可以了,什么事情?(第二次握手,目标收到,并回复确认,可以进行通讯)
A&B:聊天进行中(第三次握手,连接建立,进行数据传输)
流程图如下,
![](https://img.haomeiwen.com/i14215707/f1bc7d4b512b06be.png)
同样结束连接时候需要4次挥手:
1.第一次挥手,客户端发送连接释放报文,并且停止发送数据, 释放报文主要携带参数(FIN=1,seq=u)。此时,客户端将进入FIN-WAIT-1状态
2.第二次挥手,服务端收到客户端释放报文,发出确认报文,ACK=1,seq=v,ack=u+1,此时服务端进入CLOSE-WAIT状态。第二次挥手完成后,客户端到服务端方向的连接已经释放,服务端不会再接收数据,客户端也不会再发送数据。但服务端到客户端方向的连接仍然存在,可以继续向客户端发送数据。
3.第三次挥手,当服务端向客户端发完所有数据后,向客户端发送连接释放请求,请求头:FIN=1,ACK=1,seq=w,ack=u+1。服务端便进入LAST-ACK状态。
4.第四次挥手,客户端收到释放请求后,向服务端发送确认应答,此时客户端进入TIME-WAIT状态。该状态会持续2MSL时间,若该时间段内没有服务单的重发请求的话,就进入CLOSED状态。当服务端收到确认应答后,也便进入CLOSED状态
通俗点的理解(打电话:)
A&B:通话中...
A:行,我要挂了,还有什么其他事情么?(第一次挥手,发送释放报文)
B:好,我想想哈,.@#$@#$@#$@#$@(第二次挥手,发回确认报文,如果有往客户端的数据仍可传输)
B:没了,挂了吧(第三次挥手,向客户端发送释放报文)
A:好,你先挂吧 (第四次,客户单收到释放报文,发给服务端确认报文)
B:挂断.(收到确认报文 close)
A:(等2ms),挂断(close)
![](https://img.haomeiwen.com/i14215707/07f436c1601c25d3.png)
本文借鉴参考
资料链接:
网友评论