UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
TCP输出
下图展示了应用进程写数据到TCP套接口的过程。
每一个TCP套接口有一个发送缓冲区,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小。
当应用进程调用write时,内核从应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用进程的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,这通常也是它的默认设置。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区,内核才会从write系统调用返回。
因此,从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程的缓冲区。它 并不告诉我们对端的TCP或应用进程已接收到数据。
TCP取套接口发送缓冲区的数据并把它发送给对端TCP,其过程基于TCP数据传送的所有规则。对端TCP必须确认收到的数据,只有收到对端的ACK,本端TCP才能删除套接口发送缓冲区中已确认的数据。TCP必须保留数据拷贝直到对端确认为止。
UDP输出
下图展示了应用进程写数据到UDP套接口的过程。
注意,上图中套接口发送给缓冲区用虚线框,因为它实际上并不存在。UDP套接口有发送缓冲区大小(可用SO_SNDBUF套接口选项修改),不过它仅仅是写到套接口的UDP数据报的大小上限。如果应用进程写一个大于套接口发送缓冲区大小的数据报,内核将返回一个EMSGSIZE错误。
既然UDP是不可靠的,它不必保存应用进程的数据拷贝,因此无需一个真正的发送缓冲区。(应用进程的数据在沿协议栈向下传递时,以某种形式拷贝到内核的缓冲区,然而数据链路层在发送出这些数据后将丢弃该拷贝。)
从写UDP套接口的write调用成功地返回表示用户写入的数据报或其所以片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或它的某个片段,内核通常将给应用进程返回一个ENOBUFS错误。
SCTP输出
下图展示了应用进程写数据到SCTP套接口的过程。
SCTP是类似TCP的可靠协议,它的套接口也有一个发送缓冲区,而且跟TCP一样,我们可以用SO_SNDBUF套接口选项来改变这个缓冲区的大小。
当应用进程调用write时,内核从应用进程的缓冲区中拷贝所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用进程的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,这通常也是它的默认设置。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区,内核才会从write系统调用返回。
因此,从写一个SCTP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程的缓冲区。它 并不告诉我们对端的SCTP或应用进程已接收到数据。
SCTP取套接口发送缓冲区的数据并把它发送给对端SCTP,其过程基于SCTP数据传送的所有规则。SCTP必须等待SACK,在累计确认点超过已发送的数据后,才可以从套接口缓冲区中删除这些数据。
最新文章
- laravel强大功能路由初探(二)
- ng-repeat 里 使用ng-show ng-hide出现闪动
- Node+Socketio实现消息群发功能
- js跳转方法
- java懒汉式单例遇到多线程
- 射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作
- 同步linux服务器的时间
- 解决Ubuntu系统中文乱码显示问题,终端打开文件及查看目录
- 关于JAVA中hashCode
- vagrant极简教程:快速搭建centos7
- BZOJ 3613: [Heoi2014]南园满地堆轻絮(二分)
- springmvc 整合Controller出现实例化两次问题
- 找工作的程序员必懂的Linux
- Android ViewSwitcher 的功能与用法
- Wordpress无法连接Mysql8的问题
- DIOCP-DIOCPv5的处理能力
- 重定向android log
- jQuery-animate万能动画效果
- 对最近java基础学习的一次小结
- leetCode 33.Search in Rotated Sorted Array(排序旋转数组的查找) 解题思路和方法
热门文章
- codevs 1226 倒水问题
- Codeforces Round #305 (Div. 1) A. Mike and Frog 暴力
- URL资源跨域访问 跨域使用session信息
- iOS开发 跳转场景的三种方式
- ASCII表 基本记忆 -- C
- MOSFET enhances voltage regulator's overcurrent protection
- gcc连接脚本lds详解
- VS2017安装后如何移动 Windows Kits文件夹
- .NET:遇到并发问题,什么样的情况下需要自动重试?
- 深入解析OkHttp3