netty4的udp服务端怎么是单线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了netty4的udp服务端怎么是单线程相关的知识,希望对你有一定的参考价值。

参考技术A 查看网络连接 再看宽带连接的属性 →高级→windows防火墙设置→例外→upnp框架 打钩 然后断开宽带连接 再连上 就能玩了 我就是这样

Netty理论四:TCP vs UDP

参考技术A

从数据结构上可以看出来,TCP比UDP要复杂的多。

我们上面说tcp是面向连接的,这是啥意思呢,简单的说,tcp要发送数据,首先得先建立连接,而udp不需要,直接发送数据就行了。

TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息。
而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工。

为什么采用三次握手?而不是二次?
是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误;比如有以下场景,当客户端发出第一个
连接请求1并没有丢失,而是在某些网络节点长时间滞留了,这时客户端会认为超时,会再次发送连接请求2,服务端在接收到连接请求2以后建立了正常的连接,这时候失效请求1又到达了服务端,服务端会误以为是客户端又发出的一个连接请求,于是会再次建立连接,假定不采用三次握手,那服务端发出确认,新的连接就建立了。但是由于客户端并没有发出新的建立连接的请求,因此客户端不会再新的连接上发送数据,而服务端却以为新的连接已经建立了,在一直等待客户端的数据,由此会导致服务端许多资源的浪费。采用了三次握手后,可以防止这个现象发生,在客户端收到服务端对于自己的无效连接的应答后,并不会向服务端发出确认,服务端由于收不到确认,就可以认为此次连接是无效的。

第二次挥手完成后,客户端到服务端的连接已经释放,B不会再接收数据,A也不会再发送数据。这个时候只是客户端不再发送数据,但是 B 可能还有未发送完的数据,所以需要等待服务端也主动关闭。

为什么是四次?
关闭连接时,当Server收到FIN报文时,很可能并不会立即关闭socket,因为Server端可能还有消息未发出,所有其只能先回复一个ACK报文,告诉Client端,你的关闭请求我收到了;当Server把所有的报文都发送完以后,Server才能给Client端发送FIN报文关闭连接,Client收到后应答ASK。所以需要四次握手

在四次握手后,Server端先进入TIME_WAIT状态,然后过2MS(最大报文生存时间)才能进入CLOSE状态。为啥?
因为网络是不可靠的,客户端在第四次握手的ACK可能会丢失,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文

TCP是顺序性,是通过协议中的序号来保证,每个包都有一个序号ID,
在建立连接的时候会商定起始 序号ID 是什么,然后按照 序号ID 一个个发送。

tcp是通过应答/确认/ACK 以及 重传机制来保证消息可靠传输的。

即在消息包发送后,要进行确认,当然,这个确认不是一个一个来的,而是会确认某个之前的 ID,表示都收到了,这种模式成为累计应答或累计确认。
确认是通过报文头里面的确认序号来保证的。

为了记录所有发送的包和接收的包,TCP 需要在发送端和接收端分别来缓存这些记录,发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分

流量控制指的是发送端不能无限的往接收端发送数据(UDP就可以),为啥呢?

因为在 TCP 里,接收端在发送 ACK 的时候会带上接收端缓冲区的窗口大小,叫 Advertised window,超过这个窗口,接收端就接收不过来了,发送端就不能发送数据了。这个窗口大概等于上面的第二部分加上第三部分,即 发送未确认 + 未发送可发送。

流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

tcp接收端缓冲区的大小是可以调试的,见 Netty高级功能(五):IoT百万长连接性能调优

TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,**如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种情况。 **
拥塞控制的问题,也是通过窗口的大小来控制的,即为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window),在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。

所以拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。

TCP 拥塞控制主要来避免两种现象,包丢失和超时重传,一旦出现了这些现象说明发送的太快了,要慢一点。

具体的方法就是发送端慢启动,比如倒水,刚开始倒的很慢,渐渐变快。然后设置一个阈值,当超过这个值的时候就要慢下来

通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。

第一层:物理层
第二层:数据链路层 802.2、802.3ATM、HDLC、FRAME RELAY
第三层:网络层 IP 、IPX、ARP、APPLETALK、ICMP
第四层:传输层 TCP、UDP 、SPX
第五层:会话层 RPC、SQL 、NFS 、X WINDOWS、ASP
第六层:表示层 ASCLL、PICT、TIFF、JPEG、 MIDI、MPEG
第七层:应用层 HTTP,FTP ,SNMP等

以上是关于netty4的udp服务端怎么是单线程的主要内容,如果未能解决你的问题,请参考以下文章

Netty4服务端心跳机制

sockt udp服务端怎么关闭

UDP和多线程服务器

java 从零开始手写 RPC (02)-netty4 实现客户端和服务端

UDP和多线程服务器

Netty从没听过到入门 -- 服务器端详解