TCP选项之SO_RCVBUF和SO_SNDBUF
来源:互联网 发布:golang mongodb 查询 编辑:程序博客网 时间:2024/05/20 05:08
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尺寸的。
转载自:http://blog.chinaunix.net/uid-29075379-id-3905006.html
1 0
- TCP选项之SO_RCVBUF和SO_SNDBUF
- TCP选项之SO_RCVBUF和SO_SNDBUF
- 套接字选项(SO_RCVBUF和SO_SNDBUF)
- SO_RCVBUF和SO_SNDBUF默认值
- SO_SNDBUF和SO_RCVBUF
- socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- SO_RCVBUF SO_SNDBUF
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
- UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)(SO_REUSEADDR)
- linux网络编程四:socket选项: SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF
- TCP的SO_RCVBUF与SO_SNDBUF的作用与意义
- setsockopt 与 SO_RCVBUF,SO_SNDBUF
- SO_REUSEADDR, SO_RCVBUF, SO_SNDBUF 简单用法
- netty tcp option SO_RCVBUF
- TCP滑动窗口和SO_RCVBUF之间的实际关系
- [总结]TCP滑动窗口和SO_RCVBUF之间的关系
- TCP滑动窗口和SO_RCVBUF之间的实际关系
- TCP滑动窗口和SO_RCVBUF之间的关系
- 双线性插值(Bilinear Interpolation)
- 部署好静态网页,上传文件在gh-pages分支转不到master的解决办法
- dom4j解析xml文档
- 4.文字在div垂直居中的方式
- VB查询数据库用于Ext.NET的Store
- TCP选项之SO_RCVBUF和SO_SNDBUF
- application/x-www-form-urlencoded
- Robolectric测试环境移除stetho
- 最详细的Log4j使用教程
- redis脚本:查看近一小时内有哪些用户登录过redis
- 项目管理心得:一个项目经理的个人体会、经验总结
- sql基本语句转载
- IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
- Thread Pool