zoukankan      html  css  js  c++  java
  • TCP长连接与短连接

    TCP长连接与短连接的区别

    1. TCP连接

    当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的

    经典的三次握手示意图:

    经典的四次握手关闭图:

    2. TCP短连接

    我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在client/server间传递一次读写操作

    短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段

    3.TCP长连接

    接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。Client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

    首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的连接。

    如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

    1. 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
    2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
    3. 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
    4. 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

    从上面可以看出,TCP保活功能主要为探测长连接的存活状况,不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。

    在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。

    长连接和短连接的产生在于client和server采取的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

    参考:

    1. TCP/IP详解 卷一

    TCP/IP通信程序设计的丰富多样性 


    刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 
    序,据此一些人可能会认为TCP/IP编程很简单。其实不然, 
    TCP/IP编程具有较为丰富的内容。其编程的丰富性主要体现在 
    通信方式和报文格式的多样性上。 

    一。通信方式 
    主要有以下三大类: 
    (一)SERVER/CLIENT方式 
    1.一个Client方连接一个Server方,或称点对点(peer to peer): 
    2.多个Client方连接一个Server方,这也是通常的并发服务器方式。 
    3.一个Client方连接多个Server方,这种方式很少见,主要 
    用于一个客户向多个服务器发送请求情况。 

    (二)连接方式 
    1.长连接 
    Client方与Server方先建立通讯连接,连接建立后不断开, 
    然后再进行报文发送和接收。这种方式下由于通讯连接一直 
    存在,可以用下面命令查看连接是否建立: 
    netstat –f inet|grep 端口号(如5678)。 
    此种方式常用于点对点通讯。 

    2.短连接 
    Client方与Server每进行一次报文收发交易时才进行通讯连 
    接,交易完毕后立即断开连接。此种方式常用于一点对多点 
    通讯,比如多个Client连接一个Server. 

    (三)发送接收方式 
    1.异步 
    报文发送和接收是分开的,相互独立的,互不影响。这种方 
    式又分两种情况: 
    (1)异步双工:接收和发送在同一个程序中,有两个不同的 
    子进程分别负责发送和接收 
    (2)异步单工:接收和发送是用两个不同的程序来完成。 
    2.同步 
    报文发送和接收是同步进行,既报文发送后等待接收返回报文。 
    同步方式一般需要考虑超时问题,即报文发上去后不能无限等 
    待,需要设定超时时间,超过该时间发送方不再等待读返回报 
    文,直接通知超时返回。 

    实际通信方式是这三类通信方式的组合。比如一般书上提供的 
    TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的 
    组合是基本不用的,比较常用的有价值的组合是以下几种: 

    同步短连接Server/Client 
    同步长连接Server/Client 
    异步短连接Server/Client 
    异步长连接双工Server/Client 
    异步长连接单工Server/Client 

    其中异步长连接双工是最为复杂的一种通信方式,有时候经 
    常会出现在不同银行或不同城市之间的两套系统之间的通信。 
    比如金卡工程。由于这几种通信方式比较固定,所以可以预 
    先编制这几种通信方式的模板程序。 

    二.报文格式 
    通信报文格式多样性更多,相应地就必须设计对应的读写报文的接 
    收和发送报文函数。 

    (一)阻塞与非阻塞方式  
    1.非阻塞方式 
    读函数不停地进行读动作,如果没有报文接收到,等待一段时间后 
    超时返回,这种情况一般需要指定超时时间。 
    2.阻塞方式 
    如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。 

    (二)循环读写方式 
    1.一次直接读写报文 
    在一次接收或发送报文动作中一次性不加分别地全部读取或全部 
    发送报文字节。 
    2.不指定长度循环读写 
    这一般发生在短连接进程中,受网络路由等限制,一次较长的报 
    文可能在网络传输过程中被分解成了好几个包。一次读取可能不 
    能全部读完一次报文,这就需要循环读报文,直到读完为止。 

    3.带长度报文头循环读写 
    这种情况一般是在长连接进程中,由于在长连接中没有条件能够 
    判断循环读写什么时候结束,所以必须要加长度报文头。读函数 
    先是读取报文头的长度,再根据这个长度去读报文.实际情况中, 
    报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须 
    转换成ASCII,常见的报文头码制有: 
    (1)n个字节的ASCII码 
    (2)n个字节的BCD码 
    (3)n个字节的网络整型码 

    以上是几种比较典型的读写报文方式,可以与通信方式模板一起 
    预先提供一些典型的API读写函数。当然在实际问题中,可能还 
    必须编写与对方报文格式配套的读写API. 

    在实际情况中,往往需要把我们自己的系统与别人的系统进行连接, 
    有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。 

  • 相关阅读:
    【2020NOI.AC省选模拟#5】C. 光滑序列
    【2020NOI.AC省选模拟#2】A. 旋转
    【2020NOI.AC省选模拟#1】B. Trie
    Redis 配置
    Redis 删除策略
    Redis 事务
    Redis 持久化
    Redis 通用指令
    Redis 数据类型实战案例
    Redis sorted_set
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4460598.html
Copyright © 2011-2022 走看看