TCP 的三次握手
具体流程文字描述就是:客户端首先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息,从而完成三次握手,建立起一个可靠的TCP连接。
来看下这个图:
为什么需要三次握手
有两个原因
- 避免历史错误连接的建立,减少通信双方方不必要的资源消耗。
- 帮助通信双方同步初始化序列号。
避免历史错误连接的建立
如果只有两次握手,那么接收方只能接受或者拒绝,如果网络比较拥堵,发送方可能会发送多次建立请求的连接,而这时接收方并不知道这次请求是旧的还是新的。
所以需要接收方发送 ACK (确认报文)来告知发送方自己收到的是那一次连接。
帮助通信双方同步初始化序列号
因为网络本身的不稳定性可能为导致:
- 数据丢失
- 数据重复传输
- 数据乱序
而 TCP 是一个可靠传输协议,它需要保证数据不丢失且有序的传输。基于上述的问题,TCP 引入了序列号,它使得:
- 接收方可以根据序列号去重
- 接收方可以根据序列号排序
- 发送方针对为接收到 ACK 的序列号对应的数据包,可以重传
序列号是有序的,因此在通信的初始化阶段,双方就需要同步序列号,不然数据后面就都对不上了。