TCP发送大的数据

发布于 2022-09-01 13:01:42 字数 79 浏览 9 评论 0

1、TCP如何发送一个比较大的数据(通过多次发送还是其他方法,比如while);
2、如何定义每次发送的buffer大小尽量减小丢包

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浅唱ヾ落雨殇 2022-09-08 13:01:42

楼主的问题很模糊,我只能根据我的理解解答了。
楼主用什么语言?我默认是C的话,如下:

  1. TCP发送不需要你太多关心,只要调用send(),操作系统的TCP实现会保证把你的数据发出去(网络畅通)。

  2. 收的时候可能需要recv()多次,因为TCP也不能保证发出去的包会一次都到达。需要加一个while()循环来保证收到全部的数据。

  3. 你指的BUFFER大小是什么?是TCP协议的BUFFER大小么?我默认是的,那这个BUFFER的大小是有操作系统默认的,一般是64KB, 当然也可以有程序设定的。操作系统还会有一个最大BUFFER的设置,默认可能是256KB, 也可能比这个大。如果为了优化TCP,你可以这样设置你的最大BUFFER大小:

    max buffer size = RTT(单位s) * bandwidth(单位Mbps) /8
    

    比如,你的带宽是100Mbps, RTT是150ms, 则需要至少1.875M的最大BUFFER。如果是Linux的话,你可以在/etc/sysctl.conf文件里这样设置:

    # increase TCP maximum buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    # increase Linux autotuning TCP buffer limits
    # min, default, and maximum number of bytes to use
    net.ipv4.tcp_rmem = 4096 87380 16777216 
    net.ipv4.tcp_wmem = 4096 65536 16777216
    

    保存后执行sysctl -p即可。(上面的数字是我瞎写的哦,不要当真,后果自负)

  4. 如果你指的BUFFER是你的程序里数据大小的话,你在发送时不需要关心,TCP会根据实际情况把你的大数据分组发送的。(当然,如果你的带宽足够,且MAX BUFFER SIZE设置也合理地足够大,可能会把你的大数据一次发出去也说不定呢)。

硬不硬你别怂 2022-09-08 13:01:42

TCP是流传输,直接使劲发就行,例如windows上可以用ws2的send函数猛发。不用考虑一次发多少,底层API会自动处理的,它发不出去会存放在内存,你不必自己再搞内存缓冲。
至于是否丢包,是网络状况决定的。当然你也可以在应用层协议上做包验证和重发机制。(个人觉得没什么必要,HTTP协议也没有验证和重发机制不照样用得好好的么。)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文