当前位置:首页 » 操作系统 » 纳格算法

纳格算法

发布时间: 2023-02-11 13:20:44

1. Java Socket重要参数讲解

Java Socket的api可能很多人会用 但是Java Socket的参数可能很多人都不知道用来干嘛的 甚至都不知道有这些参数

backlog

用于ServerSocket 配置ServerSocket的最大客户端等待队列 等待队列的意思 先看下面代码

public class Main { public static void main(String[] args) throws Exception { int port = int backlog = ServerSocket serverSocket = new ServerSocket(port backlog) Socket clientSock = serverSocket accept() System out println( revcive from + clientSock getPort()) while (true) { byte buf[] = new byte[ ] int len = clientSock getInputStream() read(buf) System out println(new String(buf len)) }这段测试代码在第一次处理一个客户端时 就不会处理第二个客户端 所以除了第一个客户端 其他客户端就是等待队列了 所以这个服务器最多可以同时连接 个客户端 其中 个等待队列 大家可以telnet localhost 测试下

这个参数设置为 表示无限制 默认是 个最大等待队列 如果设置无限制 那么你要小心了 如果你服务器无法处理那么多连接 那么当很多客户端连到你的服务器时 每一个TCP连接都会占用服务器的内存 最后会让服务器崩溃的

另外 就算你设置了backlog为 如果你的代码中是一直Socket clientSock = serverSocket accept() 假设我们的机器最多可以同时处理 个请求 总共有 个线程在运行 然后你把在 个线程的线程池处理clientSock 不能处理的clientSock就排队 最后clientSock越来越多 也意味着TCP连接越来越多 也意味着我们的服务器的内存使用越来越高(客户端连接进程 肯定会发送数据过来 数据会保存到服务器端的TCP接收缓存区) 最后服务器就宕机了 所以如果你不能处理那么多请求 请不要循环无限制地调用serverSocket accept() 否则backlog也无法生效 如果真的请求过多 只会让你的服务器宕机(相信很多人都是这么写 要注意点)

TcpNoDelay

禁用纳格算法 将数据立即发送出去 纳格算法是以减少封包传送量来增进TCP/IP网络的效能 当我们调用下面代码 如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) 我们发送了hello 当hello没有收到ack确认(TCP是可靠连接 发送的每一个数据都要收到对方的一个ack确认 否则就要重发)的时候 根据纳格算法 world不会立马发送 会等待 要么等到ack确认(最多等 ms对方会发过来的) 要么等到TCP缓冲区内容>=MSS 很明显这里没有机会 我们写了world后再也没有写数据了 所以只能等到hello的ack我们才会发送world 除非我们禁用纳格算法 数据就会立即发送了

SoLinger

当我们调用socket close()返回时 socket已经write的数据未必已经发送到对方了 例如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) socket close()

这里调用了socket close()返回时 hello和world未必已经成功发送到对方了 如果我们设置了linger而不小于 如

bool on = true int linger = ……

socket setSoLinger(boolean on int linger)

……

socket close() 那么close会等到发送的数据已经确认了才返回 但是如果对方宕机 超时 那么会根据linger设定的时间返回

UrgentData和OOBInline

TCP的紧急指针 一般都不建议使用 而且不同的TCP/IP实现 也不同 一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据 让对方紧急处理

所以这两个参数 你们可以忽略吧 想知道更多的 自己查下资料

SoTimeout

设置socket调用InputStream读数据的超时时间 以毫秒为单位 如果超过这个时候 会抛出 SocketTimeoutException

KeepAlive

keepalive不是说TCP的常连接 当我们作为服务端 一个客户端连接上来 如果设置了keeplive为true 当对方没有发送任何数据过来 超过一个时间(看系统内核参数配置) 那么我们这边会发送一个ack探测包发到对方 探测双方的TCP/IP连接是否有效(对方可能断点 断网) 在Linux好像这个时间是 秒 如果不设置 那么客户端宕机时 服务器永远也不知道客户端宕机了 仍然保存这个失效的连接

SendBufferSize和ReceiveBufferSize

TCP发送缓存区和接收缓存区 默认是 一般情况下足够了 而且就算你增加了发送缓存区 对方没有增加它对应的接收缓冲 那么在TCP三握手时 最后确定的最大发送窗口还是双方最小的那个缓冲区 就算你无视 发了更多的数据 那么多出来的数据也会被丢弃 除非双方都协商好

lishixin/Article/program/Java/hx/201311/26575

2. 【性能】Nagle 算法(纳格算法)

Nagle 算法,是 TCP 协议中用于减少小包发送数量的一种优化算法,目的是为了提高实际带宽的利用率。

举个例子,当有效负载只有 1 字节时,再加上 TCP 头部和 IP 头部分别占用的 20 字节,整个网络包就是 41 字节,这样实际带宽的利用率只有 2.4%(1/41)。往大了说,如果整个网络带宽都被这种小包占满,那整个网络的有效利用率就太低了。

Nagle 算法正是为了解决这个问题:它通过合并 TCP 小包,提高网络带宽的利用率。Nagle 算法规定,一个 TCP 连接上,最多只能有一个未被确认的未完成分组;在收到这个分组的 ACK 前,不发送其他分组。这些小分组会被组合起来,并在收到 ACK 后,用同一个分组发送出去。

显然,Nagle 算法本身的想法还是挺好的,但是知道 Linux 默认的延迟确认机制后,你应该就不这么想了。因为它们一起使用时,网络延迟会明显。如下图所示:

3. 我的世界为什么自己蹦端了

纳格算法模组出现错误,请删除纳格算法模组。
如果问题依然存在,请重新下载Forge。

热点内容
怎么让虚拟机共享文件夹共享文件夹 发布:2025-07-24 11:21:34 浏览:665
如何安装密码锁开关 发布:2025-07-24 11:16:44 浏览:750
怎么自己买2手服务器 发布:2025-07-24 10:45:13 浏览:351
脚本打招募 发布:2025-07-24 10:40:56 浏览:556
如何进入一个人多的服务器 发布:2025-07-24 10:34:58 浏览:302
漯河ftp服务器 发布:2025-07-24 10:15:41 浏览:501
android文件拷贝 发布:2025-07-24 10:12:02 浏览:360
ios解压缩zip 发布:2025-07-24 10:11:22 浏览:244
微信的安卓夜间模式怎么设置 发布:2025-07-24 09:04:19 浏览:753
安卓手机丢了怎么定位 发布:2025-07-24 09:04:17 浏览:216