zoukankan      html  css  js  c++  java
  • Socket 缓冲

    1. TCP socket的接收和发送缓冲区:
    socket(PF_INET, SOCK_STREAM, 0);
    每个TCP Socket在内核中都有一个发送缓冲区和一个接收缓冲区, TCP的全双工工作模式以及TCP的滑动窗口就是依赖这两个独立的buffer以及buffer的填充状态。

    应用程序调用write()或send()时,仅仅是把应用程序buffer中的数据copy到socket的发送缓冲区中(write()或send()返回时,data并不一定已经发送到对端了),在适当的时机,内核会把socket发送缓冲区的数据发送到接收方的socket接受缓冲区。

    接收方的应用程序调用read()或receve()时,仅仅是从接收方的socket接受缓冲区中把数据copy到应用程序的buffer中。如果应用程序一直没有调用read()读取的话,此数据会一直缓存在相应的socket的接收缓冲区。

    如果发送端特别快的时候,缓冲区很快就被填满(socket默认的是1024×8=8192字节),这时候我们应该根据情况设置缓冲区的大小,可以通过setsockopt函数实现。通过getsockopt函数查看缓冲区的大小。

    getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);
    setsockopt(s,SOL_SOCKET,SO_RCVBUF, (char *)&rcv_size, optlen);

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

    2. UDP的接收缓冲区:
    每个UDP Socket都有一个接收缓冲区,没有发送缓冲区。有数据就直接发送,不管对方是否能够正确接收,也不管对端接收缓冲区是否已经满了。
    UDP是没有流量控制的;快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报。

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/linguoguo/p/12324381.html
Copyright © 2011-2022 走看看