Unity高频面试题--计算机网络中TCP 的常见问题
1.三次握手
三次握手的具体流程如下:
第一次握手:
客户端向服务器发送一个带有 SYN(同步序列编号)标志的数据包,其中 SYN 置为 1,同时随机选择一个初始序列号 seq = x(x 为随机数)。发送完毕后,客户端进入 SYN_SENT 状态,等待服务器的确认。
第二次握手:
服务器收到客户端的 SYN 包后,知道客户端请求建立连接,必须确认客户的 SYN。服务器将 SYN 和 ACK 标志都置为 1,ACK(确认号)的值为 x + 1(表示确认收到客户端的序列号为 x 的数据包),同时随机产生一个序列号 seq = y(y 为随机数)。然后服务器将这个包含 SYN 和 ACK 标志的数据包发送给客户端,此时服务器进入 SYN_RECV 状态。
第三次握手:
客户端收到服务器的 SYN+ACK 包后,向服务器发送确认包 ACK,ACK 标志置为 1,确认号 ack = y + 1(表示确认收到服务器的序列号为 y 的数据包),此时客户端自己的序列号为 seq = x + 1。此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。之后,客户端与服务器开始正式传送数据。
2.TCP握手常见问题
为什么连接的时候是三次握手,关闭的时候却是四次挥手?
三次握手的原因
-
建立可靠连接
三次握手的核心机制在于双方交换并确认序列号(seq)。这一过程确保了客户端与服务端均具备双向通信能力——既能发送也能接收数据,同时完成序列号的相互验证,为建立可靠的通信连接奠定基础。
-
防止过期请求建立连接
为了防止网络延迟等原因导致已失效的连接请求报文段意外到达服务器,从而引发错误连接,采用三次握手机制非常必要。
在两次握手的情况下,如果客户端首次发送的连接请求报文丢失后重发新请求,而最初丢失的报文随后到达服务器,服务器会误认为是新连接请求而建立连接。此时客户端实际上并不需要这个连接,导致资源浪费。而三次握手机制能有效避免此类问题。

四次挥手的原因
-
允许半关闭状态存在:
当客户端发送 FIN 报文表示想要关闭连接时,服务器收到该报文后,可能还有数据没有发送完成,所以不能立即关闭连接,只能先回复一个 ACK 报文,告诉客户端“你发的 FIN 报文我收到了”。
此时,连接处于半关闭状态,客户端不再发送数据,但服务器还可以继续发送数据给客户端。只有等到服务器所有的报文都发送完了,它才能发送 FIN 报文给客户端,表示自己也没有数据要发送了,请求关闭连接。
-
确保数据传输完整性:
服务器先回复 ACK 报文,然后在数据发送完毕后再发送 FIN 报文,可以让客户端知道服务器的数据已经发送完成,避免客户端在关闭连接后还收到服务器后续发送的数据,从而确保数据传输的完整性。

综上所述,连接时的三次握手是为了建立可靠连接并防止错误连接的建立,而关闭时的四次挥手是为了适应数据传输的实际情况,允许半关闭状态存在以确保数据传输的完整性。
获取更多Unity游戏开发知识可关注公众号:Unity游戏开发之路。
更多推荐
所有评论(0)