三次握手
是指建立一个 TCP 连接时,需要客户端和服务器总共发送 3 个包。
a)客户端发起连接请求到服务端
客户端会发送一个带有SYN标志的报文到服务端
b)服务端响应请求返回到客户端
服务端接收到客户端的请求,并向客户端回应了一个ACK+SYN标志的报文,ACK是对客服端SYN标志的回应,SYN是对客服端的一个确认,询问客户端是否准备好数据的传输
c)客户端反映接收状况到服务端
客户端接收到服务端的回应,针对服务端的SYN报文回应了一个ACK标志的报文,然后同服务端建立连接,进行数据的传输
通俗化例子:①小明给小红打电话:“小红你好”
②小红回复:“你好,你是小明吗?”
③小明回复:“是的”,于是两方正式开启了会话
四次挥手
是指断开一个 TCP 连接时,需要客户端和服务器总共发送 4个包。
【注意】中断连接端可以是Client端,也可以是Server端。
a)客户端发起断开连接请求到服务端
客户端发送一个带有FIN标志的报文到服务端,告诉服务端我没有数据进行传输了,可以关闭链接了
b)服务端接收请求
服务端收到客户端的请求,回复了一个带有ACK标志的报文到客服端,告诉客户端我收到你的关闭链接消息了,但我还存在未处理完的事情,所以需要客户端进行等待,这个时候客户端就进入FIN_WAIT状态,继续等待服务端的FIN报文
c)服务端响应客户端
服务端处理完自己的业务后,发送了FIN标志的报文给客户端,告诉客户端我已经处理完所有事情了,服务端进入LAST_ACK阶段(超时等待)
d)客户端反映接收状况到服务端
客户端收到服务端的FIN标志报文后,向服务端发送了一个ACK标志的报文确认,此时两端正式断开连接
通俗化例子:
①用户在美团上下单外卖
②商家看到订单,进行订单确认,用户看到订单确认,表示商家已经受理了订单
③商家进行食物的制作,制作完成后交给外卖小哥送货
④用户收到了食物,在美团上点击确认收货,商家看到了后这笔订单则正是关闭
扩展
Q1:为什么建立连接是三次握手,而断开连接是四次握手呢?
A1:建立连接的时候服务端可以同时把ACK和SYN标志的报文发送到客户端,所以三次即成,断开连接时,服务端接收到客户端的断开请求和实际断开连接为2次,所以断开连接需要四次握手。
Q2:三次握手时第三次可以携带数据吗?为何?
A2:可以,能发出第三次握手报文的主机肯定也接收到了第二次报文,因为伪造IP的主机是收不到第二次报文的,所以可以确认能够发出第三次报文的用户是合法的。