TCP 协议在建立连接时采用三次握手的方式,主要是为了确保客户端和服务器之间建立起可靠的连接。 TCP 之所以需要 3 次握手是因为 TCP 双方都是全双工的。
所谓全双工指的是,TCP 任何一端既是发送数据方,又是接收数据方,因此这就要求 TCP 通讯双方既要保证自己的发送能力,又要保证自己的接收能力才行。
这就好像打电话时,通讯双方都要保证自己能话筒(传递声音)和耳机(接收声音)都是正常的才行,这样才能进行有效的交流,通常打电话时,都是这样开头的:
- 我:喂,能听到我说话吗?
- 对方:能听到你说话,你能听到我说话吗?
- 我:能听到你说话,那我们就来聊正事吧。
TCP 三次握手也是相同的道理,3 次握手证明的能力详情如下:
TCP 三次握手流程
TCP 三次握手具体流程如下:
- 客户端发送 SYN 包:客户端向服务器发送一个 SYN 包,其中 SYN 标识位为 1,表示客户端请求建立连接,并指定一个随机的序列号 x。
- 服务器发送 SYN+ACK 包:服务器收到客户端的 SYN 包后,向客户端发送一个 SYN+ACK 包,其中 SYN 和 ACK 标识位均为 1,表示服务器接收到了客户端的请求,并同意建立连接。同时服务器也会指定一个随机的序列号 y,并将确认号设置为 x+1。
- 客户端发送 ACK 包:客户端收到服务器的 SYN+ACK 包后,向服务器发送一个 ACK 包,其中 ACK 标识位为 1,表示客户端确认收到了服务器的响应,并将确认号设置为 y+1。
执行流程如下图所示:
小结
TCP 之所以需要 3 次握手,是因为 TCP 通讯双方都是全双工的,所以要经过 3 次交互才能确认双方的发送能力和接收能力,并且 TCP 握手必须是 3 次,如果是 2 次握手,不能证明服务器端的发送能力和客户端的接收能力;也不能是 4 次握手,因为 3 次已经能证明的事情,再交互握手 1 次完全没有必要。
特殊说明
以上内容来自我的《Java 面试突击训练营》,这门课程是有着十几年工作经验(前 360 开发工程师),10 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课。学完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,并且课程配备了 9 大就业服务,帮助上千人找到 Java 工作,其中上百人拿到大厂 Offer,学员最高薪资 70W 年薪,面试课目录和 9 大服务如下:
加我微信咨询:vipStone【备注:训练营】