TCP协议的常见面试题

1. 为何链接的时候是三次握手,关闭的时候倒是四次握手?服务器

由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。网络

2. 为何不能用两次握手进行链接?

这主要是为了防止已失效的链接请求报文段忽然又传到了B,于是产生错误。资源

现假定一种异常状况,即A发出的第一个链接请求报文段并无丢失,而是在某些网络节点长时间滞留了,以至延误到链接释放后的某个时间才到达B。原本这是一个早已失效的报文段。但B受到此失效的链接请求报文段后,就误觉得是A又发出一次新的链接请求,因而就向A发出确认报文段,赞成创建链接。假定不采用第三次报文握手,那么只要B发出确认,新的链接就创建了。同步

因为如今A并无发出创建链接的请求,所以不会理睬B的确认,也不会向B发送数据,但B却觉得新的运输链接已经创建了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。请求

采用三次握手链接,能够防止上述现象的发生。例如在刚才的异常状况下,A不会向B的确认发出确认,B因为收不到确认,就知道A并无要求创建链接,因而B就不会再创建链接。im

3. 为何TIME_WAIT状态须要通过2MSL才能返回到CLOSE状态?
  • 第一,为了保证A发送的最后一个ACK报文段可以到达B。假设网络是不可靠的,有能够最后一个ACK丢失。因此TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server若是没有收到ACK,将不断重复发送FIN片断。因此Client不能当即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK以后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。若是在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片断在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。若是直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被Server成功接收,则结束TCP链接。
  • 第二,防止“已失效的链接请求报文段”出如今本链接中。A在发送完最后一个ACK报文段后,再通过时间2MSL,就可使本链接持续的时间内所产生的全部报文段都从网络中消失。这样就可使下一个新的链接中不会出现这种旧的链接请求报文段。
4. 若是已经创建了链接,可是客户端忽然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端若是出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会从新复位这个计时器,时间一般是设置为2小时,若两小时尚未收到客户端的任何数据,服务器就会发送一个探测报文段,之后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭链接。数据

相关文章
相关标签/搜索