TCP 三次握手是为了保证:让客户端和服务器都知道自己和对方的发送和接收都没问题。
换句话说,可以 假设客户端和服务端都维护了四个布尔变量:自己发送,自己接收,对方发送,对方接收。 初始值为 false,只有这服务端和客户端的这四个变量都为 true 了才确保连接是可靠的。
第一次握手:服务端接收到客户端的 SYN,知道了对方的发送能力和自己的接收能力没问题。
第二次握手:客户端接收到服务端的 SYN 和 ACK,知道了自己的发送能力,接收能力,对方的接收能力,发送能力都没问题,也就是说两次握手客户端已经就绪(ESTABLISHED)了。
第三次握手:服务端接收到客户端的 ACK,知道自己的发送能力和对方的接收能力没问题,服务端也就绪(ESTABLISHED)了。
为什么两次不行? 两次握手不能让服务器知道自己的发送能力和对方的接收能力是不是已就绪。
为什么四次不行?三次就够了,四次浪费。
其他:
- SYN 报文段(即 SYN = 1 的报文段)不能携带数据,但要消耗一个序号。
- ACK 报文段(只有 ACK,没有 SYN)可以携带数据,携带数据则消耗一个序号,不携带就不消耗。
- seq 表示报文段的序号,ack 表示期待下一个报文段的序号。如 ack = x + 1 表示客户端下一个报文段应该是序号为 x + 1 的报文段,也可以理解为,从起始(起始不是0,是初始化连接时随机生成的)到 x 的报文段都已被正确接收。