TCP协议一次最多能发送多少数据?

screen12 2016-05-14 04:01:34
我用send来发送,返回值表示实际发送的字节数,如果小于我需要发送的字节数,就再循环发送。直到发送为止。

请问:这样的话,一次(包括多个循环发送的总和)可以最多发送多少数据?
...全文
7102 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
晚起的鸟 2016-10-06
  • 打赏
  • 举报
回复
以太网 Ethernet 最大的数据帧是 1518字节,去掉头尾等剩下的是1448,抓包看一下,这点不是太确定。这个说的是物理上一次发送最大数据,是底层的,是tcp内部解决的,我们不用关心。 你问的应该是说每次调用send能发多少?这个数据应该是发送缓冲区的大小然后去各种头,剩下的就是大小了。 一次发送太多,如果阻塞情况下,先放满缓存,然后等待网络发送,缓存有空余了继续放,一直都放入缓存send返回成功。 非阻塞的话就写满后立即返回,只发送了部分数据,剩下的自己处理,下次发送,记得是自己处理。
翅膀又硬了 2016-05-23
  • 打赏
  • 举报
回复
楼主你自己试试不就行啦,再这里乱扯的一般都是没试过的
screen12 2016-05-18
  • 打赏
  • 举报
回复
引用 11 楼 fhw_bin_dl 的回复:
[quote=引用 8 楼 screen12 的回复:] [quote=引用 1 楼 fhw_bin_dl 的回复:] 一次发送过多可能会导致发送超时,所以要限制每次的发送量,socket默认的缓冲区大小是8K。
我将其设为8M可不可以?反正现在内存也大,都是几个G,发送缓冲区和接收缓冲区都设为8M,没问题吧?[/quote] 还和网速有关系,比如ADSL发送速度是0.1MB / S,发送8M数据就是80S时间,如果这时有第二次send,就会等待80S,如果发送超时设置得比较小的话,第二次send就会返回超时失败。[/quote] 比如说:我把发送缓冲区设为10M,我第一次发送8M的数据,它并没有把缓冲区占满。第二次,我再发送1K的数据,由于缓冲区并没有被占满,即使第一次的数据此时没有发完,第二次的发送应该能立即就返回吧?(放到缓冲区里不需要多少时间)。 缓冲区是不是一相消息队列,先进先出?没有满的时候,消息就可以继续放进去。是吗?
赵4老师 2016-05-18
  • 打赏
  • 举报
回复
本端单位时间能发送多少,决定于对端单位时间能接受多少。
fhw217 2016-05-17
  • 打赏
  • 举报
回复
引用 8 楼 screen12 的回复:
[quote=引用 1 楼 fhw_bin_dl 的回复:] 一次发送过多可能会导致发送超时,所以要限制每次的发送量,socket默认的缓冲区大小是8K。
我将其设为8M可不可以?反正现在内存也大,都是几个G,发送缓冲区和接收缓冲区都设为8M,没问题吧?[/quote] 还和网速有关系,比如ADSL发送速度是0.1MB / S,发送8M数据就是80S时间,如果这时有第二次send,就会等待80S,如果发送超时设置得比较小的话,第二次send就会返回超时失败。
screen12 2016-05-17
  • 打赏
  • 举报
回复
引用 1 楼 fhw_bin_dl 的回复:
一次发送过多可能会导致发送超时,所以要限制每次的发送量,socket默认的缓冲区大小是8K。
我将其设为8M可不可以?反正现在内存也大,都是几个G,发送缓冲区和接收缓冲区都设为8M,没问题吧?
screen12 2016-05-17
  • 打赏
  • 举报
回复
引用 5 楼 wangningyu 的回复:
tcp还好,缓冲区可以设大一点,系统内部会处理,接收端注意一下就行了 udp就最好小点,受mtu限制,不然分包、丢包问题一大堆
比如说:把发送端的发送缓冲区和接收端的接收缓冲区都设为10M,那么一般情况下,就可以一次用send发送不超过10M的内容,是吗? (不考虑前面一次send没有处理完的数据)。
笨笨仔 2016-05-17
  • 打赏
  • 举报
回复
引用 楼主 screen12 的回复:
我用send来发送,返回值表示实际发送的字节数,如果小于我需要发送的字节数,就再循环发送。直到发送为止。 请问:这样的话,一次(包括多个循环发送的总和)可以最多发送多少数据?
直接将数据分块发送即可。返回值本意是错误检验,与其说让程序出错后再纠正,不如直接做正确的操作。
汪宁宇 2016-05-17
  • 打赏
  • 举报
回复
引用 7 楼 screen12 的回复:
[quote=引用 5 楼 wangningyu 的回复:] tcp还好,缓冲区可以设大一点,系统内部会处理,接收端注意一下就行了 udp就最好小点,受mtu限制,不然分包、丢包问题一大堆
比如说:把发送端的发送缓冲区和接收端的接收缓冲区都设为10M,那么一般情况下,就可以一次用send发送不超过10M的内容,是吗? (不考虑前面一次send没有处理完的数据)。[/quote] 设置缓冲区10M跟send 10M是两个概念的,并不是设多大就能发多大,最好按mtu的大小来,超大包问题会比较多的
_船长_ 2016-05-17
  • 打赏
  • 举报
回复
TCP一次可以发送多少字节,决定你提交给send缓冲区的大小。
汪宁宇 2016-05-17
  • 打赏
  • 举报
回复
tcp还好,缓冲区可以设大一点,系统内部会处理,接收端注意一下就行了 udp就最好小点,受mtu限制,不然分包、丢包问题一大堆
renwotao2009 2016-05-14
  • 打赏
  • 举报
回复
tcp 栈的接收缓冲,拥塞控制机制,链路的mtu 值
renwotao2009 2016-05-14
  • 打赏
  • 举报
回复
拥塞窗口和接收窗口中较小的那个
Eleven 2016-05-14
  • 打赏
  • 举报
回复
可以获取系统发送缓冲区的大小: getsockopt(SOCKET_HANDLE ,SOL_SOCKET,SO_SNDBUF, ...);
fhw217 2016-05-14
  • 打赏
  • 举报
回复
一次发送过多可能会导致发送超时,所以要限制每次的发送量,socket默认的缓冲区大小是8K。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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