• TCP长连接短连接


    TCP在真正的读写操作之前,server与client之间必须建立一个连接,

    当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,

    连接的建立通过三次握手,释放则需要四次握手,

    所以说每个连接的建立都是需要资源消耗和时间消耗的。

    1. TCP短连接

    模拟一种TCP短连接的情况:

    1. client 向 server 发起连接请求
    2. server 接到请求,双方建立连接
    3. client 向 server 发送消息
    4. server 回应 client
    5. 一次读写完成,此时双方任何一个都可以发起 close 操作

    在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

    2. TCP长连接

    再模拟一种长连接的情况:

    1. client 向 server 发起连接
    2. server 接到请求,双方建立连接
    3. client 向 server 发送消息
    4. server 回应 client
    5. 一次读写完成,连接不关闭
    6. 后续读写操作...
    7. 长时间操作之后client发起关闭请求

    3. TCP长/短连接操作过程

    3.1 短连接的操作步骤是:

    建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接

    3.2 长连接的操作步骤是:

    建立连接——数据传输...(保持连接)...数据传输——关闭连接

    4. TCP长/短连接的优点和缺点

    • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。

    • client与server之间的连接如果一直不关闭的话,会存在一个问题,

      随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,

      如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;

      如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,

      这样可以完全避免某个蛋疼的客户端连累后端服务。

    • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段
    • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。

    5. TCP长/短连接的应用场景

    • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。

      每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,

      再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,

      再次处理时直接发送数据包就OK了,不用建立TCP连接。

      例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,

      而且频繁的socket 创建也是对资源的浪费。

    • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,

      而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,

      如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,

      那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

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

     示意图:

    长连接

           所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。      

          连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信); 


          这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;

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

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

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

    短连接

          短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);

         连接→数据传输→关闭连接;

    应用场景:

         长连接多用于操作频繁(读写),点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

         而像WEB网站的http服务一般都用短链接(http1.0只支持短连接,1.1keep alive 带时间,操作次数限制的长连接),因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好;

         在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

    发送接收方式

    1、异步 


    报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况: 


    (1)异步双工:接收和发送在同一个程序中,由两个不同的子进程分别负责发送和接收 


    (2)异步单工:接收和发送是用两个不同的程序来完成。 


    2、同步 
    报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

    在长连接中一般是没有条件能够判断读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读相应长度的报文。

    单工、半双工和全双工

    根据通信双方的分工和信号传输方向可将通信分为三种方式:单工、半双工与全双工。在计算机网络中主要采用双工方式,其中:局域网采用半双工方式,城域网和广域网采用全双年方式。  

    1. 单工(Simplex)方式:通信双方设备中发送器与接收器分工明确,只能在由发送器向接收器的单一固定方向上传送数据。采用单工通信的典型发送设备如早期计算机的读卡器,典型的接收设备如打印机。 

     

    2. 半双工(Half Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以相互传送数据,但某一时刻则只能向一个方向传送数据。例如,步话机是半双工设备,因为在一个时刻只能有一方说

    话。  

    3. 全双工(Full Duplex)方式:通信双方设备既是发送器,也是接收器,两台设备可以同时在两个方向上传送数据。例如,电话是全双工设备,因为双方可同时说话。

    五、报文格式:

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

    阻塞与非阻塞方式

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

    循环读写方式

    1、一次直接读写报文:在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。
    2、不指定长度循环读写:这一版发生在短连接进程中,受网络路由等限制,一次较长的报文可能
    在网络传输过程中被分解成很多个包,一次读取可能不能全部读完一次报文,这就需要循环读取报文,
    知道读完为止。
    3、带长度报文头循环读写:这种情况一般在长连接中,由于在长连接中没有条件能够判断循环读写什么时候结束。
    必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文,实际情况中,报头码制格式还经常不一样,
    如果是非ASCII的报文头,还必须转换成ASCII常见的报文头编制有:
    1、n个字节的ASCII码。
    2、n个字节的BCD码。
    3、n个字节的网络整型码。

    以上是几种比较典型的读写报文方式,可以与通信方式模板一起 预先提供一些典型的API读写函数。

    当然在实际问题中,可能还必须编写与对方报文格式配套的读写API. 在实际情况中,往往需要

    把我们自己的系统与别人的系统进行连接, 有了以上模板与API,可以说连接任何方式的通信程序

    都不存在问题。

  • 相关阅读:
    消息中间件三、RabbitMQ学习一
    消息队列学习一 概念
    发送网络请求调用第三方接口(spring boot框架)
    动态生成javaBean
    达梦dm数据库远程备份与恢复
    springboot定时任务的使用
    抽象与接口
    电商网站后台九大功能模块详解
    面向对象设计—类和对象
    常用的数据结构—数组
  • 原文地址:https://www.cnblogs.com/chengxuyonghu/p/13607124.html
Copyright © 2020-2023  润新知