前言:TCP是非常常见的面试题,是必会的知识点,记录一下与各位共同学习。
三次握手
![](https://img-blog.csdnimg.cn/665fa97e5ad64280b7b515072c438348.png#pic_center)
问:为什么要三次握手?
因为三次握手才能保证双方具有接收和发送的能力
-
第一次握手:
客户端
发送带有SYN
标志的连接请求数据包
给服务端 -
第二次握手:
服务端
发送带有SYN+ACK
标志的连接请求和应答数据包
给客户端 -
第三次握手:
客户端
发送带有ACK
标志的应答数据包
给服务端(可以携带数据了) -
简单比喻:
- 发送方:小明,接收方:小红
- 小明给小红打电话,小红接听了并回复(确认小红的接受能力),小明收到回复(确认小明的接受能力和发送能力)。
这时小明已经确认了小红的发送能力,但是小红自己不能确认
,所以需要小明回复一次,小红接收消息(确认小红的发送能力),到此双方的收发能力确认完毕,接下来就可以进行数据传输。
四次挥手
![](https://img-blog.csdnimg.cn/a1641bf7d9b2459d9936671e90630ad4.png#pic_center)
问:为什么挥手需要四次?
等到收发双发数据传输完毕,并不是发送方传输完毕整个传输过程就结束,还需等待接收方发送数据和接收数据
-
客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。 -
服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSED_WAIT
状态。 -
客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。 -
等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态。 -
客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态 -
服务器收到了
ACK
应答报文后,就进入了CLOSE
状态,至此服务端已经完成连接的关闭。 -
客户端在经过
2MSL
一段时间后,自动进入CLOSE
状态,至此客户端也完成连接的关闭。 -
简单比喻:
- 发送方:小明,接收方:小红
- 小明给小红打电话,小明说没有什么要说的了,小红收到后回复(确认小明关闭发送功能,小红关闭接收功能)
- 小红的话说完了,告知小明,小明收到后回复(确认小红关闭发送功能,小明关闭接收功能)
其他
-
我这里只做简单的入门记录,想要了解更多可以查看以下大佬的文章