1. 两次握手行不行?
答案是不行。TCP如果进行两次握手,则不符合全双工的要求,也就是无法确认双方的接收能力与发送能力是否正常。可以看以下图解:
基于这种两次握手不能实现全双工的原因,会出现一些问题,比如:
客户端发送了一个数据包,因为网络堵塞等原因并没有到达服务端,于是发送了第二个数据包。而这时候,网络堵塞突然好了,也就是服务端收到了两个数据包,这时候服务端就以为客户端要建立两次连接,而客户端却认为自己只是建立了一个连接。这样会造成客户端与服务端状态不一致以及资源浪费的情况。
2.四次握手呢?
简单来说,三次握手已经保证了全双工的要求,已经建立了可靠的连接。四次握手没有必要,除了浪费性能,也无法获得更高的保证性(五次,六次,七次八次也是一样的)。
3. 第三次握手能不能携带数据(指除了数据包参数以外的数据)?
答案是能。因为第二次握手的时候客户端已经确认了双方的发送与接收能力,进入了ESTABLISHED状态。甚至第二次握手后,可以直接发送一个GET请求给服务端当作第三次握手。(因为GET请求的ACK = 1)不过一般并不推荐这种做法。
4. 三次握手中出现丢包会发生什么?
总的来说,会周期性地重发包,直到得到回应或者超过最大次数。
1.第一次握手丢包:
即服务端没有收到客户端的SYN请求,不知道客户端要建立连接。这时候客户端会等待一段时间后重发数据包,这种重发是周期性的,也就是只要没有回应会一直发送(当然也有最大次数限制)。
2.第二次握手丢包
即客户端没有收到服务端的SYN+ACK响应,不确定服务端是否收到了自己的请求。这时候客户端还是会周期性地重发数据包给服务端,直到达到最大次数。
3.第三次握手丢包
即服务端没有收到客户端的ACK确认,不知道自己发送的包是否到了客户端。这时候服务端会重发数据包给客户端,也是周期性的,存在最大次数限制。