通信协议之TCP
- TCP建立和释放连接
先来说说协议可靠性,比如两人接通电话后先要寒暄几句,一方面出于尊重,更主要目的是确认身份嘛,防止聊了半天,发现聊错对象了哈。一样的道理,两台机器想要通信互传数据之前,先要建立连接,连接过程大致描述为:A发送seq=a给B,B发送ack=a+1,seq=b给A,A发送ack=b+1给B,连接建立完成。连接释放过程大致描述为:A发送FIN给B,B发送ACK给A,B发送FIN给A,A发送ACK给B,连接释放完成。
- 为什么是三次握手
我们大致明白了tcp建立连接的过程,那问题来了,为什么是三次握手建立连接,不是两次或四次。
如果是两次,假设有这样一种情况出现,A在一段时间没有收到B的确认消息后,会重发A的连接请求,这时B会重新为A申请资源,此时A收到了重发消息的确认消息后,A又收到第一次建立连接的确认消息,A因为已经重建连接了,此时这个消息会被丢掉,但B并不知道,这时A端有一个连接资源,B端有两个连接资源,所以二次握手会造成服务器资源的浪费。三次握手B如果一直没有收到A的确认消息,B在一段时间后会释放掉无效的资源,很明显三次握手很好的解决了这个问题。四次握手的话,B给A的连接和确认消息分两次发送是没必要的,因为开始建立连接时,还没有开始传输数据,所以B并没有处理中的数据,所以B的连接请求和确认可以一次发送给A。这里顺便提一下tcp释放连接是四次挥手,不是三次,是因为B一方面要实时给A关闭确认,避免A超时未接到确认消息会重发关闭请求,另一方面B的关闭连接请求要等到B端没有处理中的数据,所以分四次释放连接是合理可靠的。