RFC 793中文译文(1)

RFC 793中文译文(1)

(本文是rfc793的译文,多数直接采用google翻译,目的是熟悉rfc和增强英文能力)

传输控制协议(1981.9)

前序

本文件描述了国防部标准传输控制协议(TCP)。 这个标准所基于的ARPA TCP规范已经有九个以前的版本,而现在的文本却从中大量引用。 这些工作在概念和文本方面都有很多贡献。 此版本澄清了几个细节,并删除了字母末尾的缓冲区大小调整,并将字母机制重新描述为推送功能。
Jon Postel
编辑

介绍

传输控制协议(TCP)旨在用作分组交换计算机通信网络中的主机之间以及在这种网络的互连系统中的高度可靠的主机到主机协议。
本文档描述了要由传输控制协议执行的功能,实现它的程序,以及与需要其服务的程序或用户的接口。

动机

计算机通信系统在军事,政府和民用环境中发挥越来越重要的作用。本文件的重点主要集中在军事计算机通信的要求上,特别是存在通信不稳定性和存在拥塞情况下的稳定性,但其中许多问题也发生在民用和政府部门。
随着战略和战术计算机通信网络的开发和部署,必须提供互连方式,并提供可支持广泛应用的标准进程间通信协议。由于预期需要这种标准,副国防研究与工程部副部长已经宣布,这里描述的传输控制协议(TCP)是DoD范围的进程间通信协议标准化的基础。 TCP是一种面向连接的端到端可靠协议,旨在适应支持多网络应用的协议层次结构。 TCP提供连接到不同但互连的计算机通信网络的主机中的进程对之间的可靠的进程间通信。对TCP层之下的通信协议的可靠性做了很少的假设。 TCP假定它可以从较低级协议获取一个简单的,潜在的不可靠数据报服务。原则上,TCP应该能够在以上操作广泛的通信系统范围从硬连接到分组交换或电路交换网络。

TCP是基于在[1]中由Cerf和Kahn描述的概念。TCP安装在一个基本的Internet协议[2]之上的分层协议体系结构中,它为TCP发送和接收包含在Internet数据报“信封”中的信息的可变长度部分提供了一种方法。internet数据报提供了一种方法,用于在不同的网络中寻址源和目标TCPs。internet协议还处理通过多个网络和连接网关实现传输和传输所需的TCP段的任何碎片或重新组装。internet协议还承载了关于TCP段的优先级、安全性分类和划分的信息,因此可以跨多个网络进行端到端通信。

大部分文档都是在TCP实现的环境中编写的,TCP实现是在主机计算机中与更高级别协议共存的。一些计算机系统将通过前端计算机连接到网络,这些计算机可以容纳TCP和internet协议层,以及网络特定的软件。TCP规范描述了一种更高级别协议的接口,即使对于前端协议,它似乎也是可以实现的,只要实现了一个合适的主机到前端协议。

范围

TCP的目的是在多工作环境中提供可靠的进程间通信服务。TCP的目的是成为多个网络中通用的主机到主机协议。

概述

该文档表示了任何TCP实现所需的行为规范,都是在其与高级协议的交互中以及与其他TCPs的交互中所需要的。本节的其余部分对协议接口和操作提供了非常简单的视图。第2节总结了TCP设计的哲学基础。第3节提供了在发生各种事件(新段、用户调用、错误等)以及TCP段格式的详细信息时,对TCP所需要的操作的详细描述。

接口

TCP接口的一端在用户或应用程序的过程中,另一端在一个较低级别的协议,如Internet协议。应用程序和TCP之间的接口以合理的细节进行了说明。这个接口包括一组调用,就像操作系统为操作文件的应用程序所提供的调用一样。例如,有调用打开和关闭连接,并发送和接收建立连接的数据。预计TCP可以异步地与应用程序进行通信。尽管允许TCP实现者设计适合于特定操作系统环境的接口,但是在TCP /用户界面上,对于任何有效的实现都需要一个最小的功能。TCP和低层协议之间的接口实际上是未指定的,只是假定有一种机制,使两个级别可以异步地将信息传递给彼此。通常,人们期望较低级的协议指定该接口。TCP被设计用于在一个非常通用的网络环境中工作。本文档中假定的低层协议是Internet协议[2]。

操作

如上所述,TCP的主要目的是在两个进程之间提供可靠的、可分离的逻辑电路或连接服务。要在不可靠的互联网通讯系统上提供这项服务,需要以下领域的设施:
基本数据传输
可靠性
流控制
多路复用
连接
优先级和安全
以下段落描述了TCP在这些领域中的基本操作。

  • 基本数据传输:

TCP能够通过将一些字节流打包通过网络系统在用户之间双向进行传输。总而言之,TCPs决定何时以自身的方便来阻止和转发数据。
有时用户需要确定他们提交给TCP的所有数据都已经传输。为此,定义了一个push函数。为了确保发送用户提交给TCP的数据实际上已经传输了,这意味着它应该被推送到接收用户。推动TCPs迅速转发并将数据传送到接收端。
准确的推送点对接收用户可能不可见,推送函数不提供记录的边界标记。

  • 可靠性:

TCP必须从损坏、丢失、复制或由internet通信系统发出的数据中恢复。这是通过为每个octet传输一个序列号来实现的,并且需要从接收TCP获得一个肯定的确认(ACK)。如果在超时间隔内未收到ACK,则重新传输数据。在接收端,序列数字被用来正确地排列可能被接收到的部分,并消除重复的片段。通过对传输的每一个片段添加一个校验和,在接收端检查它,以及丢弃损坏的部分来处理损坏。
只要TCPs继续正常运行,而互联网系统没有完全分区,传输错误就不会影响数据的正确传递。TCP从网络通信系统错误中恢复。

  • 流控制:

TCP为接收方提供了一种方法来管理发送方发送的数据量。这是通过返回一个“窗口”来实现的,每一个ACK都显示了在最后一个部分成功接收后的一系列可接受的序列号。该窗口指示发送者在获得进一步许可之前可能发送的octets的数量。

  • 多路复用:

为了允许单个主机中的多个进程同时使用TCP通信设施,TCP在每个主机中提供一组地址或端口。从网络通信层连接到网络和主机地址,形成一个套接字。一对套接字可以唯一地标识每个连接。也就是说,一个套接字可以同时用于多个连接。端口与流程的绑定由每个主机独立处理。然而,将经常使用的进程附加到公开的固定套接字上,证明是有用的,比如日志,。然后可以通过已知的地址访问这些服务。建立和学习其他进程的端口地址可能涉及更多的动态机制。

  • 连接:

上面描述的可靠性和流控制机制要求TCPs初始化并维护每个数据流的特定状态信息。这些信息的组合,包括套接字、序列号和窗口大小,称为连接。每个连接都由一对标识其两边的套接字唯一指定。当两个进程希望通信时,它们的TCP必须首先建立一个连接(初始化每个方面的状态信息)。当他们的通信完成时,连接被终止或关闭以释放其他用途的资源。由于必须在不可靠的主机和不可靠的internet通信系统之间建立连接,因此使用基于时钟的序列号的握手机制,以避免对连接的错误初始化。

  • 优先级和安全:

TCP的用户能够设定通信的安全性和优先级。为不需要这些特性时使用的默认值。

概念

网络系统的组成部分

网络环境由连接到网络的主机组成,网络通过网关相互连接。这里假设网络可能是本地网络。(如以太网)或大型网络(如:ARPANET),但无论如何都是基于分组交换技术。生成和使用消息的活动代理是进程。网络中各种级别的协议、网关和主机支持一个进程间通信系统,它提供了在进程端口之间的逻辑连接上的双向数据流。这个术语包在这里泛指一个主机和它的网络之间的一个事务的数据。在网络中交换的数据块的格式一般不会引起我们的关注。主机是连接在网络上的计算机,从通信网络的角度来看,是信息包的来源和目的地。进程被看作是主机计算机中的活动元素(按照执行过程中程序通用的定义)。即使是终端和文件或其他I / O设备也被视为通过进程进行通信。因此,所有的通信都被视为进程间通信。由于一个进程可能需要区分它自己和另一个进程(或进程)之间的几个通信流,因此我们认为每个进程可能有许多端口,通过它与其他进程的端口进行通信。

操作模式

        进程通过调用TCP并将数据缓冲区作为参数传递数据。TCP将这些缓冲区的数据打包成段,并调用internet模块将每个部分传输到目标TCP。接收TCP将数据从一个段放入接收用户的缓冲区,并通知接收用户。TCPs包括用于确保可靠有序数据传输的控制信息部分。互联网通信的模式是,每个TCP都有一个与每个TCP相关联的internet协议模块,它为本地网络提供了一个接口。该网络模块将TCP段封装到internet数据报中,并将这些数据报路由到目的地internet模块或中间网关。为了通过本地网络传输数据报,它被嵌入到本地网络包中。交换机可以执行进一步的打包、分段或其他操作,以实现向目标internet模块发送本地数据包。

         在网络之间的网关上,internet数据报从本地数据包“打开”,并检查网络数据报应该在哪个网络下运行。然后internet数据报被“包装”在一个本地包中,适合于下一个网络,并路由到下一个网关,或者到达最终目的地。如果需要通过下一个网络进行传输,网关可以将internet数据报分解为更小的internet数据报片段。为此,网关产生一组internet数据报;每个携带一个片段。在随后的网关中,碎片可能会被进一步分割成更小的片段。互联网数据报片段格式的设计使目标互联网模块能够将片段重新组合成网络数据报。目标internet模块将该段从数据报中打开(如果需要的话,在重新装配数据报之后)并将其传递到目标TCP。这个操作的简单模型掩盖了许多细节。一个重要的特性是服务的类型。这将向网关(或internet模块)提供信息,以指导它选择用于遍历下一个网络的服务参数。服务信息类型中包含的是数据报的优先级。Datagrams还可以携带安全信息,以允许在多级安全环境中运行的主机和网关正确地隔离数据报以进行安全考虑。

 主机环境

TCP被假定为操作系统中的一个模块。用户可以访问TCP,就像访问文件系统一样。TCP可以调用其他操作系统的功能,例如,管理数据结构。假定该网络的实际接口是由一个设备驱动程序模块控制的。TCP不直接调用网络设备驱动程序,而是调用internet数据报协议模块,该模块可以轮流调用设备驱动程序。
TCP的机制不排除在前端处理器中实现TCP的实现。但是,在这样的实现中,主机到前端协议必须提供支持该文档中描述的tcp-user接口类型的功能。

 接口

TCP用户接口提供了用户在TCP上打开或关闭连接、发送或接收数据、或获得关于连接的状态的调用。这些调用类似于操作系统上的用户程序的其他调用,例如,打开、读取和关闭文件的调用。
TCP/internet接口提供了在internet系统中任何地方的主机上发送和接收数据包到TCP模块的调用。这些调用具有传递地址、服务类型、优先级、安全性和其他控制信息的参数。

 其他协议

下图演示了TCP在协议层次结构中的位置:
 
预计TCP将能够有效地支持更高级别的协议。应该可以很容易地将诸如ARPANET Telnet或AUTODIN II THP这样的高级协议连接到TCP。

可靠通信

传输到TCP连接上的数据流是可靠的,并且是在目的地发送的。通过使用序列号和确认,传输是可靠的。在概念上,每个字节数据都被分配一个序号。一个段中的第一个字节数据的序列号是通过这个段传输的,被称为段序列号。段也有一个确认号,也就是下一个预期数据的序列数字,在相反的方向上。当TCP传输包含数据的段时,它将一个副本放在一个重新传输队列上并启动一个计时器;当接收到对该数据的确认时,该段将从队列中删除。如果在计时器耗尽之前未收到确认,则该段将被重新传输。
TCP的ack并不能保证数据已经交付给最终用户,但是只有接收方承担了这样的责任。为了控制TCPs之间的数据流,采用了一种流量控制机制。接收的TCP向发送的TCP报告一个“窗口”。这个窗口指定了octets的数量,从确认编号开始,接收的TCP现在已经准备好接收了。

 连接建立和释放

为了识别TCP可以处理的独立数据流,TCP提供了端口标识符。因为端口标识符是由每个TCP独立选择的,所以它们可能不是唯一的。为了在每一个TCP中提供唯一的地址,我们连接一个因特网地址来识别TCP和一个端口标识符来创建一个套接字,这个套接字在所有连接在一起的网络中都是唯一的。

连接是由两端的套接字完全指定的。本地套接字可以参与许多连接到不同的外部套接字。一个连接可以用来在两个方向上传输数据,也就是说,它是“全双工”。TCPs可以自由地将端口与进程相关联。然而,在任何实现中都需要几个基本概念。必须有一些众所周知的套接字,TCP只与“适当的”进程相关联。我们设想进程可以“拥有”端口,而进程只能在它们自己的端口上启动连接。(实现所有权的方法是一个本地问题,但是我们设想一个用户要求的请求端口,或者是一种将一组端口分配给给定进程的方法。通过将端口名的高阶位与给定的进程关联起来。)

本地端口和外套接字参数在OPEN调用中指定了连接。返回时,TCP提供了一个(短)本地连接名,用户在随后的调用中引用了该连接。关于连接,有一些事情必须记住。为了存储这些信息,我们假设存在一个名为传输控制块(TCB)的数据结构。一个实现策略是将本地连接名作为指向该连接的TCB的指针。OPEN call还指定了连接的建立是要主动连接,还是被动地等待。

一个被动的OPEN请求意味着该进程想要接受传入的连接请求,而不是试图发起连接。
通常,请求被动打开的进程将接受来自任何调用者的连接请求。在本例中,使用所有0的外部套接字表示一个未指定的套接字。未指定的套接字只能在被动打开的情况下使用。希望为未知的其他进程提供服务的服务流程会发出一个被动的OPEN请求,并带有一个未指定的外部套接字。然后,连接到这个本地套接字的任何进程都可以连接到一个连接。如果已知本地套接字与此服务相关联将会有所帮助。众所周知的套接字是一种方便的机制,可以将套接字地址与标准服务关联起来。例如,“远程服务器”进程被永久地分配给一个特定的套接字,其他的套接字被预留给文件传输、远程作业输入、文本生成器、回声和接收过程(最后三个是用于测试目的)。一个套接字地址可能是用来访问“查找”服务的,该服务将返回一个新创建的服务所提供的特定套接字。众所周知的套接字的概念是TCP规范的一部分,但是将套接字分配给服务是在这个规范之外的。(参见[4])。

进程可以发出被动的打开,等待与其他进程相匹配的活动打开,并在建立连接时被TCP通知。两个进程在同一时间对彼此开放的进程将被正确地连接起来。这种灵活性对于分布式计算的支持是至关重要的,在这种分布式计算中,组件对彼此都是异步的。有两个主要的例子可以匹配本地被动打开的套接字,以及一个外活动打开。在第一种情况下,本地的被动打开已经完全指定了外套。在这种情况下,比赛必须是准确的。在第二种情况下,本地被动的打开会导致外套接字未指定。在这种情况下,只要本地套接字匹配,任何外来套接字都可以接受。其他可能包括部分限制的匹配。如果在同一个本地套接字上有几个正在等待的被动打开(在TCB中被记录),那么在选择TCB时,如果存在一个TCB,那么在选择TCB时,将会有一个外活跃的打开,如果有一个TCB,则在选择一个没有指定的外部套接字的TCB时。
建立连接的过程使用同步(SYN)控制标志,并涉及到三个消息的交换。这种交换被称为三手握手。

连接是由一个到达段的集合发起的,其中包含一个SYN和一个等待的TCB条目,每个条目由用户OPEN命令创建。本地和外部套接字的匹配决定了何时启动连接。当序列数字在两个方向上同步时,连接就会被“建立”。

一个连接的清除还涉及到交换段,在这个例子中是带着FIN控制标志。

数据通信

在连接上流动的数据可以被认为是八位字节流。发送用户在每个SEND调用中指示该发送中的数据(以及任何前一个呼叫)是否应通过PUSH标志的设置立即被推送到接收用户。

允许TCP发送端从发送用户收集数据,并以便于方便的时候发送数据,直到发送推送函数,然后它必须发送所有未发送的数据。当接收TCP看到PUSH标志时,在传送数据到接收过程之前,它不能等待来自发送TCP的更多数据。

推送函数和分段边界之间没有必要的关系。任何特定片段中的数据可能是单个SEND调用的全部或部分或多个SEND调用的结果。

推送函数和PUSH标志的目的是将数据从发送用户推送到接收用户。它不提供记录服务。

推送函数与数据缓冲区之间的使用在TCP/用户接口间存在耦合。每当PUSH标志与放入接收用户的缓冲器中的数据相关联时,即使没有填充缓冲区,缓冲区也要返回给用户进行处理。如果数据到达,则在看到PUSH之前填满用户的缓冲区,则数据将以缓冲区大小为单位传递给用户。

TCP还提供了一种方式来向接收端通信数据,其在数据流中的某个时间点比接收机当前正在读取的数据流更紧急的数据。 TCP不会尝试定义用户在通知待处理紧急数据时具体做什么,但一般的观点是接收过程将采取行动来快速处理紧急数据。

优先级和安全

TCP利用互联网协议类型的服务字段和安全选项,以TCP连接为基础,为TCP用户提供优先级和安全性。 并非所有TCP模块都将在多级安全环境中运行; 一些可能仅限于未分类使用,而其他可能仅在一个安全级别和隔间上运行。 因此,对用户的一些TCP实现和服务可能被限制到多级安全案例的一个子集。

在多级安全环境中运行的TCP模块必须使用安全,隔间和优先级来正确标记出站段。 这样的TCP模块还必须向其用户或更高级别的协议(如Telnet或THP)提供一个接口,以允许他们指定所需的安全级别,隔离专区和连接的优先级。

健壮原则

 TCP实现将遵循鲁棒性的一般原则:在你做什么时要保守,在别人接受的情况下自由。(你能做的有一定的限制,别人接受你的时候要比较便捷自由)

功能规范

头格式

TCP段被发送为internet数据报。Internet协议头包含几个信息字段,包括源和目标主机地址2。TCP报头遵循因特网报头,提供特定于TCP协议的信息。这个部门允许存在除TCP之外的主机级协议。

TCP头格式如下:

序列号占32位:序列号是段中第一个字节数据(当SYN不存在时),如果SYN存在,这个序列号就是初始序列号(ISN)并且第一个字节数据的序列号是ISN+1.

确认号32位:如果设置了ACK控制位,那么这个字段包含了下一个序列号的值,该段的发送方期望接收。一旦建立了连接,它就会被发送。

数据偏移值4位:这表示数据从哪里开始。TCP报头(甚至包括选项之一)是32位长的整数。

窗口16位:这个字节数据表明发送方能够接受的数据大小。

检验和16位:校验和字段是头和文本中所有16位字和的补码。如果一个段包含奇数页的头和文本八位元,那么最后的八位就会在右边填上0,以形成一个16位的单词来进行校验和。这偏移值不作为段的一部分进行传输的。在计算校验和时,校验和字段本身被替换为0。校验和还包含了一个96位的伪报头,它在概念上是预先固定在TCP报头上的。这个伪标头包含源地址、目标地址、协议和TCP长度。这就提供了TCP保护来防止被路由的区段。此信息在Internet协议中进行,并通过TCP IP上的TCP调用的参数或结果传输到TCP/网络接口。

TCP长度是TCP报头长度加上数据长度(这不是一个显式传输量,而是计算出来的),并且它不计算伪标头的12个字节。

紧急指针16位:这个字段将当前的紧急指针的值与此段中的序列数字进行正偏移。紧急指针指向紧急字节数据后的序列号。该字段只在带有URG控制位的段中进行解释。

选项(可变):选项可能在TCP报头的最后占据空间,并且长度是8位的倍数。所有选项都包含在校验和中。一个选项可以从任何字节边界开始。一种选择的格式有两种情况:
案例1:一个单一的字节。
案例2:一组字节长度,以及实际的操作-数据字节。
选择的长度是两种选择-字节的类型选择-或者字节的长度选择。
注意,选项列表可能比数据偏移字段要短。标题的内容超出了
结束选项必须是头填充(即:0)。TCP必须实现所有选项。—————-翻译的我都不知道是什么鬼(我去看中文版tcp/ip去了。。。。)

选项列表:该选项代码表示选项列表的结束。根据数据偏移量字段,这可能与TCP报头的结束不一致。这是在所有选项的末尾使用的,而不是每个选项的结束,如果选项的末尾没有与TCP报头的结尾相一致,则只需要使用该选项。

无选项:例如,可以在选项之间使用该选项代码,以便在单词边界上对齐后续选项的开始。不能保证发送者将使用这个选项,因此接收者必须准备处理选项,即使他们不从一个单词边界开始。

最大段选项数据16位:如果该选项存在,那么它将在发送此段的TCP中通信最大的接收段大小。该字段必须只在初始连接请求中发送(即:在带有SYN控制位的段中)。如果不使用该选项,则允许任何段的大小。

术语

在我们讨论TCP的操作之前,我们需要介绍一些详细的术语。 TCP连接的维护需要记住几个变量。 我们设想这些变量存储在称为传输控制块或TCB的连接记录中。 存储在TCB中的变量是本地和远程套接字号码,连接的安全性和优先级,指向用户发送和接收缓冲区的指针,指向重传队列和当前段的指针。 此外,与发送和接收序列号有关的几个变量存储在TCB中。




So BadJust So SoGoodCoolPretty Cool (还没人评过分呢!)
Loading...

发表评论

电子邮件地址不会被公开。 必填项已用*标注