TCP为什么需要三次握手

tcp为什么要第三次握手,time_wait是做什么的? 
tcp有几种状态,画出所有的状态转换图。 


晚上看到的面试题,TCP三次握手的印象很深,但为什么需要3次握手,还是想不起来了。

简单而言:如果不是三次握手的话,那么到底需要几次握手最佳呢?2次握手,或者4次以上的握手?


先看2次握手的情况:客户端给服务器发送建立连接的请求,服务器同意连接请求发回应给客户端,连接就此建立。

有问题的就是网络中经常会出现的包的延迟,如果客户端的某个包在路由器上延迟了,过了很久才发给服务器,服务器收到这个包后回应给客户端,服务器以为连接就此建立成功,分配资源,这样就会出现问题。


再看四次握手的情况:

①A发送SYN,

②B收到SYN后发送ACK+SYN

③A发送ACK

④B再发送ACK

实际上这样的过程可以一直循环下去,其实3次握手已经是能够使双方知道对方设备都是好用的最少次数。四次握手会浪费资源。

综上所述,TCP 3次握手最好。


下面是第二个问题:time_wait是做什么的?

TCP为什么需要三次握手_第1张图片

假设客户端发送的最后一个ACK丢失了,服务器会重发它发送的最后一个FIN,所以客户端必须维持一个状态信息,以便能够重发ACK;如果不维持这种状态,客户端在接收到FIN后将会响应一个RST,服务器端接收到RST后会认为这是一个错误。如果TCP协议能够正常完成必要的操作而终止双方的数据流传输,就必须完全正确的传输四次握手的四个节,不能有任何的丢失。这就是为什么socket在关闭后,仍然处于 TIME_WAIT状态,因为他要等待以便重发ACK。



你可能感兴趣的:(网络,面试题)