转载自:https://blog.csdn.net/Swallow_he/article/details/84392285

1、TCP. SO_RCVBUF & TCP. SO_SNDBUF

每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。

1.1 接收端冲区

接收缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。不管进程是否调用recv()读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。

recv(),就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,并返回;

1.2发送缓冲区

进程调用send()发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send()返回之时,数据不一定会发送到对端去(和write写文件有点类似)。

send(),仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中,发送是TCP的事情,和send其实没有太大关系。

1.3 实际应用

接收缓冲区被TCP和UDP用来缓存网络上来的数据,一直保存到应用进程读走为止。

对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后,发生的动作是:接收端通知发发端,接收窗口关闭(win=0)。这个便是滑动窗口的实现。保证TCP套接口接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它。

1.4 问题

能发出多少TCP包以及每个包承载多少数据,除了受到自身服务器配置和环境带宽影响,对端的接收状态也能影响你的发送状况。

查看测试机的socket发送缓冲区大小,如图1所示:

第一个值是一个限制值,socket发送缓存区的最少字节数;
第二个值是默认值;
第三个值是一个限制值,socket发送缓存区的最大字节数;
根据实际测试,发送缓冲区的尺寸在默认情况下的全局设置是16384字节,即16k。
proc文件系统下的值和sysctl中的值都是全局值,应用程序可根据需要在程序中使用setsockopt()对某个socket的发送缓冲区尺寸进行单独修改。

解决思路:通过合理的设置“TCP.SO_RCVBUF & TCP.SO_SNDBUF”来提高系统的吞吐量以及快速检测tcp链路的连通性; 这两个选项就是来设置TCP连接的两个buffer尺寸的。

2、UDP接收缓冲区

每个UDP socket都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。

UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。

3、总结

这也是TCP可靠,UDP不可靠的表现。

TCP/UDP的接收缓冲区和发送缓冲区相关推荐

  1. unity网络实战开发(丛林战争)-前期知识准备(004-开发TCP客户端的接收数据和发送数据)

    使用工具:VS2015 使用语言:c# 作者:Gemini_xujian 参考:siki老师-<丛林战争>视频教程 继上一篇文章内容,这节课讲解一下客户端的接收数据和发送数据. 首先在现有 ...

  2. gprs发送信号对方如何接收_和接收缓冲区比较:Netty发送缓冲区是如何设计的,why?...

    点击上方蓝字关注我吧! 本篇文章大概3300字,阅读时间大约10分钟 前面文章,透彻分析了Netty的接收缓冲区优化的套路和实现细节,以及写数据和刷新数据的宏观流程和细节: 从源码出发:在宏观上把握N ...

  3. 网络原理之TCP/UDP协议

    UDP协议 UDP协议端格式 16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度; 如果校验和出错, 就会直接丢弃 UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的 ...

  4. 网络原理TCP/UDP

    文章目录 TCP TCP协议段格式 可靠机制 确认应答机制 超时重传机制 连接管理机制 建立连接--三次握手 断开连接--四次挥手 常见问题 效率机制 滑动窗口 流量控制机制 拥塞控制 延迟应答 捎带 ...

  5. 网络原理之TCP/UDP IP

    1 TCP/IP协议五元组:源ip+源端口号+目的ip+目的端口+协议号 windows 查看某个端口: netstat -ano|findstr "想要查看的端口号".会显示某个 ...

  6. 网络基础(二)之TCP/UDP协议

    目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 pidof netstat UDP协议 UDP协议端格式 对于16位UDP长度的理解 ...

  7. QQ--基于TCP/UDP协议的通讯原理

    QQ是一个基于TCP/UDP协议的通讯软件  发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服 务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!   一 ...

  8. qt tcp接收缓冲区设置_TCP的发送缓冲区

    (一)基础知识 IPv4 数据报最大大小是65535(16位),包括IPv4头部. IPv6 数据报最大大小是65575,包括40个字节的IPv4头部 MTU,这是由硬件规定的,如以太网的MTU是15 ...

  9. Linux设置网络缓冲区大小(TCP/UDP)

    一.修改套接字socket的缓存大 echo 65536 > /proc/sys/net/core/rmem_max        #收缓冲区最大值 echo 256960 > /proc ...

最新文章

  1. Atitit.eclipse 4.3 4.4  4.5 4.6新特性
  2. 有哪些通俗易懂的例子可以解释 IaaS、PaaS、SaaS 的区别?
  3. awk 实例练习 (三)
  4. excel if in函数_【Excel函数】Small+Index+IF 一对N返回
  5. 图解 继电器模组接线图_交流接触器,继电器的知识你了解多少?(值得收藏)...
  6. Arm架构下VUE环境的安装
  7. 推陈出新:12C 推进 SCN 新方法实践
  8. hadoop,spark的启动及DataNode无法启动的解决方法
  9. Jenkins任务优先分配到原来的执行节点上
  10. jqGrid获取数据库数据的方式
  11. SetWindowLong 除去窗体标题栏
  12. 如何通过NTFS for Mac 15格式化连接的移动磁盘
  13. (考勤记录导出教程)指纹考勤机科密C21
  14. 06 Redis中BigKey、HotKey的发现与处理
  15. android 布局滑动消失,SlideUp-Android
  16. 2018年中国大数据BI行业分析报告!
  17. 夯实Java基础系列9:深入理解Class类和Object类
  18. 十进制与8421码、5421码、2421码、余3码之间的转换
  19. 30个计算机相关的英语词汇,计算机应用常用英语词汇30
  20. 阿里三面:你的日志采集系统是怎么做的?用了那些高大上的技术呢?

热门文章

  1. mysql 360 atlas_360 Atlas中间件安装及使用
  2. 高中必备学习软件_10个适合高中生学习的网站amp;软件,完全免费,9科全覆盖!...
  3. Redis09-集群相关笔记
  4. python读取配置文件获取所有键值对_python读取配置文件 变量 ConfigParser模块
  5. fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...
  6. 机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
  7. 8皇后问题--回溯法 (循环递归)
  8. 【Unity入门】场景、游戏物体和组件的概念
  9. Flipping elements with WPF
  10. 40款免费社交图标素材