首页 > 其他分享 >SO_RCVBUF SO_SNDBUF***

SO_RCVBUF SO_SNDBUF***

时间:2023-04-25 15:32:42浏览次数:20  
标签:SNDBUF socket buffer UDP TCP 接收缓冲区 SO 内核 RCVBUF


SO_RCVBUF SO_SNDBUF

先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。read所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,仅此而已。进程调用send发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send返回之时,数据不一定会发送到对端去(和write写文件有点类似),send仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中。后续我会专门用一篇文章介绍read和send所关联的内核动作。每个UDP socket都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。

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

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

UDP:当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。
以上便是TCP可靠,UDP不可靠的实现。
这两个选项就是来设置TCP连接的两个buffer尺寸的

标签:SNDBUF,socket,buffer,UDP,TCP,接收缓冲区,SO,内核,RCVBUF
From: https://blog.51cto.com/u_16081664/6224152

相关文章

  • Supervisor
    安装pip install supervisor生成配置配置文件#查看默认模板语法echo_supervisord_conf生成配置文件echo_supervisord_conf > <虚拟环境>/etc/supervisor.conf添加项目配置1.在<虚拟环境>/etc下创建supervisord.d文件夹mkdirsupervisord.d2.在supervisord.d......
  • 办公套件Microsoft Office LTSC 2021最新中文Mac版
    MicrosoftOfficeLTSC2021(office全家桶)中文版是Microsoft为Mac用户推出的一款新iPadMac系列电脑、iPad桌面应用程序。OfficeLTSC2021是MicrosoftOffice系列电脑、iPad电脑和桌面应用程序的新一代操作系统和办公自动化产品。它采用了Mac和Linux操作系统的同步版......
  • 使用GPU加速TensorFlow-Keras
    之前一直在用CPU训练TensorFlow模型,现在来尝试一下GPU训练。【1】安装GPU必要的软件环境显卡:MX450(支持CUDA11.7以下版本)软件1:VisualStudio2019Community软件2:Cuda10.1update2软件3:cuDNN8.0.5forwin10(x86) 环境:在Anacodna中专门建立tensorflow_gpu环境Python3.7......
  • Spring Boot Configuration Annotation Processor not configured
    一、Springboot自定义配置实现自动提示@ConfigurationProperties的作用:让JavaBean中属性值要和配置文件进行映射@Getter@Setter@ConfigurationProperties(prefix="jwt")publicclassJwtProperties{/***JWT加解密使用的密钥*/privateString......
  • Solr学习之五:Solr查询参数及语法
    一.查询参数1.CoreQueryParam查询的参数1)q:查询字符串,必须的。2)q.op:覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定。3)df:默认的查询字段,一般默认指定。4)qt:querytype,指定查询使用的QueryHandler,默认为“standard”。5)wt:write......
  • Solr之缓存篇
    Solr在Lucene之上开发了很多Cache功能,从目前提供的Cache类型有:(1)filterCache(2)documentCache(3)fieldvalueCache(4)queryresultCache而每种Cache针对具体的查询请求进行对应的Cache。本文将从几个方面来阐述上述几种Cache在Solr的运用,具体如下:(1)Cache的生命周期(2)Cache的使用场景(3)C......
  • java中使用RedisTemplate读取数据异常 Missing type id when trying to resolve subt
    java中使用RedisTemplate读取数据异常Missingtypeidwhentryingtoresolvesubtypeof[simpletype,classjava.lang.Object]:missingtypeidproperty'@class'at[Source:(byte[])"报错:Causedby:com.fasterxml.jackson.databind.exc.InvalidTypeIdExcep......
  • js字符串与json对象处理
    直接上代码:<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>点绘制济南省</title></head><bodystyle="margin:0;overflow:hidden;background:#fff;width:100%;height:100%;position:absolu......
  • 8.solidwork装配体太大,用大型设计审阅打开可以装配不能编辑,速度最快
     轻化零部件、大型装配体模式等方法的使用,通过这些方法可以提高打开装配体的速度。其实还可以进一步提高打开装配体的速度,那就是使用设计审阅。设计审阅能快速打开装配体,甚至非常大的装配体,同时可以进行装配体设计审阅时有用的各项功能,包括如下:导览设计树、测量距离、生成横断......
  • 集成Hawk 2.0.1,遇到gson冲突的解决办法
    这个错误提示是因为在两个不同的库中都包含了相同的类(com.google.gson.ExclusionStrategy)。解决方法如下:删掉其中一个库。如果你的项目中只需要其中一个库,那么可以直接删除另一个库,或者将其从依赖中移除。升级库版本。如果两个库都是必需的,那么可以尝试升级其中一个库的版本......