正规的网站优化推广公司,做app护肤网站,wordpress企业文化模板下载,兴安盟老区建设促进会网站目录 ⛳ TCP 协议面试题#x1f43e; 一、为什么关闭连接的需要四次挥⼿#xff0c;⽽建⽴连接却只要三次握⼿呢#xff1f;#x1f3ed; 二、为什么连接建⽴的时候是三次握⼿#xff0c;可以改成两次握⼿吗#xff1f;#x1f463; 三、为什么主动断开⽅在TIME-WAIT状态… 目录 ⛳ TCP 协议面试题 一、为什么关闭连接的需要四次挥⼿⽽建⽴连接却只要三次握⼿呢 二、为什么连接建⽴的时候是三次握⼿可以改成两次握⼿吗 三、为什么主动断开⽅在TIME-WAIT状态必须等待2MSL的时间 四、如果已经建⽴了连接但是Client端突然出现故障了怎么办 ⛳ TCP 协议面试题 一、为什么关闭连接的需要四次挥⼿⽽建⽴连接却只要三次握⼿呢
关闭连接时被动断开⽅在收到对⽅的FIN结束请求报⽂时很可能业务数据没有发送完成并不能⽴即关闭连接被动⽅只能先回复⼀个ACK响应报⽂告诉主动断开⽅ “你发的FIN报⽂我收到了只有等到我所有的业务报⽂都发送完了我才能真正的结 束在结束之前我会发你FINACK报⽂的你先等着”。所以被动断开⽅的确认报⽂需要拆开成为两步故总体就需要四步挥⼿。
⽽在建⽴连接场景中Server端的应答可以稍微简单⼀些。当Server端收到Client端的SYN连接请求报⽂后其中ACK报⽂表示对请求报⽂的应答SYN报⽂⽤来表示服务端的连接也已经同步开启了⽽ACK报⽂和SYN报⽂之间不会有其他报⽂需要发送故⽽可以合⼆为⼀可以直接发送⼀个SYNACK报⽂。所以在建⽴连接时只需要三次握⼿即可。 二、为什么连接建⽴的时候是三次握⼿可以改成两次握⼿吗
三次握⼿完成两个重要的功能⼀是双⽅都做好发送数据的准备⼯作⽽且双⽅都知道对⽅已准备好⼆是双⽅完成初始SN序列号的协商双⽅的SN序列号在握⼿过程中被发送和确认。
如果把三次握⼿改成两次握⼿可能发⽣死锁。两次握⼿的话缺失了Client的⼆次确认ACK帧假想的TCP建⽴的连接时⼆次挥⼿可以如下图所示 在假想的TCP建⽴的连接时⼆次握⼿过程中Client发送Server发送⼀个SYN请求帧Server收到后发送了确认应答SYNACK帧。按照两次握⼿的协定Server认为连接已经成功地建⽴了可以开始发送数据帧。这个过程中如果确认应答SYNACK帧在传输中被丢失Client没有收到Client将不知道Server是否已准备好也不知道Server的SN序列号Client认为连接还未建⽴成功将忽略Server发来的任何数据分组会⼀直等待Server的SYNACK确认应答帧。⽽Server在发出的数据帧后⼀直没有收到对应的ACK确认后就会产⽣超时重复发送同样的数据帧。这样就形成了死锁。 三、为什么主动断开⽅在TIME-WAIT状态必须等待2MSL的时间
原因之⼀主动断开⽅等待2MSL的时间是为了确保两端都能最终关闭。假设⽹络是不可靠的被动断开⽅发送FINACK报⽂后其主动⽅的ACK响应报⽂有可能丢失这时候的被动断开⽅处于LAST-ACK状态的由于收不到ACK确认被动⽅⼀直不能正常的进⼊CLOSED状态。在这种场景下被动断开⽅会超时重传FINACK断开响应报⽂如果主动断开⽅在2MSL时间内收 到这个重传的FINACK报⽂会重传⼀次ACK报⽂后再⼀次重新启动2MSL计时等待这样就能确保被动断开⽅能收到ACK报⽂从⽽能确保被动⽅顺利进⼊到CLOSED状态。只有这样双⽅都能够确保关闭。反过来说如果主动断开⽅在发送完ACK响应报⽂后不是进⼊TIME_WAIT状态去等待2MSL时间⽽是⽴即释放连接则将⽆法收到被动⽅重传的FINACK报⽂所以不会再发送⼀次ACK确认报⽂此时处于LAST-ACK状态的被动断开⽅⽆法正常进⼊到CLOSED状态。
原因之⼆防⽌“旧连接的已失效的数据报⽂”出现在新连接中。主动断开⽅在发送完最后⼀个ACK报⽂后再经过2MSL才能最终关闭和释放端⼝这就意味着相同端⼝的新TCP新连接需要在2MSL的时间之后才能够正常的建⽴。2MSL这段时间内旧连接所产⽣的所有数据报⽂都已经从⽹络中消失了从⽽确保了下⼀个新的连接中不会出现这种旧连接请求报⽂。 四、如果已经建⽴了连接但是Client端突然出现故障了怎么办
TCP还设有⼀个保活计时器Client端如果出现故障Server端不能⼀直等下去这样会浪费系统资源。每收到⼀次Client客户端的数据帧后Server端都的保活计时器会复位。计时器的超时时间通常是设置为2⼩时若2⼩时还没有收到Client端的任何数据帧Server端就会发送⼀个探测报⽂段以后每隔75秒钟发送⼀次。若⼀连发送10个探测报⽂仍然没反应Server端就认为 Client端出了故障接着就关闭连接。如果觉得保活计时器的两个多⼩时的间隔太⻓可以⾃⾏调整TCP连接的保活参数。