java socket 延迟_java socket参数详解:TcpNoDelay降低通信延迟

TcpNoDelay=false,为启用nagle算法,也是默认值。 Nagle算法的立意是良好的,避免网络中充塞小封包,提高网络的利用率。但是当Nagle算法遇到delayed ACK悲剧就发生了。Delayed ACK的本意也是为了提高TCP性能,跟应答数据捎带上ACK,同时避免糊涂窗口综合症,也可以一个ack确认多个段来节省开销。悲剧发生在这种情况,假设一端发送数据并等待另一端应答,协议上分...
摘要由CSDN通过智能技术生成

TcpNoDelay=false,为启用nagle算法,也是默认值。 Nagle算法的立意是良好的,避免网络中充塞小封包,提高网络的利用率。但是当Nagle算法遇到delayed ACK悲剧就发生了。Delayed ACK的本意也是为了提高TCP性能,跟应答数据捎带上ACK,同时避免糊涂窗口综合症,也可以一个ack确认多个段来节省开销。悲剧发生在这种情况,假设一端发送数据并等待另一端应答,协议上分为头部和数据,发送的时候不幸地选择了write-write,然后再read,也就是先发送头部,再发送数据,最后等待应答。

实验模型:

发送端(客户端)

write(head);

write(body);

read(response);

接收端(服务端)

read(request);

process(request);

write(response);

这里假设head和body都比较小,当默认启用nagle算法,并且是第一次发送的时候,根据nagle算法,第一个段head可以立即发送,因为没有等待确认的段;接收端(服务端)收到head,但是包不完整,继续等待body达到并延迟ACK;发送端(客户端)继续写入body,这时候nagle算法起作用了,因为head还没有被ACK,所以body要延迟发送。这就造成了发送端(客户端)和接收端(服务端)都在等待对方发送数据的现象:

发送端(客户端)等待接收端ACK head以便继续发送body;

接收端(服务端)在等待发送方发送body并延迟ACK,悲剧的无以言语。

这种时候只有等待一端超时并发送数据才能继续往下走。

代码:

发送端代码

package

socket.nagle;

import

java.io.*;

import

java.net.*;

import

org.apache.log4j.Logger;

public

class

Client {

private

static

Logger logger = Logger.getLogger(Client.

class

);

public

static

void

main(String[] args)

throws

Exception {

// 是否分开写head和body

boolean

writeSplit =

true

;

String host =

"localhost"

;

logger.debug(

"WriteSplit:"

+ writeSplit);

Socket socket =

new

Socket();

socket.setTcpNoDelay(

false

);

socket.connect(

new

InetSocketAddress(host,

10000

));

InputStream in =

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值