• 散装问答-总结(更新中)


    >>只记录自己认为重要的问题,并且简要记录。写多了也记不住,哈哈。
    
    • 1

    一、TCP三次握手/四次握手

    参考博文:博文
    1.1 三次握手
    在这里插入图片描述
    自己描述:

    • 第一次握手:B处于监听状态LISTEN,A发送同步请求SYN=1(序列号x),进入同步发送状态SYN-SENT。
    • 第二次握手:B收到请求,返回同步响应SYN=1,ACK=1(确认号x+1,序列号y),进入同步已接收状态SYN-RCVD。
    • 第三次握手:最后,A再回一个应答ACK=1(确认号y+1,序列号x+1)。这样,双发都进入了已建立连接状态ESTAB-LISHED。

    1.2 四次握手
    在这里插入图片描述
    自己描述:

    • 第一次握手:双方都处于已建立连接状态时,A发送终止请求FIN=1(序列号u),进入终止等待1状态FIN-WAIT-1。
    • 第二次握手:B收到请求,先返回应答ACK=1(确认号u+1,序列号v),进入关闭等待状态CLOSE-WAIT。
    • 第三次握手:B处理完手头工作后,返回终止响应FIN=1,ACK=1(确认号u+1,序列号w),进入最后确认状态LAST-WAIT。
    • 第四次握手:最后,A再回一个应答ACK=1(确认号w+1,序列号u+1),进入时间等待状态TIME-WAIT。

    2MSL:是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间

    1.3 常见问题

    1、为什么连接的时候是三次握手,关闭的时候却是四次握手?
    答:不同之处在于第二次握手
    建立连接时,SYN+ACK报文一起发送,ACK报文是用来应答的,SYN报文是用来同步的。
    关闭连接时,只能先回复一个ACK报文,等Server的报文都发送完了,我才能发送FIN报文。

    2、为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
    答:用来重发可能丢失的ACK报文。
    Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。

    3、为什么不能用两次握手进行连接?
    答:3次握手完成两个重要的功能:既要双方做好发送数据的准备工作,也要初始序列号在握手过程中被发送和确认

    4、如果已经建立了连接,但是客户端突然出现故障了怎么办?
    答:TCP的服务器端还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 相关阅读:
    spring框架Bean的作用域?对需要保持会话状态的bean应使用prototype作用域?为啥?
    【可转债,股票】低频量化数据
    设计模式之美——DRY原则 和 迪米特法则
    UDP协议
    PHP基于thinkphp的在线教学网站#毕业设计
    【Vue3】自定义指令
    transition过渡
    线上慎用 BigDecimal
    flink1.15.0消费kafka 报错 The coordinator is not available.
    Java 中项目路径映射物理机磁盘路径配置。
  • 原文地址:https://blog.csdn.net/qq_41753052/article/details/126150240