概要
TCP三次握手流程:
- Client 发送 SYN包 带ACK = x 进入 SYN_SEND状态 【表明了Clint的发送能力】
- Sever 接收到包, 确认ACK, 发送SYN (seq等于 y)+ACK=x+1包,进入 SYN_Recv状态 【表明Server的发送和接收能力】
- Client 接受到包, 确认, 发送ACK=y+1 ,双方进入Established状态
三次握手的作用
- 确认双方的发送和接收能力
- 避免过期的链接请求
过期的链接请求
当客户端发送SYNC包后 发生宕机,并且这个SYN报文在网络中阻塞,这时候服务端还没有接收到客户端发过来的报文,之后客户端重新发送新的SYN报文,导致两个报文都到达服务器端,造成浪费
如果只有两次握手
如果只有两次握手,当客户端的 SYN 请求连接在网络中阻塞,客户端没有接收到 ACK 报文,就会重新发送 SYN,由于没有第三次握手,服务器不清楚客户端是否接收到了自己发送的建立连接的 ACK 确认信号,所以服务器每收到一个 SYN 就只能先主动建立一个连接,就会建立多个冗余的无效链接,造成不必要的资源浪费。所以,两次握手不具备可靠性。
序列号
TCP 协议通信的双方,都必须维护一个序列号,序列号是可靠传输的一个关键因素
- 接收方可以去除重复的数据;
- 接收方可以根据数据包的序列号按序接收;
- 可以标识发送出去的数据包中,哪些是已经被对方收到的;
如果只有两次五首,只有发送方序列号能被确认,而接收方序列号无法同步,需要一来一回才可以完成确认