传送层传送层的主要功能是面向进程提供端到端的数据传输服务,这种数据传输服务可以采用面向连接或无连接交换方式来实现。在TCP/IP中,传送层提供了两个协议: 传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram Protocol),分别提供面向连接的和无连接的数据传输服务。 1 TCP协议TCP尽管是TCP/IP协议集中的一员, 但它有很大的独立性, 它对下层网络协议只有基本的要求, 很容易在不同的网络上应用, 因而可以在众多的网络上工作。ISO/OSI传输层标准中的第四类TP-4 就是以TCP为原型而制定的。TCP提供可靠的虚电路服务和面向数据流的传输服务, 用户数据可以被有序而可靠的传输。在分组发生丢失、破坏、重复、延迟或者失序的情况下, TCP服务通过一种可靠的进程间通信机制能够自动纠正各种差错。TCP可以支持许多高层协议ULP(Upper Level Protocol), 它对高层协议的数据结构无任何要求, 只将它们作为一种连续的数据流。它对分组没有太多的限制, 最大分组为65 KB。较大的分组将在IP层分成数据段进行传送, 但一般TCP的实现都规定了适当大小作为数据段的长度。此外, TCP在数据流中加入了一个面向字节的序号, 以便管理TCP间连续的数据流。 TCP的主要功能是在一对ULP之间提供面向连接的传输服务, 连接管理可以分为三个阶段:建立连接、数据传输和终止连接。在建立连接时, 可以给该连接赋予某些属性以便在连接期间使用, 如安全性和优先级等。 TCP主要通过套接字(Socket)为ULP提供面向连接的传输服务, 利用套接字可使一个ULP主动发起与另一个ULP之间的惟一连接。套接字实际上实现了基于IP地址(在IP报头中)和应用端口(在TCP报头中)的连接。一个连接是由通信双方定义的套接字号而建立的。 一旦连接建立起来并且该连接处于活动状态时, TCP可以产生并发送分组。当传送结束后, 连接双方都要终止各自的连接。为了保证提供可靠性的服务, TCP还提供了确认、流控制、复用及同步等功能。 1. TCP报文格式TCP的报文格式如下图所示 TCP报头说明参见下表.
表 TCP报头说明 TCP协议中的基本传输单元为段(Segment), 因此习惯上将TCP报文称为TCP段。一个TCP段由段头和数据流两部分组成, TCP数据流是无结构的字节流, 流中数据是由一个个字节序列构成的, 无任何可供解释的结构, 这一特征使得TCP段的段长是可变的。因此, TCP协议中的序号和确认号都是针对流中字节的, 而不针对段。 为了保证传输的可靠性, 接收方TCP实体要对发送方TCP实体所传来的TCP段给予确认。在一般情况下, 接收方将确认已正确收到的连续字节流前n个字节, 给出的确认号指示的是下一个(n+1)所希望接收的字节。这种面向字节的累计确认方式的优点是在可变长段传输方式下不会发生确认的二义性, 并且实现起来也比较容易。 两个使用TCP协议进行通信的对等实体间的一次通信过程一般都要经历建立连接、数据传输(双向)和终止连接等阶段。TCP协议内部通过一套完整状态转换机制来保证各个阶段的正确执行, 为上层应用提供双向、可靠、顺序及无重复的数据流传输服务。下面讨论TCP的协议机制。 2. 序号在每条TCP通信连接上传送的每个数据字节都有一个与之相对应的序号, 这是TCP协议实体的重要概念之一。以字节为单位递增的TCP序号主要用于数据排序、重复检测、差错处理及流量控制窗口等TCP协议机制上, 保证了传输任何数据字节都是可靠的。 TCP报头中的序号字段为4个字节, 表示的序号空间范围为0~232-1, 因此发送字节的序号编码算法都要以232为模。 TCP序号不仅用于保证数据传送的可靠性,还用于保证建立连接(SYN请求)和拆除连接(FIN请求)的可靠性,每个 SYN和FIN段都要占一个单位的序号空间。 3.建立连接在TCP协议中, 建立连接要通过“三次握手”机制来完成。这种“三次握手”机制既可以由一方TCP发起同步握手过程而由另一方TCP响应该同步过程, 也可以由通信双方同时发起连接的同步握手。 下面是最常见的三次握手过程: ① TCP实体A向TCP 实体B发送1个同步TCP段请求建立连接。例如, 该TCP段简要表示成〈SEQ=100〉〈CTL=SYN〉, 其中“〈〉”中的内容为TCP段中的字段。 ② TCP实体B将确认TCP实体A的请求, 并同时向TCP实体A发出同步请求。例如, 该TCP段为〈SEQ=300〉〈ACK=101〉〈CTL=SYN, ACK〉。 ③ TCP实体A将确认TCP实体B的请求, 即向TCP实体B发送确认TCP段。例如, 该TCP段为〈SEQ=101〉〈ACK=301〉〈CTL=ACK〉。 ④ TCP实体A在已建立的连接上开始传输TCP数据段。例如, 该TCP段为〈SEQ=101〉〈ACK=301〉〈CTL=ACK〉〈DATA〉。 可以将上述过程用以下动画来表示。
过程此外, 在建立连接过程中, 对于出现的异常情况, 如本地同步请求与过去遗留在网络中的同步连接请求序号相重复、因系统异常使通信双方处于非同步状态等, TCP协议要通过使用复位(RST) TCP段来加以恢复, 即发现异常情况的一方发送RST段通知对方来处理异常。 4. 关闭连接由于TCP连接是一个全双工的数据通道, 一个连接的关闭必须由通信双方共同完成。当通信的一方没有数据需要发送给对方时, 可以使用FIN段向对方发送关闭连接请求。这时, 它虽然不再发送数据, 但并不排斥在这个连接上继续接收数据。只有当通信的对方也递交了关闭连接请求后, 这个TCP连接才会完全关闭。 在关闭连接时, 既可以由一方发起而另一方响应, 也可以双方同时发起。无论怎样, 收到关闭连接请求的一方必须使用ACK段给予确认。实际上, TCP连接的关闭过程也是一个三次握手的过程, 参见以下动画。
5. 流量控制一旦连接建立起来后, 通信双方就可以在该连接上传输数据了。在数据传输过程中, TCP协议提供一种基于动态窗口协议的流量控制机制, 使接收方TCP实体能够根据自己当前的缓冲区容量来控制发送方TCP实体传送的数据量。流量控制实际上反映了信道容量和接收缓冲区容量的有效利用和动态分配问题。 TCP的窗口流控机制不同于X.25协议中窗口尺寸固定的滑动窗口协议, 它采用的是一种称为信用证的动态窗口机制, 主要通过TCP段中的窗口字段和确认号字段实现的。窗口对应于TCP实体能够接收的数据的序号空间, 确认号表示TCP实体希望接收的下一个数据字节的序号。 在建立连接时, 双方使用SYN段或ACK段中的窗口字段捎带着相互通告各自的窗口尺寸, 即发放信用证。 在数据传输过程中, 发送方按接收方通告的窗口尺寸和序号发送一定的数据量。接收方可根据接收缓冲区的使用状况动态地调整接收窗口, 并在输出数据段或确认段时捎带着将新的窗口尺寸和起始序号(在确认号字段中指出)通告给发送方。 发送方将按新的起始序号和新的接收窗口尺寸来调整发送窗口, 接收方也用新的起始序号和新的接收窗口大小来验证每一个输入数据段的可接受性。 6.PUSH操作在一个TCP连接上进行正常数据传送过程中, 发送方会按规定的方式来分段和发送上层协议递交的数据。这样, 对于递交了该数据的上层协议来说, 在数据发送完成前, 无法知道自身递交的数据是否在发送, 发送是否由于本地或远程TCP实体正等待一个合适的窗口而被延迟。 PUSH(推进)数据机制可使得上层协议递交的数据能够迅速地从本地推向远地, 而不受发送方当前发送窗口大小和发送方式所限制。 当发送方TCP收到上层协议的PUSH操作请求时, 它将在流量控制允许的范围内进行数据分段并发送本地TCP缓冲区中所有数据(TCP段头中的PSH标志位被置位)。当接收方TCP收到带有PSH标志的 TCP数据段后, 将迅速把这些数据段递交给上层协议并结束当前的接收命令。 发送方和接收方TCP实体对于连续的推进, 并不保证各个推进边界, 它们可以把若干推进单元合成一个推进单元来发送和接收。发送方TCP可以把常规数据和推进数据混合发送, 但常规数据必须放在连续的推进数据之前。 7.紧急数据任何一个TCP输出段都可以携带紧急数据(Urgent Data), 以支持上层协议间紧急信息的快速传递。紧急数据必须位于数据段中所有数据的最前端, 并在TCP段头中设置如下字段: ①设置URG标志位, 表示当前数据段中携带有紧急数据。 ②设置紧急指针。紧急指针与当前输出段的序号之和指出数据流中紧急数据最后一个字节。对于一个包含该字节的数据段来讲, 其紧急数据长度从段序号开始一直延续到该字节为止。 当接收方TCP收到含有紧急数据的TCP数据段后, 首先把紧急数据从正常数据流中分离出来, 并保存在适当地方。然后, 以一定的方式通知上层协议,希望它尽快地响应和处理。 当发送方TCP接到上层协议递交的紧急数据后, 并不是立即发送紧急数据,而是把它们排入正常数据的发送队列中。此后, 发送方TCP每发送一个数据段都要带有URG标志和紧急指针, 直到出现真正含有紧急数据的数据段为止; 不过越靠后的数据段紧急指针的值就越小。也就是说, 含有URG标志和紧急指针的数据段不一定就含有紧急数据, 只有包含紧急指针所指示的字节的数据段才真正含有紧急数据, 从段序号开始到该字节为止皆为紧急数据。此外, 发送方TCP即使发送窗口为 0 时也要对带有URG标志的数据段实行强制发送, 不管它们是否含有紧急数据。 8.TCP的多路复用机制TCP协议的多路复用功能是通过端口机制提供的。端口是用于标识TCP连接的地址集,一个主机上的多个应用进程可以通过不同的端口同时使用TCP实体进行通信,从而达到多路复用的目的。 不同主机上的TCP实体对端口地址的选取是独立的, 只要保证本地端口地址的惟一性就可以保证整个TCP连接的惟一性,即网间惟一的IP地址和本地惟一的端口地址将惟一地确定了通信连接的一端。一个本地端口可以同时与多个远地端口建立通信连接。 在TCP协议内部定义了一个“周知”端口的集合, 属于该集合的端口都对应了某一确定的上层服务, 如FTP服务器、Telnet服务器等。这些服务器通过指定的端口来响应远地的服务请求, 并为这些请求提供相应的服务。 9.TCP的优先级和安全性TCP协议的优先级和安全性参数是由TCP实体的上层应用进程指定的, 并通过IP协议的选项操作传送给远地通信实体。 当远地TCP实体收到的安全性参数与在建立连接时所协商的参数值不相匹配时, 或者收到的优先级参数低于协商值时, 远地TCP将通过复位(RST)段复位已建立的连接。 TCP的安全性参数包括安全性、分隔域、用户组和处理限制。 TCP的安全性和优先级是可选的功能, 在一些TCP/IP的实现并不支持优先级和安全性机制。 2 UDP协议UDP提供一种面向进程的无连接传输服务,这种服务不确认报文是否到达, 不对报文排序, 也不进行流量控制, 因此UDP报文可能会出现丢失、重复及失序等现象。对于差错、流控和排序的处理,则由上层协议(ULP)根据需要自行解决,UDP协议本身并不提供。与 TCP相同的是,UDP协议也是通过端口号支持多路复用功能,多个ULP可以通过端口地址共享单一的UDP实体。 由于UDP是一种简单的协议机制, 通信开销很小, 效率比较高, 比较适合于对可靠性要求不高,但需要快捷、低延迟通信的应用场合, 如多媒体通信等。 1.UDP报文格式UDP报文格式如下图所示。 UDP报头各个字段意义如下: ·源端口号为发送方的UDP端口号, 支持UDP多路复用机制。它是一个可选的字段, 不用时设为0。 ·目的端口号为接收方的UDP端口号, 支持UDP多路复用机制。 ·报文长度包括UDP报头和数据在内的报文长度, 以字节为单位, 最小值为 8 (报头长度)。 ·校验和的计算对象包括伪协议头、UDP报头和数据。校验和是可选字段, 该字段为 0 时, 表示发送方没有为该UDP数据报提供校验和。 2.UDP发送与接收UDP数据报是通过IP协议发送和接收的。网间寻址由IP地址完成, 进程间寻址则由UDP端口来实现。 当发送数据时, UDP实体构造好一个UDP数据报后递交给IP协议,IP协议将整个UDP数据报封装在IP数据报中,即加上IP报头, 形成IP数据报发送到网上。 在接收数据时, UDP实体首先判断接收到的数据报的目的端口是否与当前使用的某端口相匹配。如果匹配, 则将数据报放入相应的接收队列;否则丢弃该数据报, 并向源端发送一个“端口不可达”的ICMP报文。另外, 当接收缓冲区已满时, 即使是端口匹配的数据报也要丢弃。 UDP在计算校验和时要包括一个伪协议头, 它不是UDP数据报的有效成分, 主要用于验证UDP数据报是否正确地传送到目的地。伪协议头包含有源IP地址、目的IP地址、协议号及UDP报长等字段, 有关信息来自于IP报头。 3 传输层端口下面对传送层端口的概念和用途作一综合性介绍。 传送层的重要功能之一就是提供了面向进程的通信机制。因此, 传送层协议必须提供某种方法来标识进程。TCP/UDP协议采用端口(Port)概念来标识通信进程。端口相当于OSI传输层的服务访问点(TSAP), 它是一种抽象的软件结构, 内部包含一些数据结构和I/O缓冲区。进程通过系统调用与某个或某些端口建立联系后, 就可以使用相应的端口来传输数据了。 另一方面, 端口又是进程访问传输服务的入口点, 它提供了多个进程共享同一端口的多路复用功能。每个端口都使用惟一的端口号来标识, 进程的通信主要表现在对端口的操作, 通过端口号来获取相应的端口, 然后对端口进行读写操作。这样, 进程间的通信操作如同一般的I/O操作, 以程序员熟悉的方式进行, 简化了网络应用程序的编程。 TCP和UDP协议的端口号值均是 16 位, 分别可以提供216个不同的端口。那么以什么样的规则来使用这些端口号才能在不同主机的进程间进行通信呢? 这就是端口号的分配问题。 TCP和UDP协议将端口号分为两部分。一部分是保留端口, 占全部端口号的一小部分, 以全局方式分配。这些端口就是所谓的“周知”端口, 由有关的权威机构分配,参见表1和表2。TCP和UDP都有自己的保留端口, 而且都是从 0 开始顺序向上分配的。另一部分是自由端口, 占全部端口号的绝大部分, 以本地方式分配。当一个进程与另一个进程通信之前, 该进程首先申请一个本地自由端口, 然后再用已知的远地端口(周知端口或自由端口)与远地进程建立联系, 并进行数据传输。
表1 TCP周知端口分配表
表2 UDP周知端口分配表 |
|