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,在累计确认点超过已发送的数据后,才可以从套接口缓冲区中删除这些数据。
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出的更多相关文章
- UNIX网络编程读书笔记:基本UDP套接口编程
概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- UNIX网络编程读书笔记:简介
认知套接口编程接口 理解原始套接口(raw socket)的概念 值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
- UNIX网络编程读书笔记:UNIX域协议
概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...
- Unix 网络编程 读书笔记1
第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64.► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32位的地址空 ...
- UNIX网络编程读书笔记:套接口选项
概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...
- UNIX网络编程读书笔记:基本SCTP套接口编程
概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...
- UNIX网络编程读书笔记:poll函数
poll函数提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息. poll函数原型 #include <poll.h> int poll(struct pollfd * ...
随机推荐
- appengine 云计算。 部署web网络。
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha appengine 可以 不用手动启动像服务器. 在eclipse中 这两个sdk 配好 ...
- 我的OI生涯 第五章
我的OI生涯 第五章 千古诗才,蓬莱文章建安骨 一身傲骨,青莲居士谪仙人 李白追月逆江河 包黑斩龙顺民心 豪气压群雄,能使力士脱靴,贵妃捧砚; 仙才媲众美,不让参军俊逸,开府清新 我辈此中惟饮酒 先生 ...
- DEDECMS最新友情链接getshell漏洞分析
先上exp: <?php //print_r($_SERVER); $referer = $_SERVER['HTTP_REFERER']; $dede_login = str_replace( ...
- arraylist-lambada-性能测试
package cn.com.one;import java.util.ArrayList;public class ttt { public static void main(String [] a ...
- CCTableView使用及其ViewSize动态调整
cocos2dx的CCTableView使用及其ViewSize动态调整,直接上代码参考如下: // // summary : 水平滑动样式的TableView用法 void createGlobal ...
- asp.net mvc中DropDownList
asp.net mvc中DropDownList的使用. 下拉列表框 以分为两个部分组成:下拉列表和默认选项 DropDownList扩展方法的各个重载版本基本上都会传递到这个方法上: publi ...
- CentOS 6.9开启iptables的日志实现调试
系统日志配置在CentOS 5上叫syslog,而在CentOS 6上叫rsyslog(增强版的syslog),CentOS 5上的配置文件在/etc/syslog.conf下,而CentOS 6在/ ...
- MOSFET enhances voltage regulator's overcurrent protection
The classic LM317 adjustable-output linear voltage regulator offers a relatively high, if package-de ...
- 3DShader之法线贴图(normal mapping)
凹凸贴图(bump mapping)实现的技术有几种,normal mapping属于其中的一种,这里实现在物体的坐标系空间中实现的,国际惯例,上图先: 好了讲下原理 可以根据高度图生成法线量图,生成 ...
- C#:让您知道您的方法是被何“人”调用
我们要在DisabledObsoleteMethod函数里限制具有“Obsolete”属性的方法调用,我们如何去做呢?在.Net中提供了一个"StackFrame"类用于表示当前线 ...