#1.因为网络延迟等原因导致第三次握手数据包丢失的解决办法:
客户端与服务器第二次握手后,服务器会把该客户端放在半开队列并设置一个计时器,计时器归零之前若第三次握手成功,服务器将会把该客户端从半开队列移入全连队列(连接成功);若在计时器归零第三次握手没有成功,服务器则会忽略此次连接请求并把该客户端从半开队列中移除。
#2.需要三次握手的原因:
##2.1从生活的角度来看:
你(客户端)用微信给你朋友(服务器)发消息:今晚去你家玩,你方便吗?(第一次握手)
你朋友回复:好的。(第二次握手)
这时候你的手机没信号了,你朋友一直也联系不到你,这时在你朋友就不能完全确定你晚上到底去不去他家玩。
如果你也回复了:好的(第三次握手)。那就不存在这种问题了。
## 2.2从tcp角度看
### 2.2.1如果只有两次握手:
只能确定客户端收到了服务端的序列号起始值,但不能确定客户端能收到服务端的序列号起始值。
只能确认服务端能收到消息,但不能确定客户端是否能正常接收数据。
网络环境混乱时,服务端同时收到同一客户重复发送的连接请求时(例如:客户端第一次链接请求时恰好网络延迟较高,导致服务端同时接收到第一次与后来的请求连接数据包),如果没有第三次握手就无法分辨哪一次请求是有效的(每一次请求的数据包序列号都是不一样的)。如果都通过就会造成端口浪费。
### 2.2.2为什么不是四次握手
三次就能完美解决所有问题,没必要更多次。
#3.关于SYN以及序号
前两次握手发送的数据包SYN置1,虽然SYN报文段不能携带数据,但仍需要消耗一个序号,第三次握手发送的数据包中SYN不唯一,不消耗序号,所以下一个数据包的序号seq也等于x+1.
ACK可以携带数据,但不携带数据时不消耗序列号。