精华内容
下载资源
问答
  • 协议的使用和配置都是很简单的,大部分情况看完上面的内容基本可以使用了。如果你需要进一步进行精细的控制,比如改变 KCP的内存分配器,或者你需要更有效的大规模调度 KCP链接(比如 3500个以上),或者如何更好的...
  • 服务器应用程序进行简单的时间耗费比较。我们考察一些使用T C P的典型I n t e r n e t应用程 序,看看如果两端都支持T / T C P,将需要做哪些修改。紧接着,简要介绍I n t e r n e t协议族中 事务协议的发展...
  • 服务器应用程序进行简单的时间耗费比较。我们考察一些使用T C P的典型I n t e r n e t应用程 序,看看如果两端都支持T / T C P,将需要做哪些修改。紧接着,简要介绍I n t e r n e t协议族中 事务协议的发展...
  • 服务器应用程序进行简单的时间耗费比较。我们考察一些使用T C P的典型I n t e r n e t应用程 序,看看如果两端都支持T / T C P,将需要做哪些修改。紧接着,简要介绍I n t e r n e t协议族中 事务协议的发展...
  • 3.通过序列化应答和必要时重发数据包,TCP 为应用程序提供可靠的传输流和虚拟连接服务。 下面是找到的长篇大论中比较好的文章: 一、TCP协议 1、TCP 通过以下方式提供可靠性: ◆ 应用程序分割为TCP认为最...
    TCP采用哪些机制来实现可靠数据传输、流控和拥塞控制?
    
    1.采用面向连接的三次握手实现可靠对象传输。
    2.使用数据窗口机制协商队列大小实现数据队列传输。
    3.通过序列化应答和必要时重发数据包,TCP 为应用程序提供了可靠的传输流和虚拟连接服务。
    
    下面是找到的长篇大论中比较好的文章:
    
    一、TCP协议
    
    1、TCP 通过以下方式提供可靠性: 
    
    ◆ 应用程序分割为TCP认为最合适发送的数据块。由TCP传递给IP的信息单位叫做报文段。 
    ◆ 当TCP发出一个报文段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能记时收到一个确认,它 就重发这个报文段。 
    ◆ 当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常延迟几分之一秒。 
    ◆ TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化如果收到报文段的检验和有差错,TCP将丢弃这个报文段和不确认收到这个报文段。 
    ◆ 既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能失序,因此TCP报文段的到达也可能失序。如果必要,TCP将对收到的数据进行排序,将收到的数据以正确的顺序交给应用层。 
    ◆ 既然IP数据报会发生重复,TCP连接端必须丢弃重复的数据。 
    ◆ TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。 
      另外,TCP对字节流的内容不作任何解释。
    
    2、TCP首部:
      TCP数据被封装在一个IP数据报中,格式如下: 
      IP首部20 TCP首部20 TCP首部 
    
    
    TCP首部格式如下: 
      16位源端口号 16位目的端口号 
    32位序号 
    32位确认序号 
    4位首部长度 保留6位 U
    R
    G A
    C
    K P
    S
    H R
    S
    T S
    Y
    N F
    I
    N 16位窗口大小 
    16位检验和 16位紧急指针 
    选项 
    数据 
    
    
    说明:
    (1)每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接。
    (2)序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。
    (3)当建立一个新连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节的序号为这个ISN加1,因为SYN标志使用了一个序号。
    (4)既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当时上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。
    (5)发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
    (6)TCP为应用层提供全双工的服务。因此,连接的每一端必须保持每个方向上的传输数据序号。
    (7)TCP可以表述为一个没有选择确认或否认的华东窗口协议。因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。
    (8)首部长度需要设置,因为任选字段的长度是可变的。TCP首部最多60个字节。
    (9)6个标志位中的多个可同时设置为1
        ◆ URG-紧急指针有效
        ◆ ACK-确认序号有效
        ◆ PSH-接收方应尽快将这个报文段交给应用层
        ◆ RST-重建连接
        ◆ SYN-同步序号用来发起一个连接
        ◆ FIN-发送端完成发送任务
    (10)TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口大小是一个16为的字段,因而窗口大小最大为65535字节。
    (11)检验和覆盖整个TCP报文端:TCP首部和TCP数据。这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。TCP检验和的计算和UDP首部检验和的计算一样,也使用伪首部。
    (12)紧急指针是一个正的偏移量,黄蓉序号字段中的值相加表示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。
    (13)最常见的可选字段是最长报文大小MMS,每个连接方通常都在通信的第一个报文段中指明这个选项。它指明本端所能接收的最大长度的报文段。
    
    二、TCP连接的建立和终止
    
    1、建立连接协议
    (1) 请求端发送一个SYN段指明客户打算连接的服务器的端口,隐疾初始序号(ISN),这个SYN报文段为报文段1。
    (2) 服务器端发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
    (3) 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。
       这3个报文段完成连接的建立,称为三次握手。发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开。
    
    2、连接终止协议
      由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
     (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
     (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
     (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
     (4) 客户段发回确认,并将确认序号设置为收到序号加1(报文段7)。
    
    3、连接建立的超时
       如果与服务器无法建立连接,客户端就会三次向服务器发送连接请求。在规定的时间内服务器未应答,则连接失败。
    
    4、最大报文段长度MSS
      最大报文段长度表示TCP传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的MSS。
    一般,如果没有分段发生,MSS还是越大越好。报文段越大允许每个报文段传送的数据越多,相对IP和TCP首部有更高的网络利用率。当TCP发送一个 SYN时,它能将MSS值设置为外出接口的MTU长度减去IP首部和TCP首部长度。对于以太网,MSS值可达1460。
       如果目的地址为非本地的,MSS值通常默认为536,是否本地主要通过网络号区分。MSS让主机限制另一端发送数据报的长度,加上主机也能控制它发送数据报的长度,这将使以较小MTU连接到一个网络上的主机避免分段。
    
    5、 TCP的半关闭
       TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力,这就是TCP的半关闭。
    客户端发送FIN,另一端发送对这个FIN的ACK报文段。当收到半关闭的一端在完成它的数据传送后,才发送FIN关闭这个方向的连接,客户端再对这个FIN确认,这个连接才彻底关闭。
    
    6、2MSL连接
      TIME_WAIT状态也称为2MSL等待状态。每个TCP必须选择一个报文段最大生存时间(MSL)。它是任何报文段被丢弃前在网络的最长时间。
      处理原则:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2MSL。这样可以让TCP再次发送最后的ACK以避免这个ACK丢失(另一端超时并重发最后的FIN)。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口不能被使用。
    
    7、平静时间
      TCP在重启的MSL秒内不能建立任何连接,这就是平静时间。
    8、FIN_WAIT_2状态
      在FIN_WAIT_2状态我们已经发出了FIN,并且另一端也对它进行了确认。只有另一端的进程完成了这个关闭,我们这端才会从 FIN_WAIT_2状态进入TIME_WAIT状态。这意味着我们这端可能永远保持这个状态,另一端也将处于CLOSE_WAIT状态,并一直保持这个状态直到应用层决定进行关闭。
    9、复位报文段
      TCP首部的RST位是用于复位的。一般,无论合适一个报文端发往相关的连接出现错误,TCP都会发出一个复位报文段。主要情况:
    (1)到不存在的端口的连接请求;
    (2)异常终止一个连接。
    
    10、同时打开
      为了处理同时打开,对于同时打开它仅建立一条连接而不是两条连接。两端几乎在同时发送SYN,并进入SYN_SENT状态。当每一端收到SYN时,状态变为SYN_RCVD,同时他们都再发SYN并对收到的SYN进行确认。当双方都收到SYN及相应的ACK时,状态都变为ESTABLISHED。一个同时打开的连接需要交换4个报文段,比正常的三次握手多了一次。
    
    11、 同时关闭
      当应用层发出关闭命令,两端均从ESTABLISHED变为FIN_WAIT_1。这将导致双方各发送一个FIN,两个FIN经过网络传送后分别到达另一端。收到FIN后,状态由FIN_WAIT_1变为CLOSING,并发送最后的ACK。当收到最后的ACK,状态变为TIME_WAIT。同时关闭和正常关闭的段减缓数目相同。
    
    12、TCP选项
      每个选项的开始是1字节的kind字段,说明选项的类型。 
    
       Kind=1:选项表结束(1字节)   Kind=1:无操作(1字节)   Kind=2:最大报文段长度(4字节)   Kind=3:窗口扩大因子(4字节)   Kind=8:时间戳(10字节)
    三、TCP的超时和重传
    
      对于每个TCP连接,TCP管理4个不同的定时器。
      (1) 重传定时器用于当希望收到另一端的确认。
      (2) 坚持定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口。
      (3) 保活定时器可检测到一个空闲连接的另一端何时崩溃或重启。
      (4) 2MSL定时器测量一个连接处于TIME_WAIT状态的时间。
    
    1、往返时间测量
      TCP超时和重传重最重要的就是对一个给定连接的往返时间(RTT)的测量。由于路由器和网络流量均会变化,因此TCP应该跟踪这些变化并相应地改变超时时间。首先TCP必须测量在发送一个带有特别序号地字节和接收到包含该字节地确认之间的RTT。
    
    2、拥塞避免算法
      该算法假定由于分组收到损坏引起的丢失是非常少的,因此分组丢失就意味着在源主机和目的主机之间的某处网络上发生了阻塞。有两种分组丢失的指示:发生超时和收到重复的确认。拥塞避免算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。
      (1) 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节。
      (2) TCP输出例程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方使用的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。
      (3) 当拥塞发生时,ssthresh被设置为当前窗口大小的一般(cwnd和接收方通告窗口大小的最小值,但最小为2个报文段)。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段。
      (4) 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖与是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。
    
    3、快速重传和快速恢复算法
      如果我们一连串收到3个或以上的重复ACK,就非常可能是一个报文段丢失了。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。
     (1) 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半,重传丢失的报文段,设置cwnd为ssthresh加上3倍的报文段大小。
     (2) 每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送一个1个分组,如果允许的话。
     (3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh,这个ACK应该时在进行重传后的一个往返时间内对步骤1重重传的确认。另外,这个 ACK也应该是对丢失的分组和收到的第一个重复的ACK之间的所有中间报文段的确认。
    
    4、 ICMP差错
      TCP如何处理一个给定的连接返回的ICMP差错。TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。
     (1) 一个接收到的源站抑制引起拥塞窗口cwnd被置为1个报文段大小来发起慢启动,但是慢启动门限ssthresh没有变化,所以窗口将打开直到它开放了所有的通路或者发生了拥塞。
     (2) 一个接收到的主机不可达或网络不可达实际都被忽略,因为这两个差错都被认为是短暂现象。TCP试图发送引起该差错的数据,尽管最终有可能会超时。
    
    5、重新分组:
      当TCP超时并重传时,它并不一定要重传同样的报文段,相反,TCP允许进行重新分组而发送一个较大的报文段。这是允许的,因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认。
    
    四、TCP的坚持定时器
    
       ACK的传输并不可靠,也就是说,TCP不对ACK报文段进行确认,TCP只确认那些包含数据的ACK报文段。为了防止因为ACK报文段丢失而双方进行等待的问题,发送方用一个坚持定时器来周期性地向接收方查询。这些从发送方发出地报文段称为窗口探查。
    
    五、TCP的保活定时器
       如果一个给定的连接在2小时内没有任何动作,那么服务器就向客户发送一个探查报文段。客户主机必须处于以下4个状态之一。
       (1) 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方的正常工作的。服务器在2小时内将保活定时器复位。
       (2) 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务器将不能收到对探查的响应,并在75秒后超时。总共发送10个探查,间隔75秒。
       (3) 客户主机崩溃并已经重新启动。这是服务器将收到一个对其保活探查的响应,但这个响应是一个复位,使得服务器终止这个连接。
      (4) 客户主机正常运行,但是从服务器不可达。
    
    六、TCP的一些性能
    
    1、 路径MTU发现:
      TCP的路径MTU发现按如下方式进行:在连接建立时,TCP使用输出接口或对段声明的MSS中的最下MTU作为其实的报文段大小。路径MTU发现不允许TCP超过对端声明的MSS。如果对端没有指定一个MSS,则默认为536。
      一旦选定了起始的报文段大小,在该连接上的所有被TCP发送的IP数据报都将被设置DF位。如果中间路由器需要对一个设置了DF标志的数据报进行分片,它就丢弃这个数据报,并产生一个ICMP的“不能分片”差错。
      如果收到这个ICMP差错,TCP就减少段大小并进行重传。如果路由器产生的是一个较新的该类ICMP差错,则报文段大小被设置位下一跳的MTU减去 IP和TCP的首部长度。如果是一个较旧的该类ICMP差错,则必须尝试下一个可能的最小MTU。
    
    2、 长肥管道
      一个连接的容量=带宽X时延(RTT)。具有大的带宽时延乘积的网络称为长肥网络(LFN)。一个运行在LFN的TCP连接称为长肥管道。管道可以被水平拉长(一个长的RTT),或被垂直拉高(较高的带宽),或两个方向拉伸。
    
    3、窗口扩大选项:
      窗口扩大选项使TCP的窗口定义从16位增加到32位,这并不是通过修改TCP首部来实现的,TCP首部仍然使用16位,而是通过定义一个选项实现对16位的扩大操作来完成的。
    
    4、时间戳选项:
      时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。
    展开全文
  • 可以快速轻松地开发诸如协议服务器和客户端之类的网络应用程序。它大大简化网络编程流程,如TCP和UDP套接字服务器。 性能 更好的吞吐量, 更低的延迟 资源消耗减少 最小化不必要的内存副本 ne...

    Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架。可以快速轻松地开发诸如协议服务器和客户端之类的网络应用程序。它大大简化了网络编程流程,如TCP和UDP套接字服务器。 性能 更好的吞吐量, 更低的延迟 资源消耗减少 最小化不必要的内存副本 netty可以运用在那些领域?

    1.互联网行业

    典型的应用有:阿里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现各进程节点之间的内部通信。它的架构图如下: 其中,服务提供者和服务消费者之间,服务提供者、服务消费者和性能统计节点之间使用 Netty 进行异步/同步通信。 除了 Dubbo 之外,淘宝的消息中间件 RocketMQ 的消息生产者和消息消费者之间,也采用 Netty 进行高性能、异步通信。

    2.游戏行业

    无论是手游服务端、还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈,非常方便定制和开发私有协议栈。账号登陆服务器、地图服务器之间可以方便的通过 Netty 进行高性能的通信。

    3.大数据领域

    经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨节点通信,它的 Netty Service 基于 Netty 框架二次封装实现。 大数据计算往往采用多个计算节点和一个/N个汇总节点进行分布式部署,各节点之间存在海量的数据交换。由于 Netty 的综合性能是目前各个成熟 NIO 框架中最高的,因此,往往会被选中用作大数据各节点间的通信。

    4.通信行业

    Netty 的异步高性能、高可靠性和高成熟度的优点,使它在通信行业得到了大量的应用。

    2fbf654fc81d4d148b583ddf6b90b461.png

    课程目录 :

    1 bio学习回顾 原理分析主要有哪些缺陷和阻塞点

    2 Java nio学习 回顾主要有哪些缺陷和阻塞点

    3 netty 之Reactor编程模型

    f1f7d9dfd0ba09afb9d0d25ecef4fc3c.png

    4 netty3服务端和客户端编写了 解它的基本编程模型和事件分析。

    5 netty5服务端和客户端编写 了 解它的基本编程模型和事件分析。

    6 netty字符串发送和遇到TCP粘包问题分析和解决方法。

    7 通过固定长度和分隔符解决TCP粘包问题,Netty工具类的介绍

    8 netty自定义消息协议和FrameDecoder讲解,自定义消息协议原理分析。

    9 自定义消息和messagePack流包分析和应用讲解。

    10 关于零拷贝一些知识从DNA到CPU到程序应用层分析,Bytebuf和文件零拷贝方法。

    11 byteBuf和内存管理的一些理论知识点。

    12 protocol序列化与反序列化介绍及JDK序列化比较。protocol应用等。

    13 socketChannel心跳检查和channel组管理介绍。

    14 手写一个基于Netty + Swing MI聊天之 channel Session管理。

    15 手写一个基于Netty + Swing MI聊天及Netty实现。

    16 在netty中实现http服务器和webSocket实现。

    17 项目实战 基于Netty实现一个Rpc 及dubbo原理分析 1

    18 项目实战 基于Netty实现一个Rpc 及原理分析-集成Springboot 客户端和服务器

    19 项目实战 基于Netty实现一个Rpc 及原理分析 -动态代理等原理实现

    20 项目实战 基于Netty实现一个Rpc .

    扩展阅读:https://www.roncoo.com/view/1245965196600606722

    展开全文
  • 计算机网络——TCP/UDP

    2019-07-25 21:29:17
    计算机网络——TCP/UDPTCPTCP报文格式三次握手四次挥手TCP的特点TCP使用了哪些措施保证其可靠性?UDPUDP报文格式UDP的特点 TCP (Transmission Control Protocal)传输控制协议TCP报文格式 源端口: 本地通信...

    TCP

    (Transmission Control Protocal)传输控制协议。

    TCP报文格式

    在这里插入图片描述
    源端口: 本地通信端口,源端口和IP地址的作用是标识报文的返回地址。
    目的端口: 远程通信端口,指明接收方计算机上的应用程序接口。
    序列号: 序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。
    确认号: 即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
    控制位:
    ACK: 确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
    SYN: 请求建立连接。同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
    窗口: 滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。
    校验和: 奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。

    三次握手

    在这里插入图片描述
    (1)Client将标志位SYN置为1,随机产⽣⼀个值seq=x,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
    (2)Server收到数据包后由标志位SYN=1知道Client请求建⽴连接,Server将标志位SYN和ACK都置为1,ack=x+1,随机产⽣⼀个值seq=y,并将该数据包发送给Client以确认连接请求,Server进⼊SYN_RCVD状态。
    (3)Client收到确认后,检查ack是否为x+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=y+1,并将该数据包发送给Server,Server检查ack是否为y+1,ACK是否为1,如果正确则连接建⽴成功,Client和Server进⼊ESTABLISHED状态,完成三次握⼿,随后Client与Server之间可以开始传输数据了。

    四次挥手

    在这里插入图片描述
    由于TCP连接时全双⼯的,因此,每个⽅向都必须要单独进⾏关闭,这⼀原则是当⼀⽅完成数据发送任务后,发送⼀个FIN来终⽌这⼀⽅向的连接,收到⼀个FIN只是意味着这⼀⽅向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这⼀⽅向也发送了FIN。⾸先进⾏关闭的⼀⽅将执⾏主动关闭,⽽另⼀⽅则执⾏被动关闭。

    (1)数据传输结束后,客户端的应⽤进程发出连接释放报⽂段,并停⽌发送数据,客户端进⼊FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。
    (2)服务器接收到FIN后,发送⼀个ACK给客户端,确认序号为收到的序号+1,服务器进⼊CLOSE_WAIT状态。客户端收到后进⼊FIN_WAIT_2状态。
    (3)当服务器没有数据要发送时,服务器发送⼀个FIN报⽂,此时服务器进⼊LAST_ACK状态,等待客户端的确认。
    (4)客户端收到服务器的FIN报⽂后,给服务器发送⼀个ACK报⽂,确认序列号为收到的序号+1。此时客户端进⼊TIME_WAIT状态,等待2MSL(MSL:报⽂段最⼤⽣存时间),然后关闭连接。

    四次挥手为什么要等待2MSL?

    和TCP三次同步握手不一样的是,TCP关闭连接用四次握手来实现,即A—>B Fin, B—>A ACK, B—>A Fin, A—>B ACK,为什么要这样?

    A—>B Fin, B—>A ACK ,A属于主动关闭方,收到B的ACK后,A到B的方向连接关闭,即half shutown ,这时A不能再发送数据了。

    这种状态下B还是可以单向发送数据的,B的数据发送完毕,也做关闭动作了:

    B—>A Fin, A—>B ACK

    B收到ACK,关闭连接。但是A无法知道ACK是否已经到达B,于是开始等待?等待什么呢?假如ACK没有到达B,B会为FIN这个消息超时重传 timeout retransmit ,那如果A等待时间足够,又收到FIN消息,说明ACK没有到达B,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:B的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。

    MSL,Maximum Segment Life,这是TCP 对TCP Segment 生存时间的限制。
    TTL, Time To Live ,IP对IP Datagram 生存时间的限制,255 秒,所以 MSL一般 = TTL = 255秒

    A发出ACK,等待ACK到达对方的超时时间 MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到FIN。

    综上所述,等待2MSL的目的是为了A最后发送的ACK能最终到达B端。

    TCP的特点

    (1)TCP是面向连接的运输层协议。
    (2)每一条TCP连接只能有两个端点。
    (3)TCP提供可靠交付的服务。也就是说通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
    (4)面向字节流。TCP中的“流”指的是**流入到进程或从进程流出的字节序列。**面向字节流的含义是:虽然应用程序和TCP的交互是一次一个的数据块(大小不等),但TCP把应用程序交下来的数据仅仅看成是一连串无结构的字节流,TCP并不知道所传送的字节流的含义。TCP不保证接收方所收到的数据块和发送方所发送的数据块具有对应大小的关系。(例如,发送方交给TCP一共10个数据块,但接收方只用了4个数据块就把接收到的字节流交付给了上层应用)。但接收方收到的字节流必须和发送方发出的字节流完全一样。

    TCP使用了哪些措施保证其可靠性?

    (1)序列号、确认应答、超时重传
    数据到达接收⽅,接收⽅需要发出⼀个确认应答,表⽰已经收到该数据段,并且确认序号会说明
    了它下⼀次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢
    失,也可能是确认应答丢失,这时发送⽅在等待⼀定时间后会进⾏重传。这个时间⼀般是
    2*RTT(报⽂段往返时间)+⼀个偏差值。
    (2)流量控制
    TCP协议提供一种基于动态窗口协议的流量控制机制。在⼀个窗⼝⼤⼩内,不⽤⼀定要等到应答才能发送下
    ⼀段数据,窗⼝⼤⼩就是⽆需等待确认⽽可以继续发送数据的最⼤值。如果不使⽤窗⼝控制,每⼀个没收到确认应答的数据都要重发。
    使⽤滑动窗口协议,如果数据段1001-2000丢失,后⾯数据每次传输,确认应答都会不停地发送序号为1001的应答,表⽰我要接收1001开始的数据,发送端如果收到3次(因为请求重发的应答也可能丢失)相同应答,就会⽴刻进⾏重发;
    (3)拥塞控制
    拥塞控制: 防止过多的数据注入到网络当中,这样可以使网络中的路由器或链路不致过载。
    与流量控制的区别: 流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送数据的速率,以便使接收端来得及接收。
    拥塞控制的几种方法:

    1、慢开始:
    当主机开始发送数据时,如果立即将大量数据字节注入到网络,那么就有可能因为不清楚当前网络的负荷情况而引起网络阻塞。所以,最好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚发送报文段时,先把拥塞窗口cwnd设置为一个最大报文段MSS的数值。而在每收到一个新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口cwnd,可以使分组注入到网络的速率更加合理。
    2、拥塞避免:
    让拥塞窗口cwnd缓慢的增大,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,这样拥塞窗口cwnd按线性规律缓慢的增长,比慢开始算法的拥塞窗口增长速率缓慢的多。
    在这里插入图片描述
    AIMD(加法增大乘法减小)

    a.乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,sthresh置为cwnd的一半,然后开始执行慢启动算法

    b.加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络当中的分组数,而加法增大是执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞。

    这两个结合起来就是AIMD算法,是使用最广泛的算法。拥塞避免算法不能够完全避免网络y拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞。

    一条TCP连接有时会因为等待重传计时的超时而空闲较长时间,慢开始和拥塞避免无法解决这类问题,因此提出了快重传和快恢复的拥塞控制方法。
    3、快重传:
    快重传算法要求首先接收方收到一个失序的报文段后立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认.

    4、快恢复:
    a. 当发送方连续收到三个重复确认时,执行“乘法减小”算法,慢启动门限减半,为了预防网络发生阻塞。
    b. 由于发送方现在认为网络很可能没有发生阻塞,因此现在不执行慢启动算法,而是把cwnd值设置为慢启动门限减半后的值,然后开始执行拥塞避免算法,拥塞窗口cwnd值线性增大。
    在这里插入图片描述

    UDP

    UDP(用户数据报协议)是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

    UDP报文格式

    在这里插入图片描述

    UDP的特点

    (1)UDP是无连接的。
    (2)UDP使用尽最大努力交付。
    (3)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,既不拆分也不合并,而是保留报文的边界。UDP一次交付一个完整的报文,因此应用程序必须选择报文的大小,太长或太短都会降低IP层的效率。
    (4)UDP没有拥塞控制。
    (5)UDP支持多对多的交互通信。
    (6)UDP的效率高,具有较好的实时性。

    TCP和UDP的区别

    区别 TCP UDP
    连接 面向连接 面向非连接
    可靠性 可靠 不可靠
    实时性
    效率
    对系统资源需求
    传输数据 字节流 数据报
    应用场景 效率要求低,准确性要求高。如:文件传输,邮件接收,远程登录等 效率要求高,准确性要求低。如:QQ聊天,在线视频,网络语音、广播通信等
    展开全文
  • 1.应用层负责应用程序之间的交流,这里使用应用层的http协议以及使用位于应用层与传输层之间的ssl/tls协议,请求https ????/xx.io。为数据加上http头(包含请求类型,http版本号,正文长度等)。 2.域名解析,包括:...

    TCP/IP五层模型分为应用层,传输层,网络层,数据链路层以及物理层

    1.应用层负责应用程序之间的交流,这里使用应用层的http协议以及使用位于应用层与传输层之间的ssl/tls协议,请求https://xx.io。为数据加上http头(包含请求类型,http版本号,正文长度等)。

    2.域名解析,包括:

    (1)浏览器缓存(2)本地hosts文件 (3)本地dns服务器(4)根dns服务器(5)顶级dns服务器(6)二级dns服务器

    详细步骤:

    首先查看浏览器缓存是否有相应dns缓存,有的话则直接使用。

    不然就查看系统缓存,系统缓存通过hosts文件来设置。如果存在相应记录则直接使用。

    如果也不存在即向本地dns服务器发送解析请求,如果LDNS存在相应记录,则直接返回对应服务器ip。

    如果LDNS不存在相应记录,则直接向根服务器发送请求,根服务器返回 .io 对应的顶级dns服务器地址

    LDNS请求 .io 对应的顶级dns服务器地址,返回负责xx.io的二级dns服务器地址

    LDNS请求二级dns服务器地址, 二级dns服务器根据映射关系表找到目标ip,返回给LDNS

    LDNS根据TTL值缓存dns记录并返回ip地址给用户

    用户也根据TTL值进行缓存并使用相应IP地址,发送https请求。

    3.传输层负责端于端之间的交流,使用TCP协议,为数据加上了TCP头(包含服务器端口443以及浏览器端口),建立连接需要三次握手。断开连接四次握手。

    建立连接详细步骤:

    客户端发送 syn + seq:0

    服务端回复 ack:1 + syn + seq:0

    客户端发送seq:1 + ack: 1

    (因为要算上syn bit)

    4.网络层负责地址地址管理以及路由选择。使用IP协议。为数据加上IP头(包含客户端ip以及服务端ip)。

    5.数据链路层负责相邻设备之间的数据帧的传输。主要使用以太网帧协议。负责在一段数据的前后分别添加首部和尾部构成了一个帧。(包含本地客户端MAC地址,本地网关MAC地址)

    6.物理层主要负责光电信号的传输,主要使用中继器,集线器以及双绞线等。

    7.服务器接受请求之后五层自下而上一层层剥去头部。被代理服务器nginx或apache等监听到后如果是静态资源则直接返回,动态资源则进行处理再返回。接着重复刚才的加头步骤返回给客户端响应结果以及数据。

    展开全文
  • 概述 由[RFC 768]定义的UDP知识做运输协议能够做的最少工作。除了复用/分解功能及少量的差错检测外,他几乎没有对IP增加别...哪些应用适合使用UDP协议呢? 1.关于何时、发送什么数据的应用层控制更为精细。只要...
  • 首先关闭的是最早的连接,除非使用了“ ip tcp intercept drop-mode random”命令。当所设置的门槛值被超时时,路由器进行下面的动作: 1) 每一个新的连接导致一个最早的(或随机的)连接被删除。 2) 初始的重...
  • 服务器应用程序进行简单的时间耗费比较。我们考察一些使用 T C P的典型I n t e r n e t应用程 序,看看如果两端都支持 T / T C P,将需要做哪些修改。紧接着,简要介绍 I n t e r n e t协议族中 事务协议的...
  • 在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的是应该在系统上实际使用哪些端口以及哪个应用程序正在侦听特定端口。本文介绍如何找出哪些服务上使用哪些端口监听netstat,ss和lsof命令。这些...
  • 在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的事情之一应该是系统上实际使用了哪些端口,以及哪个应用程序正在侦听特定的端口。本文介绍了如何使用netstat,ss和lsof命令找出哪些服务正在侦听...
  • linux如何查看正在使用的端口

    万次阅读 多人点赞 2016-11-15 23:30:12
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下:    -t : 指明显示TCP端口  -u : 指明...
  • linux查看正在使用的端口(转)

    千次阅读 2017-10-24 18:20:30
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放... -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)  -p : 显示进程标识符和程序名称,每一个
  • 答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。 14.CTS、CLS、CLR分别作何解释? 答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 15.什么是装箱和拆箱? 答:从值...
  • 后端笔试题及其解答

    万次阅读 2020-02-29 22:47:36
    1.请基于 TCP/IP 五层网络...1.应用层负责应用程序之间的交流,这里使用应用层的http协议以及使用位于应用层与传输层之间的ssl/tls协议,请求https://pp.io。为数据加上http头(包含请求类型,http版本号,正文长...
  • 后面是IDE设备的类型和硬件参数,TYPE用来说明硬盘设备的类型,我们可以选择AUTO、USER、NONE的工作模式,AUTO是由系统自己检测硬盘类型,在系统中存储1-45类硬盘参数,在使用该设置值时不必再设置其它参数;...
  • Java网络编程之网络基础

    千次阅读 2014-04-04 10:50:11
    运行在网络上的计算或者使用TCP(传输控制协议)或者使用UDP(用户数据报协议)进行通讯,如下图...该包中的类提供系统独立的网络通信,但是在决定程序应该使用哪些Java类时,需要理解TCP和UDP之间的区别。 TCP TC
  • 需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询netstat命令各个参数说明如下:-t:指明显示TCP端口-u:指明显示UDP端口-l:仅显示监听套接字(所谓套接...
  • winpcap驱动及开发包

    2017-12-06 21:33:03
    大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。 这是一种简单的实现方式,因为操作系统已经妥善处理底层具体实现细节(比如协议处理,封装数据包等等),并且提供一个与读写文件类似...
  • Linux如何查看端口状态

    万次阅读 2017-05-07 11:22:05
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下:  -t : 指明显示TCP端口  -u : ...
  • 应用层完成的是应用程序之间的沟通,可以对数据进行解析和封装,表示层主要负责的是数据之间的格式转换,会话层负责建立连接和断开连接,管理网络设备的会话连接,传输层是实际的建立和断开连接,主要的协议TCP ...
  • Linux查看端口状态

    千次阅读 2018-06-02 21:01:15
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口... -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)   -p : 显示进程标识符和程序...
  • linux下常用命令查看端口占用

    千次阅读 2019-01-17 11:31:37
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放... -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)  -p : 显示进程标识符和程序名称,每一...
  • linux查看端口

    2018-02-27 10:53:04
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下:  -t : 指明显示TCP端口  -u : ...
  • linux端口占用

    2018-10-28 11:28:27
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放... -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)  -p : 显示进程标识符和程序名称,每一...
  • netstat查看端口状态

    万次阅读 2016-06-17 15:34:18
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询netstat命令各个参数说明如下: -t : 指明显示TCP端口  -u : 指明显示UDP端口 ...
  • liunx 查看端口号

    2017-06-06 11:11:13
    在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 2 netstat命令各个参数说明如下:  -t : 指明显示TCP端口  -u...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

哪些应用程序使用了tcp协议