三次握手和四次挥手发生在什么时候?
发生在 TCP/IP协议 的 传输层
一、什么是三次握手
第一次握手:
建立连接时,客户端发送SYN包(SYN=x)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:
服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态
![02822ff2132432eae6a7d82f1482bbbc.png](https://i-blog.csdnimg.cn/blog_migrate/ff011242cde0e54875ed4971f9bb458f.jpeg)
- SYN报文是用来同步的
- ACK报文是用来应答的
![299d25161e2e11393bd6cc16e702e77f.png](https://i-blog.csdnimg.cn/blog_migrate/db1568a58364864f66bce9480a09debf.png)
二、什么是四次挥手
TCP四次挥手是TCP连接释放的过程
![858735e5e205cd7faafd35a507cfe828.png](https://i-blog.csdnimg.cn/blog_migrate/771c1edf894d75d9c745241c7a449933.jpeg)
三、为什么挥手要比握手多一次?
关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,
所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。
只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。
故需要四步握手。
用我自己的话理解就是:
A给B发消息:“我打算关闭了!”
B给A回消息:“你的消息我收到了!但是我活还没干完,等我一会!”
B给A回消息:“好了,我活干完了!”
A给B发消息:“好的,我挂断了!”——同时等待一段时间后关闭
B收到消息后立即关闭