Socket.Receive Method (Byte[], Int32, SocketFlags),看到了么,整数的最大值
解决方案 »
- 【求助】c# winform程序打包后配置文件如何更改?
- 看到好多人不会贴代码,贴的代码没有缩进,很乱,不易阅读,现向大家讲一下如何贴代码,例如贴C#代码:
- wcf中wsDualHttpBinding的问题
- datagrid 和 datatable 定位问题
- 如何动态添加名字是“name+序号”的控件?(急)!up也有分!
- 问c# io复用
- 非常辣手的问题,有关底层的程序。。。。。。。。。。。:(
- c#应用程序跟其他程序怎么进行数据交互?(急)
- 关于销毁(Dispose)的问题--简单
- 怎样判断Tcp连接是否已经断开?(急!!!高分求助)
- OracleConnection中怎么取到一个存储过程的参数?
- TFS怎样一次性强制签入别人签出的文件
其次确实是越大越快,不过这个快成指数级下降的,达到一定程度基本就没什么意义了,而且这个阀值一般网络环境都不大。
为什么数据包要小,因为怕爆内存。
反过来,如果你socket.Receive(buf, 1, SocketFlags.None);,就很可能出现程序Receive跟不上网卡的情况,也就容易出现接收端造成的丢包故障。
但是如果涉及到连接异常断开,错误重连,断点续传的问题,包过大的话,需要重传的内容也过多了
2.最终数据会通过网卡传输,而网卡中的缓存是有限的,内部会有机制从内存中传入网卡中再发送,包大到一定程度,CPU处理时间比起网络传输时间就可以忽略不计了
我也说快是成指数级下将的,看不懂啊。而且不仅仅是CPU处理时间,Tcp网络层对于数据包大小的处理,也一般是动态调整的。
tcp/ip数据包是定长的,无论缓冲区大还是小,都会被拆包成固定大小并追加报文信息,再发送
所以不存在10MB的数据一次性发送到网络的情况,不管缓冲区大还是小,它都是依次发送出去的
当然,经过路由的时候,可能会经多路由转发
这个跟应用层没有任何关系啊
socket还是算上传输层/控制层的
TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了
TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了单个数据包的大小,不应该小于MTU,但是也不应该太大 防止爆内存 和 丢包对吧?
TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元),
那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了单个数据包的大小,不应该小于MTU,但是也不应该太大 防止爆内存 和 丢包对吧?
这个和丢包没有什么关系, 举个例子,系统一次传1460个大小的包到你的服务器上,而你的单个数据包的大小是100,
那么,你处理数据的时候,就是100,100的处理,速度就会慢,如果你处理的慢,系统缓存区的数据就不会及时的被取走,这样,就会造成传输的阻塞(因为缓冲区数据满了,满了之后就不再接收客户端发过来的数据,网络就会闲下来),
这样你的网络传输速度就会慢下来,实际是因为你处理的太慢,而并不是因为网络链路的状态不好。一次处理100和一次处理1000的个大小,显然会少掉9倍的额外开销(额外开销是指定组装数据包或是其它与业务逻辑无关的开销)