IP层:我们知道在TCP/IP协议中,在网络中是以IP数据包传输的,也既是将
原来应用层的一个BUF,分成几块小BUF,经过各曾协议,最后封状进IP
协议的数据包中。
TCP层:那么当一放接受数据时,在IP层收到的就可能是无序的数据包,到TCP层时再将
其有序化,然后交给应用层。
问题1:那么如果TCP层中缺少了一个数据包,使其不能有序化,那他不就是要阻塞在缓冲区,直到
那个数据包到来?????如果这样效率不是太低?应用层:
问题2.是不是每个SOCKET连接 WINDOWS都默认给起8K缓存,还是共享8K??,如果是共享不会发生数据混乱?
问题3.RECV操作是当每个缓存有数据时就立刻触发吗??
即有1K数据就立刻接收,还是等8K满了在收??
说法不对的地方还望指点!
谢谢!

解决方案 »

  1.   

    1) 一定是要等到数据完整才会送入接收缓冲内,否则 TCP 流将不连续,这不符合TCP 协议2) 应该是每个套接字独享自己的缓冲区,接收缓冲和发送缓冲都是独立的3) 当有数据时会立刻触发, 即使只收到 一个字节
      

  2.   

    RECV 阻塞的情况是 接收缓冲为空. 如果不为空,就会返回数据的, 事实上, 有很多基于 TCP 的协议的C/S之间的指令都是非常短的, 甚至只有几个字节, 如果数据不能立刻触发,那么这样的协议无法正常工作
      

  3.   

    krh2001(边城浪子) 说的对。
      

  4.   

    我觉得如果TCP封包不完整,例如前面的封包丢失,那么窗口就会一直等待,并要求重发。不会提交后面的封包。立即返回只是返回前面连续的数据
      

  5.   

    recv应该是收到一个包的时候返回吧