1. 为何链接的时候是三次握手,关闭的时候倒是四次握手?服务器
由于当Server端收到Client端的SYN链接请求报文后,能够直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。可是关闭链接时,当Server端收到FIN报文时,极可能并不会当即关闭SOCKET,因此只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端全部的报文都发送完了,我才能发送FIN报文,所以不能一块儿发送。故须要四步握手。网络
这主要是为了防止已失效的链接请求报文段忽然又传到了B,于是产生错误。资源
现假定一种异常状况,即A发出的第一个链接请求报文段并无丢失,而是在某些网络节点长时间滞留了,以至延误到链接释放后的某个时间才到达B。原本这是一个早已失效的报文段。但B受到此失效的链接请求报文段后,就误觉得是A又发出一次新的链接请求,因而就向A发出确认报文段,赞成创建链接。假定不采用第三次报文握手,那么只要B发出确认,新的链接就创建了。同步
因为如今A并无发出创建链接的请求,所以不会理睬B的确认,也不会向B发送数据,但B却觉得新的运输链接已经创建了,并一直等待A发来的数据。B的许多资源就这样白白浪费了。请求
采用三次握手链接,能够防止上述现象的发生。例如在刚才的异常状况下,A不会向B的确认发出确认,B因为收不到确认,就知道A并无要求创建链接,因而B就不会再创建链接。im
TCP还设有一个保活计时器,显然,客户端若是出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会从新复位这个计时器,时间一般是设置为2小时,若两小时尚未收到客户端的任何数据,服务器就会发送一个探测报文段,之后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭链接。数据