在TCP/IP协议模型中,传输层位于网络层与应用层之间,其主要的功能是负责应用程序之间的通信,连接端口的管理、流量的控制、错误处理与数据重发等。本节重点介绍TCP/IP协议集中传输协议TCP、UDP和网际协议IP。
1.TCP协议概述
传输控制协议(TCP)是为同一网络中或者连接到一个互联网络系统的成对计算机提供可靠的主机到主机的通信协议。其主要目的是为驻留在不同主机的进程之间提供可靠的、面向连接的数据传送服务。在网络体系结构中,TCP的上面是应用程序,下层是IP协议,TCP可以根据IP协议提供的服务传送大小不等的数据,IP协议负责对数据分段、重组,在多种网络上传送。
为了在并不可靠的网络上实现面向连接的可靠的数据传送,TCP必须解决可靠性、流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,而且必须解决连接问题,这样TCP才能称为面向连接的可靠的协议。TCP通过下列方式来实现数据的可靠传输:
(1)将信息分割成TCP认为最适合发送的数据块。
(2)当TCP发出一个段后,它启动一个定时器,等待目的端确认接收到这个报文段。如果不能及时收到这个确认,将重发这个报文段。
(3)当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,而是延迟一段时间。
(4)TCP将保持它首部和数据的校验和。如果收到段的校验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
(5)TCP报文段作为IP数据包来传输,而IP数据包的到达可能会失序,因此TCP的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序。
(6)IP数据包会发生重复,TCP的接收端必须丢弃重复的数据。
(7)TCP还能提供流量控制,这将防止较快主机致使较慢主机的缓冲区溢出。
TCP的数据传输具有5个特征:面向数据流、虚电路连接、有缓冲的传送、无结构的数据流和全双工连接。一旦数据包被破坏或丢失,则由TCP将其重新传输。
2.TCP的结构
TCP数据在IP数据报中的封装如图2.28所示。
图2.28 TCP数据报格式
TCP数据包头格式如表2.6所示。每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP包头中的源端IP地址和目的端IP地址,唯一确定一个TCP连接。有时,一个IP地址和一个端口号也称为一个插口(socket),插口对(socket pair)(包含客户IP地址、客户端口号、服务器IP地址和服务器端口号的四元组)可唯一确定互联网络中每个TCP连接的双方。
表2.6 TCP数据包头格式
序号用来标识从TCP发端向TCP收端发送的数据字节流。它表示在这个报文段中的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。序号是32位的无符号数,序号到达231后又从0开始。存在同步序列(SYN)时,当建立一个新的连接时,SYN标志变1。序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。
确认序号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。只有当后面的ACK标志为1时确认序号字段才有效。一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
首部长度给出首部中32位字的数目表明段中数据开始的位置。之所以需要此字段是因为选项字段长度可变(与报头一样)。
在TCP首部中有6个标志位,它们中的多个可同时被设置为1。
· URG:紧急指针(urgent pointer)有效。
· ACK:确认序号有效。
· PSH:接收方应该尽快将这个报文段交给应用层。
· RST:重建连接。
· SYN:同步序号用来发起一个连接。
· FIN:发端完成发送任务。
· 窗口大小声明段发送者可接收的字节数,该编号以确认字段编号的首位开始。
· 校验和证明段传送无误,如果传送错误则丢弃该段。
· 紧急指针是一个正的偏移量,与序号字段中的值相加表示紧急数据最后一个字节的序号。只有在URG置位时才有效,紧急方式是发送端向另一端发送紧急数据的一种方式。
· 选项表示TCP选项的长度可变字段。
3.TCP连接的建立和终止
TCP协议栈支持同时建立两个TCP连接:一个为主动连接;另一个为被动连接。TCP是基于连接的协议,因为必须保持对TCP连接状态的监视和状态有关的信息保存在发送控制块中,而TCP连接状态的改变由TCP的软件状态机来实现。软件状态机又由事件或用户来触发。比如,当监视到一个带有SYN标志的TCP报到达时,状态机就将TCP连接转换到接收状态,用户也可以手工控制状态机处于发送状态来建立TCP连接。
建立了TCP连接,才可以发送或接收数据。接收数据时,上层协议(ULP)按字节发送,并被划分到TCP数据片中,经过状态机去掉TCP包头后再送到应用层;发送数据时,软件状态机会在数据前面加上TCP包头再发送到IP层。发送数据时,有一点值得关注:为了防止接收缓冲区的溢出,相对于发送数据包,协议栈给予接收数据包以更高的优先级。也就是说,协议栈软件会一直处理接收的数据包,直到接收缓冲区中没有任何数据。
TCP是一个面向连接的协议。从一方向另一方发送数据之前,都必须先在双方之间建立一条连接。
为了建立一条TCP连接,必须经过以下3次握手过程:
(1)请求端(通常称为客户)发送一个SYN段来指明客户打算连接的服务器的端口,以及初始序号ISN。这个SYN段为报文段1。
(2)服务器发回包含服务器的初始序号的SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
(3)客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文段3)。在此过程中,发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回一个SYN的另一端执行被动打开(passive open)。
建立一个连接需要3次握手,而终止一个TCP连接要经过4次握手。因为一个TCP连接是全双工的,所以每个方向必须单独的关闭。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在接收到一个FIN后仍能发送数据。首先进行关闭的一方(即发送第一个FIN)将执行主动关闭,而另一方(收到这个FIN)将执行被动关闭。
1.UDP协议概述
UDP(用户数据报协议)主要用来支持那些需要在计算机之间传输数据的网络应用。众多的客户机/服务器模式的网络系统都使用,UDP。与TCP协议一样,在TCP/IP协议层次模型中,UDP位于IP层之上应用程序范围,UDP层然后使用IP层传送数据。IP层的包头表明了源主机的和目的主机地址,而UDP层的包头指明了主机上的源端口和目的端口。
UDP是一个简单的面向数据报的传输层协议,进程的每个输出操作都正好产生一个UDP数据包,并组装成一份待发送的IP数据包。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据包可能没有什么联系。UDP协议和TCP相似,同属传输层协议,都作为应用程序和网络传输的中介。
与TCP协议相比,UDP不提供可靠性,它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。但UDP提供某种程度的差错控制,它只完成非常有限的差错检验。如果UDP检测出在收到的分组中有一个差错,它就悄悄地丢弃这个分组。UDP的优点协议非常简单,且开销最小。若一个进程想发送一个很短的报文而不关心可靠性,使用UDP要比使用TCP简单许多。
2.UDP数据包格式
UDP数据包封装成一份IP数据包的格式如图2.29所示。数据包包含IP首部、UDP首部和UDP数据。
图2.29 UDP数据包格式
UDP首部的各字段如表2.7所示。
表2.7 UDP首部字段
端口号表示发送进程和接收进程。由于IP层已经把IP数据包分配给TCP或UDP(根据IP首部中协议字段值),因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。
UDP长度字段:指的是UDP首部和UDP数据的字节长度。该字段的最小值为8字节(发送一份0字节的UDP数据包是0KB)。这个UDP长度是有冗余的。IP数据包长度指的是数据包全长,因此UDP数据包长度是全长减去IP首部的长度(该值在首部长度字段中指定)。
检验和:检验出现的差错。UDP的检验和与IP的检验和不同。UDP检验和覆盖UDP首部和UDP数据,TCP也是这样,但UDP的检验和是可选的,而TCP的检验和是必需的。
UDP数据包的长度可以为奇数字节,但是检验和算法是把若干个16位字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送)。
UDP数据包和TCP段都包含一个12字节长的伪首部,它是为了计算检验和而设置的。伪首部包含IP首部一些字段,其目的是让UDP两次检查数据是否已经正确到达目的地(例如,IP没有接收地址不是本主机的数据包,以及IP没有把应传给另一高层的数据包传给UDP)。
UDP数据包中的伪首部格式如图2.30所示。在图中,如果数据长度是奇数,在进行检验和计算时必须加上填充字节。
图2.30 UDP数据包中的伪首部格式
1.IP协议概述
IP协议是开放系统互连模型的一个主要协议,是TCP/IP协议族使用的传输机制,也是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据包格式传输。
IP协议位于TCP/IP模型的网络层,对上可接收传输层各种协议的信息,如TCP、UDP等;对下可将IP数据包传送到链路层,通过以太网、令牌环网等各种技术传输。从应用角度看,IP协议提供一种无连接、不可靠、尽力发送的服务。其中无连接表示每个IP数据包都是独立发送的,因此它必须包含目的地址,每一个分组使用不同的路由传到目的站;不可靠表示在传输过程中,IP数据包可能出现丢失、延时等差错,数据包可能不按顺序到达。尽力发送是指TCP/IP并不随意地放弃数据包。
IP协议根据其版本可以分为IPv4和IPv6。目前在使用的主要是IPv4。
IP可提供的服务可分为两项:IP数据包的传送;IP数据包的分段和重装。与IP协议配套使用的还有3个协议:地址解析协议ARP、反向地址解析协议RARP和因特网控制报文协议ICMP。
2.IP数据包的格式
IP层分组称为数据包,是一个变长分组。它由首部和数据两部分组成。其中,首部由两部分组成:固定部分+可变部分。固定部分长度为20字节,可变部分由选项组成,最长为40字节。
IP数据包的格式如表2.8所示。
表2.8 IP数据包格式
(1)版本:一般为4位,所有字段按版本号4来解释。若目的机器使用其他版本,则应丢弃数据包,而不错误地解释数据。
(2)首部长度:定义数据包以4字节计算的总长度。由于它是一个4比特字段,因此首部最长为60字节。没有选项时首部长度为20字节,普通IP数据包(没有任何选择项)字段的值是5。
(3)服务类型(TOS):定义路由器如何处理此数据包。包括一个3位的优先子字段(现在已被忽略)遇到问题时根据优先级处理数据包,4位的TOS子字段和1位未用位,但必须置0,如图2.31所示。
图2.31 8位服务类型
D0~D2为优先字段,遇到问题时根据优先级处理数据包。版本4中用4位的TOS字段D、T、R和C分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4位中只能置其中1位。如果所有4位均为0,那么就意味着是一般服务。0000代表“正常(默认)”;0001代表“最小费用”;0010代表“最高可靠性”;0100代表“最大吞吐量”;1000代表“最小延时”。选择的原则为:交互式活动属于需要立即引起注意的活动,和需要立即响应的活动,所以需要最小延时;发送成块数据需要最大吞吐量;管理活动需要最高可靠性;后台活动需要最小费用。
(4)总长度:是一个两字节的域,能定义的长度最长可达65536字节。当数据报被分片时,该字段的值也随着变化。
(5)标识符字段:唯一的标识主机发送的每一份数据包。通常每发送一份报文它的值就会加1。
(6)标志位字段:3位组成,用于控制分段。第1位没有使用,接着是不分段DF和段未完MF标志。
DF为1时表示不允许机器将该数据包分片。若不分片就无法将此数据包通过任何可用的物理网络进行转发时,该数据包丢弃。同时向源站发ICMP差错报文。0表示必要时可分片。
MF表示该数据包是否还有其他片标志。1表示此数据包不是最后的分片,0表示此数据包是最后的分片或唯一分片。
(7)分段偏移字段:表示分片在整个数据包中的位置。以8字节为度量单位,故13位。将数据包进行分片的主机或路由器必须这样选择每一个分片的长度,即第一个字节数应能被8除尽。若对一个已分片的数据包再进行分片,分片偏移永远是相对于原始数据报的。
(8)生存时间字段TTL(time-to-live):设置了数据包可以经过的最多路由器数。它指定了数据包的生存时间。TTL的初始值由源主机设置(通常为32或64),一旦经过一个处理它的路由器,它的值就减去1。当该字段的值为0时,数据包就被丢弃,并发送ICMP报文通知源主机。
(9)首部检验和字段:根据IP首部计算的检验和码。它不对首部后面的数据进行计算。而在ICMP、IGMP、UDP和TCP各自的首部中均含有同时覆盖首部和数据的检验和码。
(10)协议字段:指定哪种高级协议可用来产生数据包数据区中携带的消息。也即指定采用哪一种传输层协议。对于ICMP此值为1,TCP为6,UDP为17,IPv6为41。
(11)源IP地址和目的IP地址指定发送者和所期望的接收者的IP地址。
(12)选项是一长度可变的字段用于各种选项。如记录所采用的路由,指定所采用的路由以及时标等。目前,这些任选项定义如下:
· 安全和处理限制(用于军事领域)。
· 记录路径(让每个路由器都记下它的IP地址)。
· 时间戳(让每个路由器都记下它的IP地址和时间)。
· 宽松的源站选路(为数据报指定一系列必须经过的IP地址)。
· 严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。