zoukankan      html  css  js  c++  java
  • 网络

    TCP/IP

    TCP连接三次握手四次挥手

    这里写图片描述

    三次握手,其中服务器的ACK 与SYN在一次握手中发出。

    这里写图片描述

    为什么要四次?
    因为服务器的对客户端的FIN进行ACK时,可能此时服务器还有数据要发送给客户端。发完数据后,服务器才给客户端FIN,告知客户端 我发送完毕,你可以关闭了。

    TIME——WAIT

    主动关闭连接的一方就会进入TIME_WAIT状态。
    客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。

    TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:
    1)可靠地实现TCP全双工连接的终止
    TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
    因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

    2)允许老的重复分节在网络中消逝
    TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

    TCP保活机制

    双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据交互的时间段内,交互双方都有可能出现掉电、死机、异常重启等各种意外,当这些意外发生之后,这些TCP连接并未来得及正常释放,那么,连接的另一方并不知道对端的情况,它会一直维护这个连接,长时间的积累会导致非常多的半打开连接,造成端系统资源的消耗和浪费,为了解决这个问题,在传输层可以利用TCP的保活报文来实现。
    作用:
    1, 探测连接的对端是否存活
    2, 防止中间设备因超时删除连接相关的连接表

  • 相关阅读:
    JSP 使用
    Spring MVC 读取静态资源时404错误
    Java及Android开发环境搭建
    堆和栈的区别
    fork Bomb
    Hbase Shell常用命令
    CSS选择器的系统介绍
    JavaScript中的位置坐标
    JavaScript事件
    战略型、战术型
  • 原文地址:https://www.cnblogs.com/lingongheng/p/6444237.html
Copyright © 2011-2022 走看看