我在使用Win Socket编程时想实现TCP的成块数据流传输,PC端是Client 客户端,将总是希望每次尽量多的接受来自Server端的数据。 Server将会连续发送数据尽量填满Client的缓冲区,而Client对这些数据只要发送一个ACK报文来回应就可以了。TCP的成块数据流传输可以通过滑动窗口和ACK累积效应实现, 不知在socket编程时如何实现。
但是 m_s = socket(AF_INET, SOCK_STREAM, 0);
这个socket 函数似乎只能实现TCP的交互数据流传输。也就是PC收到server的数据就发送ACK数据报。这样会影响数据吞吐量。怎样才能通过socket程序实现TCP的块数据流传输, 即尽量多接受数据,尽量少发送ACK应答报文。
请各位专家解答。
但是 m_s = socket(AF_INET, SOCK_STREAM, 0);
这个socket 函数似乎只能实现TCP的交互数据流传输。也就是PC收到server的数据就发送ACK数据报。这样会影响数据吞吐量。怎样才能通过socket程序实现TCP的块数据流传输, 即尽量多接受数据,尽量少发送ACK应答报文。
请各位专家解答。
各位回答的都不是我所疑惑的 TCP的数据传输分两种:
1. 交互数据流
2. 成块数据流
你只管send就行了,
什么时候发ack是tcp要考虑的事情,不需要你用socket接口去控制。
也不应该由你来控制。
要性能调优可以考虑控制tcp缓冲区大小。
Socket 层是没有办法控制TCP的一些传输属性
但是TCP的成块数据传输的功能如何才能实现, 因为TCP的成块数据流可以大大提高网络吞吐量,
比如FTP就是架在TCP协议上的,FTP传输的时候总是希望数据尽快下载到客户端,而不时希望每次接受到一个报就ACk,这样会降低吞吐量的。
有的资料显示可以更改注册表内容来修改TCP的参数
比如:HKEY _ LOCAL _ MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters
不知修改和增加什么参数可以实现TCP的成块数据流, 比如:改变 TCP 窗口大小等
1. 交互数据流
2. 成块数据流 是否可以对每个socket都指定数据传输方式,
比如开启一个进程,如ftp时使用成块数据流,
再开启一个进程,如telnet时使用交互数据流。如果可以的话,这两个进程的通信的效率会不会因为指定不同传输方式干扰而导致性能
发生下降的情况呢。
1. 交互数据流
2. 成块数据流 交互数据流指的是那种在发包时,每个发包都很小的情况。这时有两种处理方法,一种是每发一个很小的报文都立即发送;一种是使用Nagle算法,当前一个报文未得到回应时,后续的小报文将累加起来,直到报文大小到了一定限度或者前一个报文回应之后,才将累加起来的报文合并成一个较大的报文开始发送。而成块数据流不一样,它的报文是大块的,因此不存在累加的可能。这时TCP会利用一个窗口机制使它发送得更快一些(没有得到前一个报文的回应时也传送数据。这跟Nagle算法没有冲突:Nagle算法是报文小的时候才生效,大报文根本不需要累加)。因此,这两种数据传输实际上是没有冲突的。在使用socket编程时,不需要考虑这个内部机制。但如果是需要自己实现一个私有协议,可能需要深入分析这些内部算法的具体情况。楼主貌似已经一年没来了。写下这些只是为下一个google到这篇文章的人提供一些思路。