zoukankan      html  css  js  c++  java
  • TCP三次握手,四次挥手详解及常见面试题

          引言: 集中一点,登峰造极。

          先把流程图贴上来 : 

                

             为什么这么复杂? 因为TCP是可靠性传输。

             确认可靠传输的前提:  TCP连接管理机制

             用TCP报文中标志位控制 :

             三次握手(建立连接) :    两次连接请求(SYN)+两次应答(ACK)

                流程 : 服务端进入LISTEN状态后,客户端向服务端发送SYN连接请求,服务端收到后会发送ACK应答和SYN连接请求,客户端收到后再向服务端发送ACK应答,此时连接建立成功。

             四次挥手(断开连接) :    两次断开请求(FIN)+两次应答(ACK)

                流程 : 主动断开方不确定,主动断开方发送FIN断开请求,被动方回复ACK应答进入CLOSE_WAIT状态,被动方关闭连接后再发送FIN断开请求,主动断开方回复ACK应答进入TIME_WAIT状态,被动方收到ACK后关闭,2MSL后主动方关闭,此时连接断开成功。

              

             Q1: 为什么服务端要先进入LISTEN状态?

             A1:  在应用层就是调用listen函数,使socket变为被动状态,允许其他客户端和服务器建立连接。

             Q2: 怎么才算建立连接成功?断开连接成功?

                A2: 两端都进入ESTABLISHED状态,都进入COLSED状态。

             Q3: 为什么要有TIME_WAIT状态,直接关闭不好吗?

             A3: 重传控制 , 为了保证最后一个ACK丢了还能重传,确定对方确认。客户端进程已经没有了,但是TCP连接还存在,如果被动方没收到ACK,就会超时重传FIN,这样

             Q4: 为什么是2MSL?

             A4:  连接存在就会占用内存,所以不可能一直存在,等2MSL就会强制中断

               1.保证被动方可以超时重传FIN

               2.MSL是一个数据报从一端走到另一端所消耗的最长时间,2MSL能保证两个传输中未被接收或者迟到的报文段消失(否则如果服务器立刻重启,会收到上一进程的数据,此时信息可能错误)

               

             Q5: 为什么是三次握手,四次挥手?

             A5: 三次握手是因为服务端接收到SYN后,可以直接发送SYN和ACK应答用来同步

               服务器收到FIN后,内核主动回应ACK,应用层调用了close才会发送FIN。也可以是三次挥手,用捎带应答。

               Q6: 如果客户端突然出现故障怎么办?

             A6: TCP处理异常设有保活定时器: 如果一定时间内没有收到任何发送方的数据,此时就发一个心跳包,发若干次后,如果没回应就断开连接。

     

             Q7: 为什么不能用两次握手或者四次握手?

                A7: 三次能确保对方具有收发数据的能力,并且保存异常连接的一方只可能是客户端,不会浪费服务器资源

               如果是两次,客户端给服务器发消息,服务器收到后再给客户端发消息,不能确保客户端是否能收到消息。所以需要客户端再回复给服务器表示我能收到消息。

               四次也就多余了。

                                            如果是两次,容易让服务器收到SYN"洪水攻击",浪费服务器资源。四次也可能会浪费服务器资源。

             Q8: 连接建立一定成功吗?

                                    A8: 不一定. 三次握手也都是普通的报文,都有可能丢。 

                                           前两个报文丢了,建立不成功,双方不会为了维护这个连接而长时间保持这个失败的连接。

                                           第三个报文丢了,客户端连接成功,服务器不会长时间保存这个半连接,客户端会长时间保持这个连接,会浪费客户端资源。

            

  • 相关阅读:
    【转】HTTP 状态码详解
    程序员自我提升之粗粮与细粮
    配置Eclipse支持MacBook Pro Retina屏幕的办法(解决Retina屏幕下eclipse字体变虚的问题)
    IE6下lineheight失效:当文字与图片img在同一行中显示时lineheight失效的解决办法
    2013年第二周的总结
    为什么这么多的云存储产品却没有一个能够统一管理它们的应用出现
    微软的云笔记:OneNote+SkyDrive
    完美的外出上网解决方案随身随地享用你的专有WIFI网络(3G无线路由器+sim卡卡托+3G资费卡)
    [转]如何才能更加有效率
    Perl Note
  • 原文地址:https://www.cnblogs.com/Duikerdd/p/11731602.html
Copyright © 2011-2022 走看看