Socket最多一次可以接收多少字节???

starrycheng 2014-09-22 10:04:33
socket.Receive(buf, 4096, SocketFlags.None);

这里的4096,最大值为多少???
...全文
15610 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
willhuo 2015-09-30
  • 打赏
  • 举报
回复
受教了,不过还有些疑惑。 1. 在相同的条件下,从服务端更新文件,有时快有时慢。 2. 接收缓冲去大小设置为10240,发送端也是10240,每次接收可能不是10240,有时候很频繁出现小于10240,有时候频繁等于10240,不知道何故。
Jeece_JX 2015-04-01
  • 打赏
  • 举报
回复
tcp一次发送最好大小最好小于1460byte,接收缓冲区默认是8k,最大可以到64k这种说法对吗?
烈火蜓蜻 2014-09-25
  • 打赏
  • 举报
回复
引用 21 楼 starrycheng 的回复:
[quote=引用 16 楼 Linux7985 的回复:] [quote=引用 15 楼 changjiangzhibin 的回复:] 习惯是 byte[1024] 切片处理
TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元), 那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。 分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了[/quote] 单个数据包的大小,不应该小于MTU,但是也不应该太大。。。 防止爆内存 和 丢包对吧? [/quote] 这个和丢包没有什么关系, 举个例子,系统一次传1460个大小的包到你的服务器上,而你的单个数据包的大小是100, 那么,你处理数据的时候,就是100,100的处理,速度就会慢,如果你处理的慢,系统缓存区的数据就不会及时的被取走,这样,就会造成传输的阻塞(因为缓冲区数据满了,满了之后就不再接收客户端发过来的数据,网络就会闲下来), 这样你的网络传输速度就会慢下来,实际是因为你处理的太慢,而并不是因为网络链路的状态不好。 一次处理100和一次处理1000的个大小,显然会少掉9倍的额外开销(额外开销是指定组装数据包或是其它与业务逻辑无关的开销)
铁匠梁 2014-09-24
  • 打赏
  • 举报
回复
一般有个经验值,和操作系统、网络带宽等息息相关
Smile_Couson 2014-09-24
  • 打赏
  • 举报
回复
新人路过帖子,表示长知识了。 原来数值的上限就是定义类型的上限。
starrycheng 2014-09-24
  • 打赏
  • 举报
回复
引用 16 楼 Linux7985 的回复:
[quote=引用 15 楼 changjiangzhibin 的回复:] 习惯是 byte[1024] 切片处理
TCP的MTU是1500个字节去掉协议其它部分的信息,大概有效的数据是1460左右(TCP一次最大的传输单元), 那么你的缓存区最好是比1460要大,具体多大,要看你自己的协议最大的包有多大,个人建议,你的缓存区大小,应该是你可以预期最大数据包的大小的1倍以上,2倍以下的大小。 这样你才可以自己把数据包组装起来, TCP的MTU你如果想要修改,不是写代码就可以改的,这个值通常跟底层的协议有关。 分包大小(指的是你自己协议的分包,)不是越大越好(太大了,系统内存一下子就没了,特别是高并发的连接时,你想想每个连接都要有缓存区,缓存区的大小与你的分包大小是直接关系),也不是越小越好(最小你不应该比MTU小),合适就是最好了[/quote] 单个数据包的大小,不应该小于MTU,但是也不应该太大。。。 防止爆内存 和 丢包对吧?
threenewbee 2014-09-23
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
楼主所说的"包"的概念,并不是tcp/ip协议中的数据包,而是发送缓冲区和接收缓冲区大小 tcp/ip数据包是定长的,无论缓冲区大还是小,都会被拆包成固定大小并追加报文信息,再发送 所以不存在10MB的数据一次性发送到网络的情况,不管缓冲区大还是小,它都是依次发送出去的 当然,经过路由的时候,可能会经多路由转发 这个跟应用层没有任何关系啊
socket还是算上传输层/控制层的
於黾 2014-09-23
  • 打赏
  • 举报
回复
楼主所说的"包"的概念,并不是tcp/ip协议中的数据包,而是发送缓冲区和接收缓冲区大小 tcp/ip数据包是定长的,无论缓冲区大还是小,都会被拆包成固定大小并追加报文信息,再发送 所以不存在10MB的数据一次性发送到网络的情况,不管缓冲区大还是小,它都是依次发送出去的 当然,经过路由的时候,可能会经多路由转发 这个跟应用层没有任何关系啊
threenewbee 2014-09-23
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
越大越快的说法是不靠谱的 凭什么说越大就越快?
网络是有固有延迟的,比如中国和美国相距1万5千千米的两个主机通讯,因为光速的存在,那么一来一回至少要0.1秒。那么如果采用应答/同步的方式传送数据,那么如果一个数据包是1KB,那么传输速度就不可能快于10KB/s。相反,一个数据包是1MB,那么速度就是10MB/s,这就是越大越快。 当然。现实情况是,数据传输往往不是应答模式,很多传输协议都有类似窗口/异步的概念,也就是这边发送完一个数据包,不等对方反馈是否收到,接着传下一个,所谓窗口,就是传一批(当然这是形象的比喻,具体google tcp滑动窗口机制)。即便这样,过小的数据包同样用在同步的时间上会更多。另外一点是,任何协议对数据打包,都需要额外的数据占位来保存诸如包编号、校验、时间戳等等附加的信息,如果包非常小,那么这些额外需要传输的数据和真正有效数据的占比就会大,那么也会使得传输效率低下。 总之,过犹不及,无论太大,太小都不好。
showjim 2014-09-23
  • 打赏
  • 举报
回复
引用 10 楼 Z65443344 的回复:
1.如果仅仅是tcp/ip丢包的问题,tcp有重发机制,是不用应用层处理的 但是如果涉及到连接异常断开,错误重连,断点续传的问题,包过大的话,需要重传的内容也过多了 2.最终数据会通过网卡传输,而网卡中的缓存是有限的,内部会有机制从内存中传入网卡中再发送,包大到一定程度,CPU处理时间比起网络传输时间就可以忽略不计了
tcp丢包对应用层的逻辑处理可能没有影响,但是频繁重发将是灾难的祸端。 我也说快是成指数级下将的,看不懂啊。而且不仅仅是CPU处理时间,Tcp网络层对于数据包大小的处理,也一般是动态调整的。
於黾 2014-09-23
  • 打赏
  • 举报
回复
引用 8 楼 sbwwkmyd 的回复:
首先这个socket.Receive的大小与网络层没有任何关系,不需要考虑分包的事情,与丢包更没有关系。 其次确实是越大越快,不过这个快成指数级下降的,达到一定程度基本就没什么意义了,而且这个阀值一般网络环境都不大。 为什么数据包要小,因为怕爆内存。
1.如果仅仅是tcp/ip丢包的问题,tcp有重发机制,是不用应用层处理的 但是如果涉及到连接异常断开,错误重连,断点续传的问题,包过大的话,需要重传的内容也过多了 2.最终数据会通过网卡传输,而网卡中的缓存是有限的,内部会有机制从内存中传入网卡中再发送,包大到一定程度,CPU处理时间比起网络传输时间就可以忽略不计了
showjim 2014-09-23
  • 打赏
  • 举报
回复
引用 8 楼 sbwwkmyd 的回复:
首先这个socket.Receive的大小与网络层没有任何关系,不需要考虑分包的事情,与丢包更没有关系。
这里说的丢包没有关系,是说接收缓冲区足够大的情况。 反过来,如果你socket.Receive(buf, 1, SocketFlags.None);,就很可能出现程序Receive跟不上网卡的情况,也就容易出现接收端造成的丢包故障。
showjim 2014-09-23
  • 打赏
  • 举报
回复
首先这个socket.Receive的大小与网络层没有任何关系,不需要考虑分包的事情,与丢包更没有关系。 其次确实是越大越快,不过这个快成指数级下降的,达到一定程度基本就没什么意义了,而且这个阀值一般网络环境都不大。 为什么数据包要小,因为怕爆内存。
於黾 2014-09-23
  • 打赏
  • 举报
回复
越大越快的说法是不靠谱的 凭什么说越大就越快?
阿瞒 2014-09-23
  • 打赏
  • 举报
回复
Byte[] 数组的长度决定,建议你用ping命令+L 测试你本机数据包大小的稳定性下。。要不怕丢数据包
starrycheng 2014-09-23
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
取决于通讯协议。为什么通讯协议要限制包的大小?因为过大的包丢失的概率会更大。 这是起码的常识问题。
谢谢大师。。。我师兄追求越大越好,他说越大越快。但是在公网上的话,数据包还是小一点吧。
於黾 2014-09-23
  • 打赏
  • 举报
回复
如果是传数据->如果是传文件 如果仅仅是传数据,一般包都不会很大.
於黾 2014-09-23
  • 打赏
  • 举报
回复
过大的包丢失概率会更大,而且过大的包占内存也多,如果是传数据,完全可以分成许多较小的包,收到就直接写入文件,而不是整个文件作为一个包一次性发送
starrycheng 2014-09-23
  • 打赏
  • 举报
回复
受教了,真心受教了。
绿领巾童鞋 2014-09-23
  • 打赏
  • 举报
回复
当你的通讯在广域网传输的时候,就会发现更多的限制,包括一次发生包的大小等等~
加载更多回复(5)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧