博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
阅读量:5904 次
发布时间:2019-06-19

本文共 1290 字,大约阅读时间需要 4 分钟。

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,在累计确认点超过已发送的数据后,才可以从套接口缓冲区中删除这些数据。

转载地址:http://dedpx.baihongyu.com/

你可能感兴趣的文章
IT人士还是要善待自己
查看>>
复制或保存结果时包括列标题
查看>>
Forefront_TMG_2010-TMG发布Web服务器
查看>>
演示:在windows不同版本操作系统的计算机上安装IPv6协议与基本配置
查看>>
企业shell常见面试题及企业实战案例深入浅出讲解
查看>>
Load Test
查看>>
美文共赏
查看>>
RHEL6入门系列之十七,打包与压缩
查看>>
SQLite 3.7.13的加密解密(二)—— 开放宏定义
查看>>
禁止server 2008域端口的脚本
查看>>
数据结构图之二(最小生成树--普里姆算法)
查看>>
HTML输出 一 控制列背景颜色
查看>>
Redis for Windows(C#缓存)配置文件详解
查看>>
回忆2013年的点点滴滴(各个方面)
查看>>
ASP.NET MVC 4使用PagedList.Mvc分页
查看>>
HDOJ 2066 floyed优化算法
查看>>
window.onscroll
查看>>
开发常用动画收集
查看>>
[转]XCache 3.0.0 发布,PHP 性能提升方案
查看>>
【灵感】wifi通过wifi发送优惠信息
查看>>