我在使用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应答报文。
请各位专家解答。

解决方案 »

  1.   

    ack是在tcp包的头里的,不占其它的空间
      

  2.   

    顶2楼.流式数据发送的话,每次发送的大小是根据你发送的数据包决定的.而且tcp连接是要进行效验的.要进行3次握手.
      

  3.   

    接收和发送有各自的缓冲区,ACK是放在发送缓冲区中的,这跟接收数据没有关系。
      

  4.   

    我的提问是:如何使用Socket编程实现TCP成块数据流传输
    各位回答的都不是我所疑惑的 TCP的数据传输分两种:
    1. 交互数据流
    2. 成块数据流
      

  5.   

    无论是交互数据还是成块数据,
    你只管send就行了,
    什么时候发ack是tcp要考虑的事情,不需要你用socket接口去控制。
    也不应该由你来控制。
    要性能调优可以考虑控制tcp缓冲区大小。
      

  6.   

    UP ACK 是TCP自己考虑~除非你自己写协议~
      

  7.   

    使用socket进行通信,底层的东西要管的很多么?不是都封装起来了么
      

  8.   

    我的认知是: 
    Socket 层是没有办法控制TCP的一些传输属性
    但是TCP的成块数据传输的功能如何才能实现, 因为TCP的成块数据流可以大大提高网络吞吐量,
    比如FTP就是架在TCP协议上的,FTP传输的时候总是希望数据尽快下载到客户端,而不时希望每次接受到一个报就ACk,这样会降低吞吐量的。
    有的资料显示可以更改注册表内容来修改TCP的参数
    比如:HKEY _ LOCAL _ MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters 
    不知修改和增加什么参数可以实现TCP的成块数据流, 比如:改变 TCP 窗口大小等
      

  9.   

    用GOOGLE查到这个问题。我也对这个问题很疑惑,不知道是否有人可以给个解答。TCP的数据传输分两种: 
    1. 交互数据流 
    2. 成块数据流 是否可以对每个socket都指定数据传输方式,
    比如开启一个进程,如ftp时使用成块数据流,
    再开启一个进程,如telnet时使用交互数据流。如果可以的话,这两个进程的通信的效率会不会因为指定不同传输方式干扰而导致性能
    发生下降的情况呢。
      

  10.   

    我再仔细阅读了下文档,我觉得我可能明白了。楼主应该跟我一样,在阅读TCP/IP详解时遇到的这个问题。在仔细理解后,发现我们根本无需指定传输方式,TCP自然会根据不同类型的数据流做不同的处理。TCP的数据传输分两种: 
    1. 交互数据流 
    2. 成块数据流 交互数据流指的是那种在发包时,每个发包都很小的情况。这时有两种处理方法,一种是每发一个很小的报文都立即发送;一种是使用Nagle算法,当前一个报文未得到回应时,后续的小报文将累加起来,直到报文大小到了一定限度或者前一个报文回应之后,才将累加起来的报文合并成一个较大的报文开始发送。而成块数据流不一样,它的报文是大块的,因此不存在累加的可能。这时TCP会利用一个窗口机制使它发送得更快一些(没有得到前一个报文的回应时也传送数据。这跟Nagle算法没有冲突:Nagle算法是报文小的时候才生效,大报文根本不需要累加)。因此,这两种数据传输实际上是没有冲突的。在使用socket编程时,不需要考虑这个内部机制。但如果是需要自己实现一个私有协议,可能需要深入分析这些内部算法的具体情况。楼主貌似已经一年没来了。写下这些只是为下一个google到这篇文章的人提供一些思路。
      

  11.   

    这不是相当于自己实现tcp层协议吗,貌似难度挺大的,知道 sock来创建原始socket,然后自己打包tcp包头,其他的控制之类的就完全不知道了,而且所谓的交互,流式,慢启动 主要是针对发送方的,接收方只需要ack延时发送就够了,而且发送方也必须要直接接受到tcp层的数据,然后根据ack来进行处理
      

  12.   

    您好 请问您解决怎么 修改TCP窗口大小了吗?