- 浏览: 141047 次
文章分类
最新评论
每个 TCP 套接字都有一个发送缓冲区,可以使用 SO_SNDBUF 套接字选项来更改该缓冲区的大小。下图展示了某个应用进程写数据到一个 TCP 套接字时发生的步骤。
当某个应用进程调用 write 时,内核就从其缓冲区中复制所有数据到所写套接字的发送缓冲区。若该套接字的发送缓冲区容不下该应用进程的所有数据(比如应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程就会被投入睡眠(这里是说套接字阻塞的情况)。内核将不从 write 系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。因此,从写一个 TCP 套接字的 write 调用成功返回仅仅表示可以重新使用原来的应用进程缓冲区,并不表明对端的 TCP 或应用进程已接收到数据。
这一端的 TCP 提取套接字发送缓冲区中的数据并把它们发送给对端 TCP,其过程基于 TCP 数据传送的所有规则。对端 TCP 必须确认收到的数据,本端 TCP 只有在收到对端发来的 ACK 确认后才能从套接字发送缓冲区中丢弃已确认的数据。TCP 必须为已发送的数据保留一个副本,直到它被对端确认为止。
本端 TCP 以 MSS 大小的或更小的块把数据传递给 IP,同时给每个数据块安上一个 TCP 首部以构成 TCP 分节,其中 MSS 或是由对端通告的值,或是 536(若对端未发送一个 MSS 选项,536 是 IPv4 最小重组缓冲区字节数 576 减去 IPv4 首部字节数 20 和 TCP 首部字节数 20 的结果)。IP 给每个 TCP 分节安上一个 IP 首部以构成 IP 数据报,并按照其目的 IP 地址查找路由表以确定外出接口,然后把数据报传递给相应的数据链路。IP 可能在把数据报传递给数据链路之前将其分片,不过 MSS 选项的目的之一就是试图避免分片,较新的实现还使用了路径 MTU 发现功能。每个数据链路都有一个输出队列,如果该队列已满,则新到的分组将被丢弃,并沿协议栈向上返回一个错误。TCP 将注意到该错误,并在以后某个时刻重传相应的分节。应用进程并不知道这种暂时的情况。
接下来再来讨论 UDP 的输出情况。下图展示了某个应用进程写数据到一个 UDP 套接字时发生的步骤。
这里我们用虚线框展示套接字发送缓冲区,因为它实际上并不存在。任何 UDP 套接字都有发送缓冲区大小(可使用 SO_SNDBUF 套接字选项更改),不过它仅仅是可写到该套接字的 UDP 数据报的大小上限。如果一个应用进程写一个大于套接字发送缓冲区大小的数据报,内核将返回该进程一个 EMSGSIZE 错误。既然 UDP 是不可靠的,它不必保存应用进程数据的一个副本,因此无需一个真正的发送缓冲区(应用进程的数据在沿协议栈向下传递时,通常被复制到某种格式的一个内核缓冲区中,然而当该数据被发送之后,这个副本就被数据链路层丢弃了)。
这一端的 UDP 简单地给来自用户的数据报安上它的 8 字节的首部以构成 UDP 数据报,然后传递给 IP。IPv4 或 IPv6 给 UDP 数据报安上相应的 IP 首部以构成 IP 数据报,执行路由操作确定外出接口,然后或者直接把数据报加入数据链路层输出队列(如果适合于 MTU),或者分片后再把每个片段加入数据链路层的输出队列。如果某个 UDP 应用进程发送大数据报,那么它们相比 TCP 应用数据更有可能被分片,因为 TCP 会把应用数据划分成 MSS 大小的块,而 UDP 却没有对等的手段。
从写一个 UDP 套接字的 write 调用成功返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或它的某个片段,内核通常会返回一个 ENOBUFS 错误给它的应用进程(不过有些 UDP 的实现并不返回这种错误,这样甚至数据报未经发送就被丢弃的情况应用进程也不知道)。
下面再来看某个应用进程写数据到一个 SCTP 套接字中时发生的步骤。
因为 SCTP 是与 TCP 类似的可靠协议,所以从写一个 SCPT 套接字的 write 调用成功返回也仅仅是表示可以重新使用原来的应用进程缓冲区,并不表明对端的 SCTP 或应用进程已接收到数据。这一端的 SCTP 提取套接字发送缓冲区的数据并把它发送给对端 SCTP,其过程基于 SCTP 数据传送的所有规则。本端 SCTP 必须等待 SACK,在累积确认点超过已发送的数据后,才可以从套接字缓冲区中删除该数据。
当某个应用进程调用 write 时,内核就从其缓冲区中复制所有数据到所写套接字的发送缓冲区。若该套接字的发送缓冲区容不下该应用进程的所有数据(比如应用进程的缓冲区大于套接字的发送缓冲区,或是套接字的发送缓冲区中已有其他数据),该应用进程就会被投入睡眠(这里是说套接字阻塞的情况)。内核将不从 write 系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。因此,从写一个 TCP 套接字的 write 调用成功返回仅仅表示可以重新使用原来的应用进程缓冲区,并不表明对端的 TCP 或应用进程已接收到数据。
这一端的 TCP 提取套接字发送缓冲区中的数据并把它们发送给对端 TCP,其过程基于 TCP 数据传送的所有规则。对端 TCP 必须确认收到的数据,本端 TCP 只有在收到对端发来的 ACK 确认后才能从套接字发送缓冲区中丢弃已确认的数据。TCP 必须为已发送的数据保留一个副本,直到它被对端确认为止。
本端 TCP 以 MSS 大小的或更小的块把数据传递给 IP,同时给每个数据块安上一个 TCP 首部以构成 TCP 分节,其中 MSS 或是由对端通告的值,或是 536(若对端未发送一个 MSS 选项,536 是 IPv4 最小重组缓冲区字节数 576 减去 IPv4 首部字节数 20 和 TCP 首部字节数 20 的结果)。IP 给每个 TCP 分节安上一个 IP 首部以构成 IP 数据报,并按照其目的 IP 地址查找路由表以确定外出接口,然后把数据报传递给相应的数据链路。IP 可能在把数据报传递给数据链路之前将其分片,不过 MSS 选项的目的之一就是试图避免分片,较新的实现还使用了路径 MTU 发现功能。每个数据链路都有一个输出队列,如果该队列已满,则新到的分组将被丢弃,并沿协议栈向上返回一个错误。TCP 将注意到该错误,并在以后某个时刻重传相应的分节。应用进程并不知道这种暂时的情况。
接下来再来讨论 UDP 的输出情况。下图展示了某个应用进程写数据到一个 UDP 套接字时发生的步骤。
这里我们用虚线框展示套接字发送缓冲区,因为它实际上并不存在。任何 UDP 套接字都有发送缓冲区大小(可使用 SO_SNDBUF 套接字选项更改),不过它仅仅是可写到该套接字的 UDP 数据报的大小上限。如果一个应用进程写一个大于套接字发送缓冲区大小的数据报,内核将返回该进程一个 EMSGSIZE 错误。既然 UDP 是不可靠的,它不必保存应用进程数据的一个副本,因此无需一个真正的发送缓冲区(应用进程的数据在沿协议栈向下传递时,通常被复制到某种格式的一个内核缓冲区中,然而当该数据被发送之后,这个副本就被数据链路层丢弃了)。
这一端的 UDP 简单地给来自用户的数据报安上它的 8 字节的首部以构成 UDP 数据报,然后传递给 IP。IPv4 或 IPv6 给 UDP 数据报安上相应的 IP 首部以构成 IP 数据报,执行路由操作确定外出接口,然后或者直接把数据报加入数据链路层输出队列(如果适合于 MTU),或者分片后再把每个片段加入数据链路层的输出队列。如果某个 UDP 应用进程发送大数据报,那么它们相比 TCP 应用数据更有可能被分片,因为 TCP 会把应用数据划分成 MSS 大小的块,而 UDP 却没有对等的手段。
从写一个 UDP 套接字的 write 调用成功返回表示所写的数据报或其所有片段已被加入数据链路层的输出队列。如果该队列没有足够的空间存放该数据报或它的某个片段,内核通常会返回一个 ENOBUFS 错误给它的应用进程(不过有些 UDP 的实现并不返回这种错误,这样甚至数据报未经发送就被丢弃的情况应用进程也不知道)。
下面再来看某个应用进程写数据到一个 SCTP 套接字中时发生的步骤。
因为 SCTP 是与 TCP 类似的可靠协议,所以从写一个 SCPT 套接字的 write 调用成功返回也仅仅是表示可以重新使用原来的应用进程缓冲区,并不表明对端的 SCTP 或应用进程已接收到数据。这一端的 SCTP 提取套接字发送缓冲区的数据并把它发送给对端 SCTP,其过程基于 SCTP 数据传送的所有规则。本端 SCTP 必须等待 SACK,在累积确认点超过已发送的数据后,才可以从套接字缓冲区中删除该数据。
发表评论
-
Unix 域套接字与描述符的传递
2019-03-27 23:59 710在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 978Unix 域协议并不是一个实际的协议族,而是在 ... -
kqueue 接口
2019-03-06 00:47 690kqueue 接口是 ... -
辅助数据
2019-02-28 00:40 687辅助数据(a ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1553recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 1052在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 955在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2305在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 事件通知
2018-02-08 03:49 984SCTP 提供了多种可用的通知,用户可经由这些通知追踪 ... -
SCTP 套接字选项
2018-02-04 09:35 1691在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 1055SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 560SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 573下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 551在获取和设置套接 ... -
获取和设置套接字选项
2017-12-29 08:21 440下面几种方法可用 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 423poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 515select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 305Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 664下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 428网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ...
相关推荐
iperf3是一个强大的网络性能测试工具,主要用于评估TCP、UDP和SCTP协议的网络带宽。这个工具在IT行业中广泛应用于网络优化、故障排查和系统性能分析。它由C++编写,因此对C/C++开发者来说非常友好,同时也便于跨平台...
IP, UDP, TCP, SCTP 协议总结 根据提供的文件信息,我们可以总结出以下知识点: ...IP, UDP, TCP, SCTP 等协议各有其特点和应用场景,了解这些协议的特点和差异,对于网络编程和网络管理非常重要。
iperf3:TCP,UDP和SCTP网络带宽测量工具概述iperf是用于主动测量IP网络上最大可达到带宽的工具。 它支持调整与ti iperf3相关的各种参数:TCP,UDP和SCTP网络带宽测量工具总结iperf是用于主动测量IP网络上最大可达到...
iperf3:TCP,UDP和SCTP网络带宽测量工具 概括 iperf是用于主动测量IP网络上最大可达到带宽的工具。 它支持调整与时序,协议和缓冲区有关的各种参数。 对于每个测试,它都会报告测得的吞吐量/比特率,损耗和其他参数...
例如,`Nping`是Nmap项目的一部分,它提供TCP、UDP、ICMP和 SCTP协议的测试功能。通过Nping,你可以发送自定义的UDP数据包,并测量响应时间,这对于诊断网络延迟问题非常有用。 除了这些基础工具,还有一些高级的...
SCTP结合了TCP的可靠性和UDP的高效性,同时引入了多宿主和多流特性,增强了网络容错能力。 SCTP协议的核心特点: 1. **多宿主支持**:与TCP不同,SCTP允许两端点声明多个IP地址,这使得协议可以在一个连接失效时...
使用iperf3,你可以调整与时序、缓冲区和协议(如TCP、UDP、SCTP)相关的几个参数。它对网络性能调优操作很方便,为了获得最大或相当改善的网络性能,你需要增加吞吐量以及网络接收个发送功能的延迟。但是在进行实际...
本话题将围绕“Tcp&Udp测试工具和抓包工具及代码测试”展开,介绍相关的知识点和实用工具。 首先,TCP是一种面向连接的、可靠的协议,它确保数据包按顺序无丢失地传输。而UDP则是一种无连接的、不可靠的协议,其...
此外,某些协议,如Diameter和SCTP,结合了TCP和UDP的特点,提供了一种更灵活的解决方案。 总的来说,TCP和UDP都是网络通信的重要组成部分,它们各有优缺点,适用于不同的场景。理解这两种协议的工作原理和适用范围...
hping3是一款功能丰富的网络诊断工具,除了TCP和UDP,还支持ICMP和SCTP协议的测试。它可以模拟各种网络条件,用于渗透测试和故障排查。 在实际使用中,选择TCP还是UDP主要取决于应用场景。对于需要稳定性和可靠性的...
1. **hping3**:这是一个命令行工具,可以用于TCP、UDP、ICMP和SCTP协议的包嗅探、负载测试和端口扫描。 2. **iperf**:它用于测量网络带宽和延迟,支持TCP和UDP,可以评估网络性能和调整网络参数。 3. **UDPCat**...
SCTP(Stream Control Transmission Protocol,流控制传输协议)是一种位于网络层之上的传输层协议,与TCP(传输控制协议)和UDP(用户数据报协议)一样,它为应用程序提供了在互联网上传输数据的机制。SCTP的设计...
总结来说,SCTP是一种结合了UDP的轻量级和TCP的可靠性的传输协议,尤其适合需要高可靠性、多路径和拥塞控制的场景,如VoIP、金融服务和分布式系统之间的通信。在Linux服务器环境中,SCTP可以作为替代TCP或UDP的选择...
在Linux环境下,SCTP(Stream Control Transmission Protocol)是一种面向连接的、可靠的传输协议,它在互联网协议栈中位于传输层,与TCP和UDP并列。SCTP的设计旨在提供比TCP更高级别的可靠性,同时避免了UDP的无...
**SCTP**(Stream Control Transmission Protocol,流控制传输协议)是一种高级的传输层协议,它被设计用于解决传统TCP(Transmission Control Protocol,传输控制协议)和UDP(User Datagram Protocol,用户数据报...
SCTP(Stream Control Transmission Protocol,流控制传输协议)是一种面向连接的传输层协议,旨在解决传统TCP和UDP在某些应用场景下的不足。以下详细阐述了SCTP的相关知识点。 1. SCTP的提出背景 在SCTP出现之前,...
NS2支持多种传输协议的模拟,包括TCP、UDP和SCTP。通过这些示例代码,用户可以学习如何配置和运行SCTP协议,理解其工作原理和特性。 "SCTP ns2_ns2 example_sctp tcl_sctp tcl_codes_sctp wireless"这些标签进一步...
它在互联网协议栈中位于传输层,与TCP和UDP同级,但提供了比TCP更强的可靠性以及比UDP更高的效率。FreeBSD操作系统是一个开源的类UNIX系统,它在内核中支持多种协议,包括SCTP。 在"freebsd7.0"版本中,SCTP的源码...