“包”这个词被各种人各种场合滥用。数据包要看你说的是什么意思。.net封装了tcp协议机制。我曾经遇到过这样的人,这个人号称搞tcp开发已经5、6年,竟然不知道发送端的buffer大小跟接收端的buffer大小没有必要一样。.net封装了tcp协议机制,因此在.net框架范畴内说“数据包”实际上只有一点炫技的意思,没有什么太多的意思。例如我们在发送端使用一个send指令发送了1000个字节(假设buffer大小是10240但是并没有全用来保存数据),在接收端我们设置buffer的大小则是32K字节,尽管如此,接收端仍然可能在上一个Receive动作时接收缓冲区中包含这1000字节的前边一小部分(粘包),或者虽然包括这1000字节并且同一个buffer中还包括发送端随后send来的部分数据。因为tcp就是这样的,为了提高网络整体效率,它花延迟时间智能地调整底层机制,而牺牲了udp那样的局部简单性。因此tcp会如此,从.net高层封装的角度其实隐藏了底层的数据包的细节。

解决方案 »

  1.   

    您好,请问send方法如果同时有两个在运行那么传到缓冲区的数据会不会相互交叉现象
    比如第一个send方法传送aaaaaaaaaaa,同时第二个send方法(可能是另一个线程的)传送bbbbbbbbb,那么缓冲区会不会字节队列为aaaaabbbbbaaaaabbbbbb呢?
      

  2.   


    朋友,如果你调用两个不用的线程使用同一个套接字进行发送操作的话,是绝对有可能出现你说的这种原因的。而且我认为你这种做法是绝对错误的,TCP本来是不会乱序的,但是你这样一做就会使得本不会乱序的TCP传送而乱序!