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输出的更多相关文章

  1. UNIX网络编程读书笔记:基本UDP套接口编程

    概述 使用UDP编写的一些流行的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 如下图所示,给出了典型的UDP客户/服务器程序的函数调用: 客户不与服务器建立连 ...

  2. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  3. UNIX网络编程读书笔记:简介

    认知套接口编程接口 理解原始套接口(raw socket)的概念   值得注意的是,客户和服务器是典型的用户进程,而TCP和IP协议则通常是系统内核协议栈的一部分. 上图中在TCP和UDP之间留有间隙 ...

  4. UNIX网络编程读书笔记:原始套接口

    概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...

  5. UNIX网络编程读书笔记:UNIX域协议

    概述 UNIX域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通信的一种方法,所用API与在不同主机上执行客户/服务器通信所用的API(套接口API)相同.UNIX域协议可视为进程间通信 ...

  6. Unix 网络编程 读书笔记1

    第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64.► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32位的地址空 ...

  7. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  8. UNIX网络编程读书笔记:基本SCTP套接口编程

    概述 SCTP是一个较新的传输协议,于2000年在IETF得到标准化(TCP是在1981年标准化的).它最初是为满足不断增长的IP电话市场设计的:具体地说,就是穿越因特网传输电话信令. SCTP是一个 ...

  9. UNIX网络编程读书笔记:poll函数

    poll函数提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息. poll函数原型 #include <poll.h> int poll(struct pollfd * ...

随机推荐

  1. BZOJ 4276: [ONTAK2015]Bajtman i Okrągły Robin

    最大权值匹配,贪心匈牙利即可. 检查一些人是否能被全部抓住可以采用左端点排序,右端点优先队列处理. By:大奕哥 #include<bits/stdc++.h> using namespa ...

  2. BZOJ1084 SCOI2005最大子矩阵

    考虑DP f[i][j][k]表示一行到i一行到j共取k块最大值,类似于最长公共子序列n^2那种 注意相等时可以一起拿 By:大奕哥 #include<bits/stdc++.h> usi ...

  3. 【Kruskal+贪心思想】BZOJ3624-[Apio2008]免费道路

    国庆万岁!!!!! [题目大意] 给定一张无向图,有两种边的类型为0和1.求一个最小生成树使得边0有k条. [思路] 跑两次Kruskal. 第一次的时候优先选择边1,然后判断有哪些边0还不能连通,那 ...

  4. PIL The _imaging C module is not installed

    今天在WIN 7 64位用PIL的时候,提示 The _imaging C module is not installed ,原来是需要安装64位的. 刚开始安装的是这个:http://www.pyt ...

  5. [转]java中Collections.sort排序详解

      Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e, ...

  6. java 中hashcode 与 equals的关系

    equals()相等的两个对象,hashcode()一定相等: equals()不相等的两个对象,却并不能证明他们的hashcode()不相等. 反过来: hashcode()不等,一定能推出equa ...

  7. 阻止a标签跳转

       一.在html中 1. <a href="javascript:;"></a> 2. <a href="###">&l ...

  8. CentOS依赖包查找工具(https://centos.pkgs.org)

    https://centos.pkgs.org 通过这个地址,可以搜索出一些常用包放在哪些依赖或者仓库上.

  9. Ext.js 中 25种类型的Ext.panel.Tool

    通过Ext.panel.Panel的tools配置项来设置Ext.panel.Tool实例. 要注意的一点是,Ext框架提供的Ext.panel.Tool仅包含按钮图标而具体的点击事件处理函数需要我们 ...

  10. ELM327 OBD to RS232 Interpreters

    http://elmelectronics.com/DSheets/ELM327DS.pdf