Socket.Receive Method (Byte[], Int32, SocketFlags),看到了么,整数的最大值

解决方案 »

  1.   

    Byte[] 数组的长度决定,建议你用ping命令+L 测试你本机数据包大小的稳定性下。。要不怕丢数据包
      

  2.   

    首先这个socket.Receive的大小与网络层没有任何关系,不需要考虑分包的事情,与丢包更没有关系。
    其次确实是越大越快,不过这个快成指数级下降的,达到一定程度基本就没什么意义了,而且这个阀值一般网络环境都不大。
    为什么数据包要小,因为怕爆内存。
      

  3.   

    这里说的丢包没有关系,是说接收缓冲区足够大的情况。
    反过来,如果你socket.Receive(buf, 1, SocketFlags.None);,就很可能出现程序Receive跟不上网卡的情况,也就容易出现接收端造成的丢包故障。
      

  4.   

    1.如果仅仅是tcp/ip丢包的问题,tcp有重发机制,是不用应用层处理的
    但是如果涉及到连接异常断开,错误重连,断点续传的问题,包过大的话,需要重传的内容也过多了
    2.最终数据会通过网卡传输,而网卡中的缓存是有限的,内部会有机制从内存中传入网卡中再发送,包大到一定程度,CPU处理时间比起网络传输时间就可以忽略不计了
      

  5.   

    tcp丢包对应用层的逻辑处理可能没有影响,但是频繁重发将是灾难的祸端。
    我也说快是成指数级下将的,看不懂啊。而且不仅仅是CPU处理时间,Tcp网络层对于数据包大小的处理,也一般是动态调整的。
      

  6.   

    网络是有固有延迟的,比如中国和美国相距1万5千千米的两个主机通讯,因为光速的存在,那么一来一回至少要0.1秒。那么如果采用应答/同步的方式传送数据,那么如果一个数据包是1KB,那么传输速度就不可能快于10KB/s。相反,一个数据包是1MB,那么速度就是10MB/s,这就是越大越快。当然。现实情况是,数据传输往往不是应答模式,很多传输协议都有类似窗口/异步的概念,也就是这边发送完一个数据包,不等对方反馈是否收到,接着传下一个,所谓窗口,就是传一批(当然这是形象的比喻,具体google tcp滑动窗口机制)。即便这样,过小的数据包同样用在同步的时间上会更多。另外一点是,任何协议对数据打包,都需要额外的数据占位来保存诸如包编号、校验、时间戳等等附加的信息,如果包非常小,那么这些额外需要传输的数据和真正有效数据的占比就会大,那么也会使得传输效率低下。总之,过犹不及,无论太大,太小都不好。
      

  7.   

    楼主所说的"包"的概念,并不是tcp/ip协议中的数据包,而是发送缓冲区和接收缓冲区大小
    tcp/ip数据包是定长的,无论缓冲区大还是小,都会被拆包成固定大小并追加报文信息,再发送
    所以不存在10MB的数据一次性发送到网络的情况,不管缓冲区大还是小,它都是依次发送出去的
    当然,经过路由的时候,可能会经多路由转发
    这个跟应用层没有任何关系啊
      

  8.   


    socket还是算上传输层/控制层的
      

  9.   

    习惯是 byte[1024] 切片处理
      

  10.   


    TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
    那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了
      

  11.   


    TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
    那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了单个数据包的大小,不应该小于MTU,但是也不应该太大  防止爆内存 和 丢包对吧?
      

  12.   


    TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
    那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了单个数据包的大小,不应该小于MTU,但是也不应该太大  防止爆内存 和 丢包对吧?
    这个和丢包没有什么关系, 举个例子,系统一次传1460个大小的包到你的服务器上,而你的单个数据包的大小是100,
    那么,你处理数据的时候,就是100,100的处理,速度就会慢,如果你处理的慢,系统缓存区的数据就不会及时的被取走,这样,就会造成传输的阻塞(因为缓冲区数据满了,满了之后就不再接收客户端发过来的数据,网络就会闲下来),
    这样你的网络传输速度就会慢下来,实际是因为你处理的太慢,而并不是因为网络链路的状态不好。一次处理100和一次处理1000的个大小,显然会少掉9倍的额外开销(额外开销是指定组装数据包或是其它与业务逻辑无关的开销)