当前位置: 技术问答>linux和unix
为什么我TCP发送一个包,对方就回一个ACK?
来源: 互联网 发布时间:2016-05-28
本文导语: 而另一个软件发两个TCP包,目标才回一个ACK,要怎么控制? | 楼上回答的全是一群装B人士,基本上没有去写过基础代码的一帮所谓的专家乱说 楼主的这个问题,其实不是问题,你要理解TCP的...
而另一个软件发两个TCP包,目标才回一个ACK,要怎么控制?
|
楼上回答的全是一群装B人士,基本上没有去写过基础代码的一帮所谓的专家乱说
楼主的这个问题,其实不是问题,你要理解TCP的实现原理与工作机制,TCP是一个流协议,在你通过TCP发一个包,按照TCP的协议,TCP实现层会通知你ACK的应答,但是这个包是一个数据流,也就是说有可能你连接发多个应用层数据包,在TCP层可能会是一个数据流,所以你就只会看到TCP只回一个ACK给你,这种情况在测试环境下,比如内网速度很快的情况是经常会发生的,特别是在程序内部逻辑时间间隔短,发送又很快的情况下,所以来说这个是正常的,不要担心,只要你的应用层一定要想办法把这段数据流分开就可以了
楼主的这个问题,其实不是问题,你要理解TCP的实现原理与工作机制,TCP是一个流协议,在你通过TCP发一个包,按照TCP的协议,TCP实现层会通知你ACK的应答,但是这个包是一个数据流,也就是说有可能你连接发多个应用层数据包,在TCP层可能会是一个数据流,所以你就只会看到TCP只回一个ACK给你,这种情况在测试环境下,比如内网速度很快的情况是经常会发生的,特别是在程序内部逻辑时间间隔短,发送又很快的情况下,所以来说这个是正常的,不要担心,只要你的应用层一定要想办法把这段数据流分开就可以了
|
要与时俱进耶,不要只停留在《TCP/IP详解》3卷上,网络发展日新月异。
其中 SACK 作为 tcp 协议的补充,提供了选择性应答方式,不需要每个报文都应答啊。貌似就可以达到楼主描述的现象与结果。象 setsockopt 跟 getsockopt 都已经支持了SACK了,下面是摘抄的部分片段:
j = sizeof(int);
if (no_sack != -1) {
if (setsockopt(fd, proto->p_proto,
TCP_DO_SACK, (char *)&no_sack, j) p_proto,
TCP_DO_SACK, (char *)&tno_sack, &j)