Logo cn.artbmxmagazine.com

传输控制协议TCP

目录:

Anonim

TCP是一种面向连接的传输协议。这确保了数据的传送没有错误,没有遗漏,没有顺序。

具有以下特点:

  • 面向连接的协议。也就是说,应用程序请求到目标的连接,然后使用该连接来传递数据,以确保点对点地传递数据而不会出现问题。TCP连接有两端,即发送方和接收方。TCP保证传输的数据将被传递而不会造成任何丢失,重复或传输错误。参与TCP连接的端点可以同时在两个方向上交换数据。使用三向握手可确保连接两端之间可靠且同步的起始连接。TCP保证在连接结束之前传送所有数据。
信息系统tcp-1

TCP是OSI层的4级协议(传输),因此它需要使用IP来发送其段或消息。这样,IP便将TCP消息视为它必须传递的信息,并且它绝不会尝试解释其内容,这通常是将消息从一个下层传递到另一层时所做的。这就是为什么路由器或任何OSI 3级设备只能观察IP报头来转发数据报的原因。从网络层接收到TCP消息后,负责解释TCP消息的人就是目标计算机的TCP。

1.1。TCP功能

TCP是一个相当大的协议,它可以实现许多功能:

  • 将端口与连接相关联使用三步协议建立连接执行缓慢的启动以避免过载将数据分为多个部分进行传输编号数据处理重复的进入部分计算校验和调节流量使用发送和接收窗口进行数据传输有序终止连接中断连接标记紧急数据肯定的重新传输确认重新传输时间的计算减少网络拥塞时的流量指示段乱序。检查接收窗是否关闭。

1.2。概念

1.2.1。进出口流量

连接的概念模型是一个应用程序将数据流发送到另一对等应用程序。同时,它从另一个接收数据流。TCP提供了一种双工服务,可以同时处理两个数据流。

1.2.2。区隔

TCP必须转换应用程序的传出数据流,以便它们可以作为数据报来传递。应用程序将数据移至TCP,然后TCP将其放置在发送缓冲区中。取一部分数据,向其添加标题,创建一个段。

TCP将段转换为IP,以将其作为单个数据报来传递。将数据打包到适当大小的块中可以更有效地使用流服务,因此TCP在创建切片之前应等待收集合理数量的数据。

1.2.3。推

有时,客户端程序需要TCP才能将数据尽快传递到远程服务器应用程序,为此,它使用了{push}函数。让我们想象一下,一个客户端程序已经启动了与远程服务器的交互式会话,并且用户键入了命令并按下了回车键。客户端程序将使用此功能来告诉TCP尽快传递所述数据。

1.2.4。应用端口

TCP与本地进程之间的接口称为端口。为了使应用程序访问网络并通过它发送数据,它必须通过端口进行操作。应用程序使用端口号发送数据流,而连接的另一端通过另一个端口号接收数据流。

在TCP和UDP中,端口都用介于0到65,535之间的十进制数字标识。尽管Internet分配号码授权机构(IANA)已将0到1,023的范围专用于许多通用进程(RFC 1700),但是实施TCP的制造商在为进程分配端口号方面拥有很大的自由度。 ),例如telnet,f​​tp,pop3,smtp等。

客户端每次需要连接时,都会要求操作系统为其分配一个废弃的端口号,而不进行保留。在连接结束时,客户端将端口返回到系统,并且可以被另一个客户端使用。

端口应用说明

9放弃放弃所有传入的数据

19个电荷交换字符流

20 FTP-Data数据传输端口,用于文件传输

21个FTP对话端口用于数据传输

23 Telnet使用Telnet的远程连接端口

25 SMTP简单邮件传输协议端口

110 POP3电子邮件检索服务

119 NNTP网络新闻发布服务

标准化TCP端口列表。

要完全指定连接,主机的IP地址将添加到端口号。此组合称为套接字。因此,套接字编号在整个Internet上是唯一的。两个主机之间的连接由分配给该连接的每个终端的套接字完全描述。两个套接字之间的连接在两个进程之间提供了双向(全双工)通信路径。

TCP使用两种类型的套接字:

  • 电源插座。与TCP一起使用,以进行可靠,顺序和双向的数据交换数据报套接字。它们与UDP一起使用以实现不可靠的双向数据传输。

套接字是TCP,进程和应用程序之间的应用程序接口(API)。该API允许程序员访问其应用程序的TCP。

TCP为传输到IP的每个段格式化报头。当IP构造IP数据报时,TCP头跟随IP头。

IP段以16位字组织。如果段中包含奇数个八位位组,则将其填充由全零组成的最终八位位组。

TCP头的字段如下:

  • 源端口(16位)。指定源TCP模块的端口,目标端口(16位)。指定目标TCP模块的端口,序列号(32位)。指定数据段中第一个八位位组的顺序位置。当网段打开连接(SYN位置1)时,序列号是初始序列号(ISN),数据字段的第一个八位位组是数字ISN + 1确认号(32位)。指定该段的发送者期望的下一个序列号。 TCP表示此字段是通过将ACK位置1来激活的,只要建立连接即会发生标题大小(4位)。指定组成TCP头的32位字的数量。如果需要,在Options字段中填充零以形成完整的32位字(保留)(6位)。它的值必须为零。保留供将来使用,控制位(6位)。是6:

oACK。如果为1,则表明字段确认号是有效的。

哦。如果为0,则表示应将其忽略。如果为1,则表示数据紧急。

oPSH。启动{push}函数。指示TCP是否应立即将数据传递到应用程序。

首先。表示错误,也用于中止会话。

oSYN。同步连接的序列计数器。当网段请求打开连接时,该位置1。

或结束。传输结束并关闭连接。成功完成期间将其设置为1。

  • 窗口(16位)。指定段的接收者可以从“确认”字段中指定的八位字节开始接受的八位字节的数目,校验和(16位)。基于标题和数据字段的校验和。它不包括用于包含偶数个八位字节的段的填充。校验和还基于96位伪标头紧急指针(16位)。标识紧随紧急数据之后的八位位组的序号。紧急指针是相对于segment.Options(变量)的序列号的正偏移量。这些选项可以完成几个功能:选项列表的末尾,最大段大小,最大段大小的可选数据等,等等。填充(变量)。具有零值的八位位组被添加到报头以将其长度舍入为32位。

一个12字节的TCP伪标头包括源和目标地址,协议和段长度。此信息与网段一起发送到IP,以保护TCP免受错误路由的网段的影响。长度字段值包括标头和TCP数据,但不考虑伪标头。

1.3.1最大段大小选项

最大段大小(MSS)选项用于指示可以从数据流接收(和重新组合)的最大数据块的大小。系统的最大段大小定义为:

可以接收的最大数据报的大小-40

换句话说,当IP和TCP标头为20个字节时,MSS报告最大的接收器数据有效载荷大小。如果标题选项数目众多,请减去其大小。也就是说,要计算可打包到段中的数据的大小,TCP需要计算:

广告的MSS + 40-(IP和TCP标头的大小)

通常,端点在建立连接时会与初始消息{SYN}一起交换其相应的MSS值。如果系统未指示其段大小,则假定MSS的默认值为536字节,最大为65,535字节。

MSS对TCP可以发送的最大大小施加限制,接收者无法处理更大的任何内容。但是由于连接路径的MTV大小,发送方TCP可以发送较小的段。

1.3.2。连接请求中的标头

发送来发起连接的第一个段的{SYN}标志为1,{ACK}标志为0。初始的{SYN}段是唯一一个具有{ACK}字段为0的段。防火墙这样做。它们用于控制TCP会话的传入请求。

字段{序列号}(序列号)包含初始序列号。{Window}(窗口)字段包含接收窗口的初始大小。

TCP中当前设置的唯一选项是TCP可以接收的最大段大小。此参数的最大大小为32位,并且通常包含在连接请求的{options}字段中(如果未指定MSS,则默认值为536)。包含MSS选项的TCP {SYN}标头的大小为24个字节。

1.3.3。连接响应中的标头

在连接接受响应中,两个标志{SYN}和{ACK}设置为1。响应者的初始序列号在{序列号}字段中,而接收窗口的初始序列号在该字段中。字段{Window}。响应者希望接收的段的最大大小通常包含在连接响应的{options}字段中。它的大小可以与发起连接的人的大小不同,但不必相同。

通过将响应中的{RST}标志设置为1,可以拒绝连接请求。

1.3.4。选择起始序号

在建立连接期间,TCP规则指示连接的每个末端应从内部32位时钟中选择一个{start sequence number}。为什么?。想象一下当系统停止工作时会发生什么。假设用户在连接停止工作之前就已经打开了连接,并且已经发送了少量数据。恢复后,系统不记得它停止工作之前所做的任何事情,包括已建立的连接和分配的端口号。用户必须再次启动连接。开始分配端口号的方式是,第一个请求该端口号的人是第一个被授予端口号的人,而这些端口中的某些端口可能在几秒钟前就被其他连接使用。在此时间间隔内,远离连接之一的系统可能尚未意识到另一端已停止工作并再次停止工作,如果将花费时间才能到达网络的旧数据与来自网络的数据混合在一起,可能会造成极大的混乱。一个新的连接。通过使新时钟从某个时钟值开始,可以防止产生此问题。旧数据可能会使用{序列号}新范围之外的值进行编号通过使新时钟从某个时钟值开始,可以防止产生此问题。旧数据可能会使用{序列号}新范围之外的值进行编号通过使新时钟从某个时钟值开始,可以防止产生此问题。旧数据可能会使用{序列号}新范围之外的值进行编号

1.3.5。字段的一般用途

为了准备TCP报头的传输,在字段{序列号}中包括第一个八位位组的序列号。

字段{confirmation number}填充了另一端期望的下一个八位位组的编号,并且位{ack}设置为1。

{window}字段包含接收窗口的当前大小,即:可从{confirmation number}开始的字节数。这样,可以实现非常精确的流量控制。会话期间将接收窗口的确切状态告知另一端。

如果应用程序向TCP发送{push},则{push}标志将设置为1。接收TCP应该通过将数据传递到其应用程序的速度与应用程序希望接收的速度一样,对{push}标志作出反应。 。

如果{urgent}标志设置为1,则表示存在紧急数据待处理,指针{urgent}指向紧急数据的最后一个八位位组。

{reset}标志设置为1以中止连接。也可以将其置于对在TCP处理的当前连接中没有意义的段的响应。

在用于关闭连接的消息中,{end}标志设置为1。

1.3.6。校验和

IP校验和仅适用于IP标头。TCP校验和适用于整个段以及使用从IP标头提取的信息构造的伪标头。

TCP大小是通过将TCP头的大小加上数据的大小相加得出的。TCP总和是必需的,而不是UDP中的可选。在输入段中,将计算TCP报头的校验和。如果值不匹配,则丢弃该段。

1.4。建立连接

在能够进行通信之前,各方都要调用一个子例程,该例程创建一个内存块,以在连接期间存储TCP和IP参数,例如套接字的地址,当前序列号,初始值。一生的IP等。客户端要访问服务器时,它将使用服务器的IP地址和端口启动连接请求。连接过程称为三步协议:SYN,SYN和ACK。

在建立连接期间,重要信息会交换。各方通知对方:

  • 缓冲区中可用于接收数据的可用空间中,一个段可以承载的最大数据量将用于对输出数据进行编号的初始序列号。

1.5。数据传输

完成三个步骤的建立之后,便开始数据传输。

客户

TCP协议

服务器

TCP协议

数据流及其ACK。

上面的示例显示了直接数据交换。为了方便编号,使用了1000字节的消息。

所有TCP段头均携带一个ACK字段,该字段标识另一端期望的下一个字节的序列号。客户端发送的第一个段包含字节1001到2000。其ACK字段宣布,它期望从服务器获取的下一个字节的序列号为3001。服务器以一个包含1000字节数据的段作为响应,该段起始于服务器。 3001。TCP报头中的ACK字段指示已成功接收到字节1001至2000,因此来自客户端的下一个字节的预期序列号为2001。然后,客户端发送以以下位置开始的段:字节2001、3001和4001。请记住,客户端不必等待每个段的ACK到达。只要缓冲区中有未使用的空间,就可以将数据发送到另一端。这样,如果使用单个ACK指示正确接收了所有段,则服务器可以节省带宽。

1.6。流量控制

接收数据的TCP处理传入数据的流。接收者决定要接收多少数据,发送者必须在这些限制内采取行动。在建立连接期间,各方为该连接的接收缓冲区分配空间并进行通信,{这是他们可以发送给我的字节数}。该数字通常是最大段大小的整数倍。

数据流到达接收缓冲区并保持在那里,直到与该TCP端口关联的应用程序将其拾取为止。

应用程序收集数据

接收窗口从最后提交的字节延伸到缓冲区的末尾。在前面的示例中,整个缓冲区是空闲的,因此有一个4K的接收窗口。1K的数据到达,接收窗口减少到3K。另外两个1K段到达,这意味着window减小到1K。最后,应用程序从缓冲区吸收3K数据,数据的可用空间随之增加(您可以看到窗口如何向右移动。在实际的会话中,大小为接收窗口根据应用需求而变化

1.6.1。接待窗口

接收窗口是接收缓冲区中未被占用的任何空间。数据将保留在接收缓冲区中,直到目标应用程序将其收集为止。

接收器{ACKs}包含接收窗口状态的更新。根据这些窗口更新来调节来自发送方的数据流。

在大多数情况下,在连接建立期间建立的接收缓冲区会在连接期间保持不变,尽管它可能会增长或缩小,只要接收者不退回已授予发送者的内容即可。

1.6.2。提交窗口

数据发送器控制两件事:已发送和已确认多少数据以及另一侧接收窗口的当前大小。活动的发送空间从第一个八位位组开始运行,没有点头到当前接收窗口的右侧。该空间的接收窗口部分指示可以将多少其他数据发送到另一侧。

在连接建立阶段获取接收窗口的初始序列号和初始大小。

在上面的示例中:

1.Emitter从4K发送窗口开始。

2.发送方发送1K并保留此类数据的副本,直到达成结算为止,因为可能需要重新发送该数据。

3. {ACK}到达第一个1K,然后发送另外2K数据并保留其副本。

4.最后,{ACK}到达,表明已接收到所有传输的字节。{ACK}还将接收器窗口更新为4K。

但是我们必须强调一些特征:

  • 发送者不必为传输的数据的每个片段等待{ACK}。传输的唯一限制是接收窗口的大小,假设对于发送方,您必须重新传输使用非常小的段(例如80字节)发送的数据。可以以更有效的方式将数据重新打包,例如重新打包为单个段。

1.7。会议维护

1.7.1。Windows探针

如果有一个活动的发送方和一个懒惰的接收方,则接收窗口可以为0字节。这称为{关闭的窗口}。间隙打开后,将发送{ACK}来更新窗口的大小。但是,如果{ACK}丢失,会发生什么情况,因为两端都可以无限期地等待。为防止这种情况发生,发送方在接收窗口关闭时发送持久性计时器。当计时器到期时,称为{window probe}的段将发送到另一端。在一些实施方式中,探针包括数据。该探针使另一端发回{ACK}和窗口的当前状态。如果窗口继续为零,则持久计时器值将加倍。重复此过程,直到计时器值达到最大60秒。 TCP将继续每60秒无限期发送一次探测,或者直到窗口打开或用户中断进程或应用程序计时器到期为止。

1.7.2。会话维护

如果双方都没有长时间要发送数据的连接会发生什么情况?在空闲期间,网络可能会停止工作,或者电缆可能会被切断并重新连接。当双方返回交换数据时,网络就足够了,会话不会丢失。当然,问题在于任何连接都会占用计算机上的大量内存,因此许多TCP实现都发送{keep-alive}消息来检查连接是否空闲。 TCP会定期发送此消息以验证连接是否仍然存在。该消息返回一个{ACK}响应。消息的使用是可选的,如果系统有消息,应用程序可以为其自身的连接禁用它(建议的默认超时为两个小时)。此外,应用程序可以在对应用程序有意义的级别上发送自己的应用程序层计时器,并且应用程序可以中止空闲会话。

1.8。会议结束

正常终止连接是通过三步过程执行的,类似于建立过程。任何一方都可以启动终止过程。

答:{我完成了。我没有其他数据要发送}

B. {确定}或{但是我有一些数据…..}

  1. {我也完成了} {确定} FIN SEQ#4001

客户申请

  1. 用户放弃

TCP协议

服务器APP

TCP协议

连接关闭

确认#8001

2.序列号8001

确认#4002

客户申请

TCP协议

连接关闭

服务器APP

TCP协议

断开连接

3.结束SEQ#8001

确认#4002

4,SEQ#4002

确认#8002

1.服务器应用程序告诉TCP终止连接。

2. TCP服务器发送最后一个段{FIN},通知另一方它将不再发送任何数据。

3.TCP客户端发送段{FIN}的ACK

4. TCP客户端通知您的应用程序服务器要终止。

5.客户端应用程序告诉TCP完成。

6.TCP客户端发送一条消息{FIN}

7. TCP服务器从客户端收到{FIN},并以{ACK}响应。8.TCP服务器通知您的应用程序连接已终止。

也可能是出现网络故障并突然终止。任何一方都可以调用突然终止。如果应用程序想要中止连接,或者TCP检测到无法解决的严重通信​​问题,则可以执行此操作。要请求突然终止,将一个或多个{reset}发送到另一端。{reset}由TCP标头中的标志指示。

1.8.1。最后期限

另一端的系统可能不可用,或者到另一端的路径可能由于网关或链接而中断或丢失。TCP如何知道它不应该永远中继数据?有几种机制。

在达到重传次数的第一个阈值之后,TCP会向IP发出警报,以检查问题是否是路由器已退出服务,并通知应用程序有问题。TCP继续重传,直到达到第二个阈值,然后断开连接。

ICMP消息也可能到达,指出由于某种原因无法到达目的地。在某些实现中,TCP将继续尝试到达目的地,直到最后期限失败为止,毕竟,问题可能已得到解决。然后,它将状态{目的地无法到达}传递给应用程序。

应用程序还可以设置自己的数据传送时间限制,以及时间到期时要采取的措施。通常,操作是断开连接。

1.9。错误控制

TCP是面向连接的可靠协议。这就是为什么它使用各种技术来提供可靠的数据传递的原因。这些技术使TCP能够从错误中恢复,例如数据包丢失,重复,延迟,节点之间的传输速率不同以及拥塞。

  • 遗失的包裹。 TCP使用肯定的确认和重新传输来实现可靠的数据传递。这样,接收方将确认控制消息{ACK}发送给发送方,以验证信息的成功接收。反过来,发送方在传输信息时初始化{timer}。如果{timer}在确认到达之前过期,则发送方必须通过初始化新的计时器来重新发送信息。如果接收方收到重复的数据包,则不会考虑它,而是继续丢弃它,因为它将被接收并标记为已接收。如果未接收到一个数据包而接收到下一个数据包,则接收器不会移动滑动窗口,直到接收到丢失的段。这样,没有接收到{ACK}的接收者就转发丢失或延迟的数据包,传输速度不同。建立TCP连接时,发送方和接收方均指示其中间存储容量,以就传输发生的速度达成共识。 TCP实施一种策略,在该策略中,它维护一个用于测量拥塞的窗口,每当计时器到期时,该窗口就会减少。为了决定发送数据,发送方考虑了该窗口的大小以创建滑动数据窗口的大小。发送方和接收方都指示其中间存储容量,以就传输发生的速度达成共识。 TCP实施一种策略,在该策略中,它维护一个用于测量拥塞的窗口,每当计时器到期时,该窗口就会减少。为了决定发送数据,发送方考虑了该窗口的大小以创建滑动数据窗口的大小。发送方和接收方都指示其中间存储容量,以就传输发生的速度达成共识。 TCP实施一种策略,在该策略中,它维护一个用于测量拥塞的窗口,每当计时器到期时,该窗口就会减少。为了决定发送数据,发送方考虑了该窗口的大小以创建滑动数据窗口的大小。

每个应用程序任意地将所有信息作为数据流传递,然后TCP负责将此信息分成多个段,每个段最多为IP数据包的大小。应用程序给出的流由传输的字节数编号,这些段中的每个段都包含信息字节的序列号。因此,接收器发送具有确认信息的序列号的片段,而不是片段。 {ACK}是累加的,因此{ACK}可以确认几个段。

包丢失的原因之一是流量过大。但是某些协议(例如TCP)使用重传作为一种机制来保证数据包的到达。此机制是双刃机制,因为过多的重传会导致拥塞。

TCP将数据包的丢失解释为拥塞的指标。发送节点使用TCP控制机制来检测拥塞级别,如果拥塞级别高于某个阈值级别(被认为是最大可接受级别),则将减少数据包的重传。所使用的机制是主机发送一个数据包,如果确认无损到达,则发送方发送两个数据包,并开始将窗口加2的幂。当TCP发送的数据包数量等于窗口大小的一半时,增加的速率会降低,直到它收到已发送数据包的确认为止。

1.10。性能

有许多因素会影响性能。基础是诸如内存和网络带宽之类的资源。

带宽和底层网络延迟会限制性能。传输质量差意味着大量丢弃的数据报。丢弃会触发重传,从而降低了有效带宽。

具有大输入缓冲区的接收器允许发送器继续发送而不会中断。在长时间延迟的网络中,这尤其重要,因为在网络之间发送和接收数据以及更新窗口之间要花费大量时间。为了实现从发送者到接收者的连续数据流,目的地需要一个接收窗口,其大小至少为:

带宽X延迟

例如,如果每秒可以发送10,000个字节,并且{ACK}需要2秒钟才能到达,则接收器必须具有至少20,000个字节的缓冲区才能保持连续的数据流。使用只能容纳10,000个字节的缓冲区,性能会降低一半。

影响性能的另一个因素是主机对高优先级事件做出反应并快速执行{上下文切换}的能力,也就是说,停止做某件事,而转移到另一件事。主机可以为许多交互式本地用户,后台进程以及数十个通信连接提供服务。将TCP / IP与操作系统内核集成在一起的实现可以大大减少上下文切换的开销。需要足够的CPU资源才能快速完成处理TCP标头所需的步骤。

无法快速计算校验和值的CPU会减慢数据传输速度。

该软件还会影响性能,如果编写的程序不会做一些不必要的不​​必要的发送和接收操作,并且在不执行任何有用的工作时使用计时器释放网络资源,那么它也会提高性能。

TCP性能因素。

应用

有效地发送和接收数据。

系统管理员

参数设置。

制作者

高效且兼容的TCP / IP软件。

操作系统和硬件

内存可用性,CPU功能,上下文切换。

带宽,延迟,质量和容量。

1.10.1。慢启动

{Slow Start}阻止会话向可能已经拥塞的网络添加大量流量。想象一下一家拥有500名员工的公司,这些员工在上午8:00到达,并且所有人都同时在网络上进行验证。 {slow start}的想法是使新连接缓慢启动,并根据网络条件逐渐增加其传输速率。在建立连接期间,另一端指示其接收窗口。计算第二{拥塞窗口}的大小是为了根据网络条件来调节传输。发送者受拥塞窗口的限制,而不是受(较大)接收窗口的限制。

拥塞窗口以段开始。对于从中成功接收到{ACK}的每个段,拥塞窗口将增加一个段,只要它小于{接收窗口}。如果网络没有过载,则拥塞窗口将很快达到接收窗口的大小。在正常的传输状态下,拥塞窗口的大小与接收窗口的大小相同。

请记住,慢速启动并不是真的很慢。在第一个{ACK}之后,拥塞窗口为两个部分。如果{ACK}到达两个分段,则窗口增加到四个分段。如果也正确地确认了这些,则窗口将呈指数增长。

1.10.2。傻窗症候群

在TCP / IP的第一个实现中,一种称为“傻窗口综合症(SWS)}的现象非常频繁地发生。例:

1.应用程序快速发送数据。

2.接收应用程序仔细地从接收缓冲区中逐字节读取数据。

3.缓冲区已满

4.接收应用程序读取一个字节,然后TCP发送一个{ACK},内容为{我有空间容纳一个字节的数据}。

5,发送TCP打包一个字节并发送

6.接收方TCP发送一个{ACK},上面写着{谢谢,我有它,我没有更多的空间了}。

7.接收应用程序读取一个字节并发送一个{ACK},重复此过程。

接收缓慢的应用程序已经有大量数据在等待,并且匆忙在窗口的右侧插入字节是没有帮助的,但是会增加不必要的网络流量。

这种情况不必极端到引起问题的程度。快速发送者会发生这种情况,快速发送者是一个应用程序,它接收缓慢并读取最大段大小的数据块并接收几乎快满的缓冲区。例:

解决方案很简单。当窗口减小到小于特定大小时,TCP开始说谎。当接收应用程序进行少量读取时,TCP不应告诉另一端有额外的窗口空间。相反,TCP必须将额外的资源保密,直到目标缓冲区空间可用为止。推荐的大小为一个段,除非只有一个段适合整个缓冲区,在这种情况下,一半的段可以使用。TCP再次说明事实的目标大小是:

最小(1/2接收缓冲区大小,最大段大小)

当窗口大小小于该数量时,TCP开始撒谎,而当窗口大小至少等于该数量时,TCP就会说实话。请记住,保留提交没有任何问题,因为接收应用程序尚未收集到它期望的大多数数据。解决方案很简单,假设接收缓冲区可以存储多个段。快速发送器将填满接收缓冲区,发送器将被指示没有可用空间,直到有空闲空间为止,该空间足以接收完整的段。

1.10.3。ACK延迟

延迟{ACK}是可以提高性能的另一种机制。通过减少发送的{ACK}数量,可以节省可用于其他流量的带宽。如果另一端在发送{ACK}之前稍等,则可能是:

  • 您可以使用一条{ACK}消息确认多个段,另一端应用程序可以收集要在计时器周期内发送的数据,在这种情况下,{ACK}可以放入传出消息的标题中,并且不需要消息分开。

为了避免延迟整个段,例如在执行文件传输时,至少应为每个段发送{ACK}。许多实现使用200毫秒超时。请记住,延迟{ACKs}不会降低传输速度。如果小段到达,则缓冲区中将有很多空间,即使重传很慢,发送器也可以继续发送。如果完整段到达,则每隔第二段将立即触发{ACK}。

1.10.4。重发期

发送段后,TCP启动计时器并等待{ACK}。如果{ACK}在指定时间内没有到达,则TCP重新传输该段。那是什么等待期?如果重传时间太短,则发送方会将不必要的网段弄乱,并向接收方加载重复数据。但是,如果提前期太长,则您实际上失去了细分并降低了性能时就失去了迅速恢复的机会。您如何选择理想术语?因为在高速局域网(LAN)上运行良好的设置可能会在具有许多跃点的长距离连接上造成灾难性的影响,所以固定的时间范围不是解决方案。这就是为什么像雅各布森算法那样的算法,Karn和Partridge使TCP能够适应不断变化的条件,从而能够选择正确的重传时间。

1.10.5。绩效障碍

TCP已证明非常灵活,可在每秒传输数百或数百万个比特的网络上运行。该协议在以太网LANS,令牌环或光纤分布式数据接口(FDDI)以及低带宽链路和延迟较长的链路(例如卫星链路)上都表现良好。

TCP已调整为响应异常情况,例如拥塞。但是,它确实具有某些特性,这些特性会限制使用每秒提供数百或数千兆字节带宽的技术的TCP速率。

假设您正在两个系统之间执行文件传输,并且您想尽可能高效地发送数据。想象一下:

  • 最大段大小为4KB。接收窗口为4KB。有足够的带宽每秒发送2个段。接收应用程序会在到达时立即收集数据。{ACK}在两秒钟后到达。

发送者将能够快速发送数据,因为一旦窗口分配完成,{ACK}就会到达,从而允许发送另一个段:

运输部门1。

交货段2。

交货段3。

交货段4。

两秒钟过去了:

接收到第1部分的{ACK},可以发送第5部分

接收到第2节的{ACK},可以发送第6节

接收到第3部分的{ACK},可以发送第7部分

接收到第4部分的{ACK},可以发送第8部分

又过了两秒钟:

收到第5节的{ACK},可以发送第9节

……………………………………。

如果接收窗口只有2 KB,则发送方将不得不等待两分之一秒才能发送更多数据。实际上,为了保持连续流动,接收窗口的大小必须至少为:

窗口=带宽X往返时间

尽管示例被夸大了,但它表明,较小的窗口可能会长时间延迟卫星链路上的问题。另一个例子是高带宽连接发生的情况。如果带宽和传输速率为每秒1000万比特,但往返时间为100毫秒(1/10秒),则必须保持接收窗口以保持连续流至少1,000,000位,即125,000字节。但是,可以在TCP标头的接收窗口字段中写入的最大数字是65,536字节。

1.11。TCP状态

TCP连接经过一定数量的状态。首先通过消息交换建立连接,然后发送数据,然后通过消息交换关闭连接。连接进行中的每个步骤都对应于连接的状态。连接两端的TCP软件始终保持跟踪其一侧的状态。

服务器状态事件说明

关闭

在连接之前由服务器应用程序被动打开虚拟状态。

LISTEN服务器正在等待客户端的连接请求。

TCP服务器收到{SYN},发送

{SYN / ACK}服务器收到一个{SYN}并发送了一个{SYN / ACK}。等待{ACK}。

同步接收

TCP服务器收到{ACK}

已建立{ACK},并且连接已打开。

服务器状态转换

服务器状态事件说明

关闭

客户端请求连接。TCP客户端发送一个SYN。连接前的虚拟状态。

SYN-SEN TCP客户端已向服务器发送{SYN}。

已建立TCP服务器收到{SYN / ACK},发送

{ACK}

客户端从服务器接收到{SYN / ACK}并发回{ACK}。

您可以开始数据传输。

客户端状态转换。

服务器状态事件说明

已建立本地应用程序请求关闭。TCP发送{FIN / ACK}。

FIN-WAIT-1

TCP收到{ACK},无论谁关闭,都要等待另一端的响应。请记住,另一端的数据仍然可以到达这一点。

FIN-WAIT-2

TCP收到{FIN / ACK}。发送{ACK}。关闭的任何人都从另一端收到了{ACK},但没有收到{END}。它在接受{END}的同时等待数据。

TIME-WAIT连接保持不变,以允许网络上可能存在的重复数据或{FIN}重复数据到达。等待时间是段的估计最大寿命的两倍。

CLOSED有关连接的所有信息均被删除。

谁关闭状态转换。

服务器状态事件说明

已建立的TCP收到{FIN / ACK}。

CLOSE-WAIT-1

TCP发送一个{ACK},一个{FIN}到达

FIN-WAIT-2

本地应用程序指示关闭。

TCP发送{FIN / ACK}。TCP等待您的应用程序指示关闭。该应用程序可以选择发送更多数据。

最后确认

TCP收到{ACK} TCP正在等待最后一个{ACK}

CLOSED有关连接的所有信息均被删除。

封闭的最终状态转换。

netstat –an命令可用于检查连接的当前状态。该工具提供有关TCP / IP连接和活动协议的统计信息。

Netstat为每个连接提供以下信息:

  • 原始 用于建立连接的传输原型本地地址。本地计算机的名称或IP地址以及该连接使用的端口号。连接的外部地址和端口号或名称。显示连接状态,仅TCP

netstat具有以下语法:

netstat

语法说明

-a显示所有连接和侦听端口。(通常,不显示服务器的连接端。)

-e显示以太网统计信息。可以将其与-s选项结合使用。

-n以数字格式显示地址和端口号。

-o显示与每个连接关联的进程ID。

-p proto显示proto指定的协议的连接;可以是TCP,UDP,TCPv6或UDPv6。如果与-s选项一起使用以按协议显示统计信息,则proto可以是TCP,UDP,TCPv6或UDPv6。

-r显示路由表的内容。

-s按协议显示统计信息。默认情况下,它们显示为IP,IPv6,ICMP,ICMPv6,TCP,TCPv6,UDP和UDPv。您可以使用p选项指定默认值的子集。

interval重新显示选定的统计信息,在每个样本之间以指定的秒数间隔暂停。按Ctrl + C停止更新统计信息。如果省略,netstat将只打印一次配置信息。

不带参数的Netstat提供连接的基本状态。

C:\ netstat的

活动连接

原型本地地址远程地址状态

TCP CIA:3012 baym-cs186.msgr.hotmail.com:1863已建立

TCP CIA:3032 194.224.100.71:http CLOSE_WAIT

TCP CIA:3048 a217-75-98-16.deploy.akamaitechnologies.com:http CLOSE_WAIT

使用–s选项,它将显示IP,ICMP,TCP和UDP协议的统计信息。

C:\ netstat的-s

IPv4统计

收到的数据包= 5963

收到的标题错误= 0

收到的地址错误= 6

转发的数据报= 0

收到的未知协议= 0

丢弃的已接收数据包= 2395

已接收的已处理数据包= 3568

出站请求= 3771

路线丢弃= 0

丢弃的出站数据包= 0

没有路径的出站数据包= 0

需要重新组装= 0

正确的重组= 0

重新组装错误= 0

正确分段的数据报= 0

碎片严重的数据报= 0

创建的片段= 0

ICMPv4统计

已收到

留言内容

失误

无法到达目的地

超时

参数问题

流控制包

重新导向

回声

回声响应

日期

日期回应

IPv4的TCP统计信息

未结资产= 221

未结负债= 0

连接尝试失败= 8

恢复的连接= 78

当前连接数= 5

收到的段数= 2288

发送的细分受众群= 2404

重新传输的段= 10

IPv4的UDP统计信息

收到的数据报= 1270

无端口= 2

接收错误= 16

发送的数据报= 1353

使用–an选项,它显示所有连接的地址和状态以及它们的端口。

C:\ netstat -an

活动连接

原型本地地址远程地址状态

TCP 0.0.0.0:135 0.0.0.0:0侦听TCP 0.0.0.0:445 0.0.0.0:0侦听

TCP 0.0.0.0:1026 0.0.0.0:0侦听

TCP 0.0.0.0:3012 0.0.0.0:0侦听

TCP 0.0.0.0:3023 0.0.0.0:0侦听

TCP 0.0.0.0:3024 0.0.0.0:0侦听

TCP 0.0.0.0:3032 0.0.0.0:0侦听

TCP 0.0.0.0:3040 0.0.0.0:0侦听

TCP 0.0.0.0:3048 0.0.0.0:0侦听

TCP 0.0.0.0:3056 0.0.0.0:0侦听

TCP 0.0.0.0:3057 0.0.0.0:0侦听

TCP 0.0.0.0:3067 0.0.0.0:0侦听

TCP 0.0.0.0:3201 0.0.0.0:0侦听

TCP 0.0.0.0:3220 0.0.0.0:0侦听

TCP 0.0.0.0:3227 0.0.0.0:0侦听

TCP 0.0.0.0:3228 0.0.0.0:0侦听

TCP 0.0.0.0:3229 0.0.0.0:0侦听

TCP 0.0.0.0:3231 0.0.0.0:0侦听

TCP 0.0.0.0:3236 0.0.0.0:0侦听

TCP 0.0.0.0:3237 0.0.0.0:0侦听

TCP 0.0.0.0:5000 0.0.0.0:0侦听

TCP 127.0.0.1:3001 0.0.0.0:0侦听

TCP 127.0.0.1:3002 0.0.0.0:0侦听

TCP 127.0.0.1:3003 0.0.0.0:0侦听

建立了TCP 213.102.64.17:3012 207.46.4.54:1863

TCP 213.102.64.17:3032 194.224.100.71:80 CLOSE_WAIT

建立了TCP 213.102.64.17:3048 217.75.98.16:80

TCP 213.102.64.17:3187 216.12.215.207:80 TIME_WAIT

建立了TCP 213.102.64.17:3201 217.75.98.7:80

建立了TCP 213.102.64.17:3220 130.94.72.189:80

建立了TCP 213.102.64.17:3227 217.75.98.7:80

建立了TCP 213.102.64.17:3228 62.37.226.86:80

建立了TCP 213.102.64.17:3229 62.37.226.86:80

建立了TCP 213.102.64.17:3231 161.58.186.225:80

建立了TCP 213.102.64.17:3236 62.37.236.78:80

建立了TCP 213.102.64.17:3237 62.37.236.78:80

UDP 0.0.0.0:135 *:*

UDP 0.0.0.0:445 *:*

UDP 0.0.0.0:500 *:*

UDP 0.0.0.0:1025 *:*

UDP 0.0.0.0:3010 *:*

UDP 0.0.0.0:3022 *:*

UDP 0.0.0.0:3031 *:*

UDP 0.0.0.0:3064 *:*

UDP 0.0.0.0:3065 *:*

UDP 127.0.0.1:123 *:*

UDP 127.0.0.1:1900 *:* UDP 127.0.0.1:2234 *:*

第2章用户数据报协议(UDP)。

介绍

UDP是无连接的第4层传输协议(OSI)。UDP是一种数据报协议,不能保证数据的传递。如果应用程序在UDP数据报中发送请求,并且在合理的时间内未收到响应,则应用程序有责任重新发送请求。UDP只是发送数据报,并不关心它是否到达。通过不保证传递,它使它成为比TCP更快,更轻巧的协议,从而为不需要可靠传递的那些进程提供了替代传输。

许多应用程序使用UDP相互发送消息或快速查询数据库或DNS(域名系统)服务器。UDP是构建监视,调试,管理和测试功能的完美之选。

服务器

客户

地址是哪个

用于…的IP。

回复

与UDP通讯。

尽管在某些情况下UDP的可靠性不如TCP,但还是建议使用UDP,因为它在某些情况下具有优势:

  • 主机之间的消息是零星的。 SNMP(简单网络管理协议)再次是一个很好的例子。您的消息以不定期的间隔发送。为每个消息打开和关闭TCP连接所需的工作量将延迟其传输并降低性能,而无需确认的消息。 UDP有助于减少网络流量。 SNMP警报属于此类别。在大型网络中,当SNMP设备传输其状态更新时,会生成大量SNMP警报。但是,SNMP消息的丢失通常不是很关键,并且使用UDP作为SNMP可以减轻网络的大量工作量,并在过程级别实现可靠性。网络文件系统(NFS)是一个过程的很好的例子,该过程实现了自己的可靠性功能并在UDP上运行以提高网络性能,例如,需要发送广播或多播消息的应用程序可以使用它。 BOOTP客户。

2.1。应用端口

UDP与本地进程之间的接口称为门。为了使应用程序访问网络并通过它发送数据,它必须通过端口进行操作。

1.用户调用一个客户端程序,例如nslookup

2.客户端进程执行一个系统例程,该例程说:{我要进行UDP通信。给我一个端口。}

3.系统例程分配了一个免费的16位标识符,称为{端口号}。

端口由从0到65,535的十进制数字标识。实施UDP的制造商拥有很大的自由度,可以为进程分配端口号,尽管Internet编号分配机构(IANA)保留了0到1,023范围的端口供标准服务使用(已知),例如DNS,SNMP或Netbios。

端口应用说明

7 Echo用户数据报的Echo返回发件人。

9丢弃丢弃用户数据报。

13 DayTime指示用户容易的时间。

17 Quote返回一天中的{quote}。

19个电荷交换字符流

53 DNS域名服务器。

67 Bootps服务器端口,用于下载配置信息。

68 Bootpc客户端端口,用于接收配置信息。

69 TFTP普通文件传输协议端口。

161 SNMP用于接收网络管理请求。

162 SNMP陷阱用于接收网络问题的报告。

某些公共UDP端口的列表。

其中一些服务提供了用于测试,调试和测量的块,例如端口7上的{echo}服务,该服务将返回发送给它的任何数据报。另一个端口(例如9(丢弃))会抛出接收到的数据报。端口19是一个字符生成器,​​它在其中响应包含0到512个字节的数据报的任何消息。该数字是随机选择的。当关闭会话或执行fortune命令时,在端口17上侦听的日间服务的约会通过发送带有一些历史或流行的智慧短语的消息来响应任何数据报。端口13(DayTime)用包含可读ASCII格式的当前日期和时间的消息响应任何数据报。 BOOTP服务器和客户端用于初始化无需配置的设备(哑终端)。工作站可以发现其IP地址,其Netmask,其默认路由器的位置,重要服务器的地址,甚至是从引导服务器下载的软件的名称和位置。使用简单文件传输协议(TFTP; UDP 69)下载工作站软件。

TCP和UDP端口彼此独立。一个进程可以在UDP端口1700上发送消息,而另一个进程则在TCP端口1700上维护会话。有些服务需要同时访问TCP和UDP,因此IANA尝试为需要UDP作为TCP的服务分配相同的端口号,例如DNS,DNS侦听TCP和UDP的端口53。

IP地址和用于通信的端口地址的组合称为{套接字地址}或{套接字}。套接字提供客户端或服务器识别其另一端所需的所有信息。

UDP标头由两个32位字组成,具有以下字段:

  • 源端口(16位)。此字段是可选的,它在需要允许数据报接收器发送响应时指定源端口目标端口(16位)。目的IP主机的端口,长度(16位)。数据报的长度,以八位字节为单位,包括标题和数据。最小值为8,以允许使用标头。因此,UDP数据报的最大长度为65,535个八位位组,其中65,527个八位位组可以专用于数据。 UDP校验和的目的是验证UDP消息的{content}。 UDP校验和是根据具有某些IP信息的特殊构造的伪头,UDP头和消息数据的组合来计算的。在特定的通信中使用UDP校验和是可选的。如果未使用,则该字段值为0。如果已计算校验和且其值达到0,则该字段由1表示。

2.3。UDP溢出

当应用程序从UDP获取端口时,网络软件将保留一些缓冲区,以保存到达该端口的用户数据报的队列。UDP服务无法预测或控制一次将发送多少个数据报。

如果该服务受到了超出其处理能力的数据报轰炸,则多余的信息将被简单地丢弃。

例:

> netstat -a

………………。

0个不完整的标题

0个错误的数据长度字段

0错误的校验和

17个套接字溢出

2.4。TCP和UDP之间的差异

传输层的关键在于它允许应用程序开发人员选择可靠性(TCP)或效率(UDP)。

TCP的极大兴趣在于其将上层进程与网络隔离的能力。进程不需要知道消息的大小,因为TCP负责它们的分段和重组。此外,由于TCP完全保证了它承载的消息的完整性,因此这些过程并不关心网络的可靠性。

在UDP方面,它是执行其工作时更轻松的协议。与TCP不同,UDP不需要在主机之间建立虚拟电路,这允许更敏捷和有效的通信,这就是UDP支持广播和多播消息的原因。

下载原始文件

传输控制协议TCP