一种基于发送窗口与往返时间的tcp发送算法的制作方法

文档序号:7887785阅读:162来源:国知局
专利名称:一种基于发送窗口与往返时间的tcp发送算法的制作方法
技术领域
本发明涉及网络通信TCP协议,具体地说,涉及对于现有TCP发送算法的改进。
背景技术
TCP是目前应用最为广泛的传输控制协议,发送算法做为其重要组成部分,确保了互联网的鲁棒性。发送算法目标是最大程度利用网络带宽,同时控制拥塞,确保网络鲁棒性。
网络产生拥塞的根本原因在于用户提交给网络的负载大于网络资源节点容量和处理能力。拥塞发生时,网络系统会表现出数据包时延增加、丢弃概率增大、上层应用系统性能下降等。
拥塞产生的直接原因有以下3点1.存储空间不足。存储空间并不是越大越好,但现实的情况往往是当若干个数据流在同一个端口建立排队时,后来的数据会因为存储空间不足而被丢弃。在处理突发数据流时,这样的情况更为常见和明显。2.带宽容量不足。低速链路对高速数据流的输入会产生拥塞。根据香农信息理论,任何信道带宽最大值即信道容量C=Blog2(1+S/N)(N为信道白噪声的平均功率,S为信源节点的平均功率,B为信道带宽)。所有信源节点发送的速率R必须小于或等于信道容量C。如果R>C,则在理论上无差错传输就是不可能的,所以在网络低速链路处就会形成带宽瓶颈,当其满足不了通过它的所有源节点端带宽要求时,网络就会发生拥塞。3.处理器处理能力弱、速度慢。如果路由器的CPU在执行排队缓存、更新路由表等功能时,处理速度无法与高速链路匹配,则会形成传输瓶颈,从而发生拥塞。
简言之,拥塞是网络系统各部分数据传输和处理能力不匹配的结果。而随着网络规模的膨胀和复杂度的增加,要求一个数据流传输过程中涉及的各个部分达到完全匹配是几乎不可能实现的。对于频繁发生的数据传输业务,这样的匹配就完全不可能实现。因此,拥塞是不可完全避免的。而拥塞一旦发生往往会形成一个不断加重过程。如果路由器没有空余的缓存,它就必须丢弃新到的数据包。当数据包丢弃时,源节点端会超时、重传该包。由于没有得到确认,源节点端只能保留数据包,结果缓存会进一步消耗,加重拥塞。因此,采用合理的算法与机制确保网络不因传入数据流过大耗尽网络资源节点而导致崩溃就成为极为重要的工作。这就是一般意义上的拥塞控制。可以这样说,没有拥塞控制就不可能有今天Internet的飞速发展,也就不可能有上层的各种应用。
拥塞控制的方法,可归为两类开环和闭环控制。开环控制是在事先设计一个“好的”网络,确保它不发生拥塞,而网络一旦运行起来,就不再采取措施。显然对网络这样不断变化的复杂系统,开环控制并不是理想的选择。目前Internet实际使用的拥塞控制基本上是建立在TCP的窗口控制基础之上的。TCP基于窗口的端到端的拥塞控制对于Internet的鲁棒性起到了关键作用。这是一种端到端的闭环控制,由4个核心部分组成1988年Van Jacobson提出的“慢启动”(Slow Start)、“拥塞避免”(Congestion Avoidance)算法以及1990年提出的“快速重传”(Fast Retransmit)、“快速恢复”(Fast Recovery)算法。这四个算法通过控制一些重要参数的改变而实现对拥塞的控制。这些参数主要有拥塞窗口(源节点端在拥塞控制情况下一次最多能发送数据包的数量)、通告窗口(接收端给源节点端预设的发送窗口大小)、发送窗口(源节点端每次实际发送数据的窗口大小)以及回路响应时间和几个阈值。这四种算法基本涵盖了各种拥塞的情况,在长时间内被广泛的采用。最近几年,这些算法进行了一些局部的改进,形成了一些新的版本。
TCP拥塞控制算法也存在一些问题,主要表现在以下方面1.建立算法所依赖的泊松分布模型不能完全准确反映数据业务的统计性质。2.控制算法的公平性问题。面向连接的TCP和无连接的UDP在拥塞发生时对拥塞指示的不同反应和处理,从而导致对网络资源节点的不公平使用问题。一些TCP连接之间也存在公平性问题(competing TCP)。产生问题的原因在于一些TCP在拥塞前使用了大窗口尺寸,或者它们的RTT较小,或者数据包比其他TCP的大,这样导致它们也会多占带宽。网络资源节点分配的不公平反过来会加重拥塞情况,甚至可能导致拥塞崩溃(congestion collapse),所以研究如何判断在拥塞发生时各个数据流是否严格遵守了TCP拥塞控制(TCP-friendly),以及如何“惩罚”不遵守拥塞控制协议(not TCP-friendly)的行为,成了目前研究拥塞控制的一个热点领域。解决TCP拥塞控制公平性问题的根本出路在于Internet上全面实行端到端拥塞控制和融合了IP层拥塞控制的新算法。
许多学者提出了TCP改进机制,这些方案可分为基于基站和基于端到端两大类。但目前的研究重点大多集中在基于端到端的改进方案,这些方案包括1)研究丢包的原因,达到区分无线链路差错丢包和有线链路网络拥塞目的;2)考虑分组延迟、误码等多种因素之间的相互作用,避免发送端进行不必要的分组重传,在不恰当的时候启动拥塞控制机制;3)改善拥塞控制算法,使之应用于存在大量分组丢失及多变的无线环境时,仍具有较强的顽健性。为此,Floyd提出在网络层的IP结构中加入ECN(explicit congestion notification)标志,指示将发生拥塞。TCP Westwood通过修改发送方拥塞窗口的算法,来改善有线及无线环境下TCP Reno的性能。Eifel算法消除了意义不明的重发,解决了由虚假超时和虚假快速重发所引起的问题,提出了基于误码丢包的速率调节机制,根据无线链路丢包情况获取通信链路的误码率,在误码率上升时降低发送速率,反之则提高发送速率,在保证可靠性的基础上提高TCP的吞吐率。MAITE使用链路层信息通知TCP高误码产生和链路断开。
上述多项研究或者基于非TCP协议实现,如TFRC(TCP友好拥塞控制算法)针对其他非传统TCP应用以及基于IP层拥塞控制,将上述算法应用于TCP协议需要将TCP协议进行二次封装,一方面涉及到与现有协议兼容性,另外一方面会影响TCP协议充分利用网络带宽。
而基于TCP的拥塞算法改进则集中于何时启动拥塞控制算法以及如何改进发送方拥塞窗口的计算。
我们的研究分析表明,如何改进发送方拥塞窗口的计算是改进拥塞控制算法重要的一方面,但如果仅仅改进发送方拥塞窗口计算方法并不能满足拥塞控制要求。拥塞窗口实际上侧重于网络交换节点存储空间的限制,比如在网络上可以有多少个数据包被缓存于网络节点直至到达目的端,而对网络交换节点中带宽容量不足和处理器性能不足未加考虑。
现有TCP发送算法在会话发送窗口范围内有大量数据需要发送情况下,会将发送窗口范围内数据封装成多个数据包,在极短时间内全部发送出去,其数据包间的发送时间间隔基本上是TCP发送算法封装一个数据包所需要花费的时间。
现有发送算法存在三方面问题(一)造成网络流量抖动,易于形成拥塞,降低网络带宽利用效率。
如果应用层向TCP会话提交了大量数据,现有发送算法会在发送窗口范围内一次生成多个数据包,在极短时间内发送出去,然后等待对端确认。在此期间,不会发送数据包。接收到对端的确认数据包后(常常是对多个数据包的确认),或者对端应用层一次读取大量数据(很多情况下是这样)通告窗口加大后,再次一次性生成多个数据包,并在极短时间内发送到网络,然后再次等待。即会话的网络流量在突发流量和空闲之间抖动,从而易于造成网络拥塞,降低网络带宽利用效率。
(二)无法实时响应拥塞控制请求在现有发送算法下,发生拥塞后,拥塞窗口减小导致发送窗口减小,如果此时会话在发送窗口范围内有多个数据包要发送,依然会在极短时间内封装并发出多个数据包,只有在发送窗口范围内的数据包全部发送出去后,才会等待对端确认而降低发送速率,从而在网络拥赛情况下,未能实时降低发送速率,缓解网络流量压力。
(三)无法及时准确感知网络状况,适时调整发送速率现有发送算法只有在已经发生丢包情况下才能感知出已经发生拥塞,从而一定程度上调整发送速率。无法在尚未丢包情况下,感知网络状况,适时调整发送速率。
在此之前,TCP发送算法存在的问题未引起足够重视的主要原因是TCP发送算法封装数据包需要一定时间,一次发送大量数据时在多个数据包间形成了自然的时间间隔,该时间间隔基本为TCP发送算法封装一个数据包所需要花费的时间。在终端设备如PC性能较低的情况下,上述多个数据包间的时间间隔较大,从而对网络交换节点的资源要求不是很高,抖动和拥塞现象不是很严重。随着终端处理性能提升,特别是通过逻辑电路实现TCP协议栈技术的出现以及并行处理技术的应用,终端设备可以以极短的时间间隔生成多个数据包,或者采用封装数据包与发送数据包并行处理的技术,以极短的时间间隔将多个数据包发送到网络上,从而容易形成抖动与拥塞。
从以上分析可知,在网络终端设备采用新的软硬件技术,处理性能大幅度提高的情况下,寻找新的发送算法以保障互联网鲁棒性是迫在眉睫的需求。

发明内容
本发明的目的是针对现有TCP发送算法在的问题,提出一种基于发送窗口与往返时间的TCP发送算法。该算法是对于现有TCP发送算法的改进,能够降低网络流量抖动,实时准确感知网络状况及时调整发送速率,减低拥塞发生几率,同时保证TCP会话实时响应拥塞控制请求,从而提高网络带宽利用效率,增强网络鲁棒性,并与现有TCP协议完全兼容,便于推广应用。
本发明解决其技术问题所采用的技术方案采取两个步骤在TCP会话发送窗口范围内有大量数据需要发送,一次生成多个数据包情况下,根据TCP会话发送窗口与报文往返时间计算出发送数据包的时间间隔;按照上述时间间隔将生成的多个数据包依次发送出去。
根据TCP会话发送窗口与报文往返时间计算发送数据包时间间隔,算法可以采用最简单的计算方式报文往返时间/(发送窗口/最大报文长度),也可以采用其他的算法。凡是基于会话发送窗口与报文往返时间计算发送数据包时间间隔的算法,均在本专利保护范围内。
该算法能够平滑网络流量,降低网络流量抖动。分析如下由于TCP会话能够达到的最大带宽为发送窗口/报文往返时间。在该算法下,如果采用“报文往返时间/(发送窗口/最大报文长度)”计算发送时间间隔,恰可以达到TCP最大发送带宽。该发送算法在有大量数据需要发送情况下,能够按照上述时间间隔在报文往返时间内将发送窗口内的多个数据包平滑地发送到网络。在发送窗口增大情况下(如对端一次确认多个数据包,或者对端应用层一次读取大量数据),也通过发送窗口变化减小发送时间间隔,高效而平滑的将发送窗口范围内的数据发送到网络,从而降低网络流量抖动。
该算法能够实时准确感知网络状况,及时调整发送速率。分析如下该算法通过发送窗口与报文往返时间两个参数,对网络链路上节点设备存储空间与处理性能准确感知。在尚未发生拥塞丢包,而网络链路上节点设备处理压力较大情况下,通过报文往返时间增大这一现象感知出网络处理能力紧张,主动增大发送数据包时间间隔,降低发送速率,缓解网络压力,减小拥塞几率。
该发送算法能够实时响应拥塞控制。分析如下在发生拥塞,拥塞控制窗口减小时,计算出的发送时间间隔会增大,会立即降低该会话数据包发送速率,从而实时响应拥塞控制机制,降低该会话发包速率,减低拥塞。
除上述三点之外,本算法减低发送数据包抖动,从空间(拥塞控制窗口)与时间(报文往返时间)两方面评估网络状况,有助于统计意义上更准确估计拥塞窗口,使之更能反映会话链路上网络节点存储与处理能力资源状况,从而提高网络利用效率。
该算法基于发送窗口与报文往返时间调整数据包发送时间间隔,可以与不断改进的拥塞窗口计算方法完全兼容,将改进后拥塞窗口计算方法计算出的发送窗口值代入时间间隔计算公式即可,就可以获得改进后拥塞窗口计算方法所带来的收益;该算法与现有TCP协议完全兼容,并且可以与“慢启动”、“拥塞避免”、“快速重传”、“快速恢复”等算法以及选择确认(SACK)机制协同工作。
本发明的有益效果是,能够降低网络流量抖动,实时准确感知网络状况及时调整发送速率,减低拥塞发生几率,同时保证TCP会话实时响应拥塞控制请求,从而提高网络带宽利用效率,增强网络鲁棒性。
具体实施例方式
TCP发送算法包括会话发送处理例程,全局发送处理例程,时间间隔定时器,会话发送队列,会话发送队列信息表以及全局发送队列。会话发送处理例程和全局发送处理例程可以并行运行。
会话发送处理例程按照TCP规范封装数据包,根据发送窗口与报文往返时间计算时间间隔,将生成的多个数据包组成会话送队列,维护会话发送队列信息表,将该会话发送队列挂入相应时间间隔的全局发送队列,并在发送窗口或报文往返时间发生变化情况下,在会话发送队列信息表中做标记。
时间间隔定时器在特定时间间隔触发全局发送处理例程工作,全局发送处理例程遍历其本次触发对应的全局发送队列中的节点,将每个节点所对应的会话发送队列的第一个数据包发送出去,并更新会话发送队列信息表。如果会话发送队列信息表表明该会话队列所对应的时间间隔已经发生变化,则将该会话队列从本全局发送队列中取出,加挂到相应时间间隔的全局发送队列中。本队列全部节点遍历完成后,进入空闲状态。在空闲状态,检查实时发送队列是否有数据包等待发送,如果有则将实时发送队列的数据包全部发送出去发,然后等待时间间隔定时器下一次触发。
时间间隔定时器时间间隔可以以10微秒为最小单位,以10微秒为最小时间间隔,以1毫秒为最大时间间隔,从10微秒到1毫秒共100个时间间隔。定时器在相应的时间间隔触发全局发送处理例程,启动相应全局发送队列数据包发送。也可以采用其它的时间间隔最小单位,最小时间间隔和最大时间间隔。
会话发送处理例程为每个会话维护一个会话发送队列以及会话发送队列信息表。会话发送队列由该会话等待发送的多个数据包组成。会话发送队列信息表每一项包括会话发送队列头指针、会话发送队列尾指针、该发送队列所属全局发送队列信息,以及该会话的数据包发送时间间隔是否已经发生变化的标志。会话发送处理例程与全局发送处理例程对于该表的访问采取互斥机制。
每一个时间间隔对应一个全局发送队列。该队列每一个节点的指针指向会话发送队列信息表,从而可以获取加挂在本队列上的会话发送队列信息。会话发送处理例程与全局发送处理例程对于本队列的访问采取互斥机制。
具体实现方式如下(一)数据包发送时间间隔计算可以有多种基于TCP协议发送窗口与报文往返时间计算数据包发送时间间隔的算法,本具体实施方式
仅列出最简单的一种,其他基于TCP协议发送窗口与报文往返时间计算数据包发送时间间隔的方法也在本专利保护范围内。
数据包发送时间间隔如下计算S=RTO/(snd_cwnd/t_maxseg)。其中S是数据包发送时间间隔,snd_cwnd是发送窗口,t_maxseg是最大报文长度,RTO是往返时间,其精度可以是毫秒,微秒或者其他时间度量单位。
(二)在会话发送处理例程中,按照如下步骤处理1)按照现有TCP规范封装数据包。在只生成一个数据包,并且该会话没有等待发送的数据包情况下,将该数据包加挂到实时发送队列,完成处理例程。否则根据发送窗口与往返时间计算出发送时间间隔。如果该间隔小于10微秒,则记为实时发送。如果该间隔大于1毫秒,则记为1毫秒。间隔时间在此之间的会话则以10微秒为单位,向下靠齐计算,如间隔为12微秒则记为间隔为10微秒。
2)将所生成的数据包组成等待发送队列,可能存在只有一个数据包的情况。
3)如果此时本会话发送队列为空,即会话发送队列信息表显示该会话发送队列头指针为零,则将第一个数据包放入实时发送队列,将第二个数据包开始后的等待发送队列加挂入相应时间间隔的全局发送队列4)如果此时本会话发送队列不为空,即会话发送队列信息表显示该会话发送队列头指针不为零,将本次处理生成的等待发送队列加挂到本会话发送队列尾部。并判断本次计算的时间间隔与本会话发送队列的时间间隔是否一致,如果一致则完成处理例程,否则在会话发送队列信息表中标记本会话发送队列需要更改时间间隔。
(三)在全局发送处理例程中,按照如下步骤处理
1)空闲状态下,随时检查实时发送队列,将该队列中所有数据包发送出去。
2)时间间隔定时器触发全局发送处理例程,找到对应的全局发送队列,若为空,则进入1)空闲状态。若不为空,取出其中的节点,该节点有指针指向会话发送队列信息表,从中取出相应会话发送队列第一个数据包,发送出去,并修改会话发送队列信息表中相应信息。若该数据包是会话发送队列最后一个数据包,则删除全局发送队列中的当前节点,否则进入步骤3)。
3)如果会话发送队列信息表信息表明该会话最新计算的发送时间间隔与当前时间间隔发不一致,则将该会话发送队列从本全局发送队列取出,并加挂到相应时间间隔的全局发送队列,否则进入步骤4)。
4)依次对当前全局发送队列的下一个节点实施2),3)步操作,直到遍历本全局发送队列后,进入1)空闲状态。
由于TCP会话的发送窗口与往返时间会随时变化,在上述参数发生变化,且该会话发送队列不为空,且在发送队列对应的时间间隔与本次计算得出时间间隔不一致情况下,会话发送处理例程会在会话发送队列信息表中标记该会话队列需要调整到相应时间间隔隔的全局发送队列。全局发送队列在发送出去该会话发送队列的第一个数据包之后,进行调整。该机制能够避免时间间隔变化频繁,会话发送队列频繁调整导致影响数据发送。
鉴于该算法报文对报文往返时间记时精度,全局发送队列定时器精度以及并行运算处理能力要求较高,目前可以由专门的TCP协议栈处理芯片通过逻辑电路实现,随着计算机技术发展软件处理能力不断提高,也可以通过软件实现。
权利要求
1.一种基于发送窗口与往返时间的TCP发送算法,包括如下步骤在TCP会话发送窗口范围内有大量数据需要发送,一次生成多个数据包情况下,根据TCP会话发送窗口与报文往返时间计算出发送数据包的时间间隔;按照上述时间间隔将生成的多个数据包依次发送出去。
2.根据权利要求1所述的基于发送窗口与往返时间的TCP发送算法,其特征在于,基于TCP会话发送窗口与报文往返时间计算数据包发送时间间隔。
3.根据权利要求2所述的基于发送窗口与往返时间的TCP发送算法,其特征在于,发送数据包的时间间隔计算公式S=RTO/(snd_cwnd/t_maxseg)式中S是会话数据包发送时间间隔,snd_cwnd是发送窗口,t_maxseg是最大报文长度,RTO是往返时间,其精度可以是毫秒,微秒或者其它时间度量单位。
4.根据权利要求1所述的基于发送窗口与往返时间的TCP发送算法,其特征在于,TCP发送算法包括会话发送处理例程,全局发送处理例程,时间间隔定时器,会话发送队列,会话发送队列信息表以及全局发送队列,会话发送处理例程和全局发送处理例程可以并行运行;会话发送处理例程按照传统TCP发送算法封装数据包,根据发送窗口与报文往返时间计算时间间隔,将生成的多个数据包组成会话送队列,维护会话发送队列信息表,将该会话发送队列挂入相应时间间隔的全局发送队列,并在发送窗口或报文往返时间发生变化情况下,在会话发送队列信息表中做一标记;时间间隔定时器在特定时间间隔触发全局发送处理例程工作,全局发送处理例程遍历其本次触发对应的全局发送队列中的节点,将每个节点所对应的会话发送队列的第一个数据包发送出去,并更新会话发送队列信息表,如果会话发送队列信息表表明,该会话队列所对应的时间间隔已经发生变化,则将该会话队列从本全局发送队列中取出,加挂到相应时间间隔的全局发送队列中,本队列全部节点遍历完成后,进入空闲状态,在空闲状态,检查实时发送队列是否有数据包等待发送,如果有则将实时发送队列的数据包全部发送出去发,然后等待时间间隔定时器下一次触发;时间间隔定时器时间间隔可以以10微秒为最小单位,以10微秒为最小时间间隔,以1毫秒为最大时间间隔,从10微秒到1毫秒共100个时间间隔。定时器在相应的时间间隔触发全局发送处理例程,启动相应全局发送队列数据包发送,也可以采用其它的时间间隔最小单位,最小时间间隔和最大时间间隔;会话发送处理例程为每个会话维护一个会话发送队列以及会话发送队列信息表,会话发送队列由该会话等待发送的多个数据包组成,会话发送队列信息表每一项包括会话发送队列头指针、会话发送队列尾指针、该发送队列所属全局发送队列信息,以及该会话的数据包发送时间间隔是否已经发生变化的标志,会话发送处理例程与全局发送处理例程对于该表的访问采取互斥机制;每一个时间间隔对应一个全局发送队列,该队列每一个节点的指针指向会话发送队列信息表,从而可以获取加挂在本队列上的会话发送队列信息;会话发送处理例程与全局发送处理例程对于本队列的访问采取互斥机制。
5.根据权利要求4所述的基于发送窗口与往返时间的TCP发送算法,其特征在于,所述的会话发送处理例程,按照如下步骤处理1)按照现有TCP规范封装数据包,在只生成一个数据包,并且该会话没有等待发送的数据包情况下,将该数据包加挂到实时发送队列,完成处理例程,否则根据发送窗口与往返时间计算出发送时间间隔。如果该间隔小于1 0微秒,则记为实时发送,如果该间隔大于1毫秒,则记为1毫秒,间隔时间在此之间的会话则以10微秒为单位,向下靠齐计算,如间隔为12微秒则记为间隔为10微秒;2)将所生成的数据包组成等待发送队列,可能存在只有一个数据包的情况;3)如果此时本会话发送队列为空,即会话发送队列信息表显示该会话发送队列头指针为零,则将第一个数据包放入实时发送队列,将第二个数据包开始后的等待发送队列加挂入相应时间间隔的全局发送队列;4)如果此时本会话发送队列不为空,即会话发送队列信息表显示该会话发送队列头指针不为零,将本次处理生成的等待发送队列加挂到本会话发送队列尾部,并判断本次计算的时间间隔与本会话发送队列的时间间隔是否一致,如果一致则完成处理例程,否则在会话发送队列信息表中标记本会话发送队列需要更改时间间隔。
6.根据权利要求4所述的基于发送窗口与往返时间的TCP发送算法,其特征在于,所述的全局发送处理例程,按照如下步骤处理1)空闲状态下,随时检查实时发送队列,将该队列中所有数据包发送出去;2)时间间隔定时器触发全局发送处理例程,根据本次触发时间间隔,找到对应的全局发送队列,若为空,进入1)空闲状态,若不为空,取出其中的节点,该节点有指针指向会话发送队列信息表,从中取出相应会话发送队列第一个数据包,发送出去,并修改会话发送队列信息表中相应信息,若该数据包是会话发送队列最后一个数据包,则删除全局发送队列中的当前节点否则进入步骤3);3)如果会话发送队列信息表信息表明该会话最新计算的发送时间间隔与当前时间间隔发不一致,则将该会话发送队列从本全局发送队列取出,并加挂到相应时间间隔的全局发送队列,否则进入步骤4);4)依次对当前全局发送队列的下一个节点实施2),3)步操作,直到遍历本全局发送队列后进入1)空闲状态。
全文摘要
本发明公开一种基于发送窗口与往返时间的TCP发送算法,包括如下步骤在TCP会话发送窗口范围内有大量数据需要发送,一次生成多个数据包情况下,根据TCP会话发送窗口与报文往返时间计算出发送数据包的时间间隔;按照上述时间间隔将生成的多个数据包依次发送出去。该算法是对于现有TCP发送算法的改进,能够降低网络流量抖动,实时准确感知网络状况及时调整发送速率,减低拥塞发生几率,同时保证TCP会话实时响应拥塞控制请求,从而提高网络带宽利用效率,增强网络鲁棒性,并与现有TCP协议完全兼容,便于推广应用。
文档编号H04L12/56GK101052043SQ200710098968
公开日2007年10月10日 申请日期2007年4月30日 优先权日2007年4月30日
发明者林伟 申请人:北京策度集成电路设计有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1