面向连接服务(connection-oriente dservices)的问题之一是,在可以传送数据之前总是必须经过三次握手的过程。在某些情况下,例如文件传输,因为需要确保成功的传输此文件的所有数据,这时面向连接的服务才有意义。然而在其他情况下,例如只想传送一个信息并且得到回复,或者干脆不需要回复信息时,进行三次握手的过程会增加不必要的额外开销。例如对于DNS查询服务,为了将完全合格域名(Fully Qualified Domain Name,FQDN)解析为IP地址,DNS客户端将会向DNS服务器发送单个查询并等待服务器的回应,在此过程中,只产生了两个消息:客户的查询消息和服务器的回应消息。由于两台设备之间的通信量很少,所以在发送查询消息之前建立可靠的连接没有意义。即使客户端没有收到回应消息,也可以由应用程序再次发送此查询信息,或者交由用户来处理。由于一开始没有建立连接,这种连接被称为无连接的服务。TCP/IP协议栈中的UDP提供了这种不可靠的无连接的服务。
传输层通过窗口的操作减少数据因溢出而丢弃,窗口大小规定在发送站必须等待接收站的确认(ACK)之前可以发送的信息量。一旦收到ACK,发送站就发出下一批信息(取决于窗口大小所定义的最大值)。例如,窗口大小是4,而当前的确认号是3,那么在下一个确认到达之前,发送站可以发送序号是3、4、5、6的数据段,而不需要得到确认。
窗口操作实现了两个功能,首先是基于窗口大小执行流量控制。窗口的大小是预先动态协商的,并且可在连接的使用期限内重新协商,这样就确保了在接收站不丢弃任何信息的情况下使用最佳的窗口大小来传送信息。其次,接收站可以通过窗口操作过程,通知发送站收到了什么信息。如向发送站表明在去往接收站的途中是否丢失了信息,并且允许发送站重发任何已经丢失的信息。这为连接提供了可靠性。
(二)TCP(Transmission Control Protocol,传输控制协议)
TCP/IP是一个包含多个协议的标准。它定义在一个互联网络上的设备之间如何通信。
TCP/IP的传输层主要负责在两台设备之间建立逻辑连接,并且可以提供可靠的连接和流量控制。TCP/IP包括两种传输层协议:TCP和UDP。
TCP的主要职责是在两台设备之间提供可靠的端到端的面向连接的逻辑服务(logicalservice)。TCP在网络层协议的基础上,向应用层进程提供可靠的、全双工的数据传输。它允许两个应用进程之间建立一个连接,应用进程通过该连接可以实现顺序、无差错、无重复和无报文丢失的流传输。
TCP也可以利用滑动窗口操作来实现流量控制,这样发送方设备就不会因为发送过多的数据段而超出接收站的承受能力。TCP协议的主要特点有以下几个方面:
1.面向连接服务(connection-oriente dservice)
面向连接的传输服务对保证数据流传输可靠性非常重要。它在进行实际数据报传输之前必须在源进程与目标进程之间建立连接。一旦连接建立之后,通信的两个进程就可以在此连接上发送和接收数据。
2.高可靠性(highre liability)
由于TCP协议是建立在不可靠的网络层协议的基础上的,在IP协议不提供任何保证分组数据传输可靠性机制的情况下,TCP协议的可靠性需要协议自身来实现。TCP协议支持数据可靠性的主要方法是序号、确认和超时重传。
TCP协议PDU称为数据段或段,它将上层用户数据报分割成一定长度的数据段。TCP将保持它头部和数据的校验和,目标是检测数据在传输过程中是否出现错误。在接收端,当TCP正确接收到报文时,它将发送确认。在发送端,当TCP发出一个报文后,将启动一个定时器,等待目标端确认收到这个报文。如果不能及时收到相应的确认,将重发这个报文。
TCP协议可以采用自适应的超时重传策略。
3.可靠连接的建立和释放(establi shandreleaser eliable connection)
为了保证连接建立和释放的可靠性,TCP协议使用三次握手(three-wayhandshake)机制。在连接建立阶段,防止出现因“失效的连接请求数据报”而造成连接错误。在释放连接时,保证在关闭连接时已经发送的数据报可以正确地到达目标端口。
4.流量控制和拥塞控制(flowcontro landcongestion control)
TCP协议采用大小可变的滑动窗口方法进行流量控制。发送窗口在建立连接时由双方商定。在数据传输过程中,接收端可以根据自身资源的情况,随机、动态地调整发送窗口的大小,而接收端将跟随发送端调整接收窗口。
TCP协议使用称为数据段的协议数据单元在设备间传输数据。
TCP报头的固定部分长度为20字节,选项部分最多为40字节且必须是0或是32比特(bit)的整数倍。
下面我们分别介绍TCP数据段结构的主要部分:
端口号(Port number)包括源端口号和目标端口号。每个端口号字段长度为16bits,分别表示发送该报文的应用进程的端口号和接收该报文的应用进程的端口号。
序号(Sequence number)字段长度为32bits。由于TCP协议是面向数据流的,它所传送的报文可以看作是连续的数据流。因此需要给发送的每一个字节进行编号。序号字段中的“序号”是指本报文数据的第一个字节的顺序号。例如,某个报文的序号为“101”,大小为100字节,那么该报文的第一个字节的顺序号为101,最后一个字节的顺序号是200。通过该字段,我们可以维持数据的完整性和对数据进行排序。
确认号(Ac knowledgement number)长度为4bytes(32bits),表明期望下次对方发送数据的第一个字节的序号(注意是字节而不是比特),也就是期望收到的下一个报文的首部中的序号。从这里我们可以知道,确认号具有与数据链路层中帧的捎带确认相似的作用,表明在此序号之前的所有数据都已成功接收。由于序号字段有32bits长,可对4GB的数据进行编号,这样就保证了当序号重复使用时,旧序号的数据已经在网络中消失了。
报头长度(Header length)占4bits,它指出数据开始的地方离TCP报文的长度有多远,因此也可称其为数据偏移字段。它表明了报头的长度。由于报头长度的不固定(报头的选项字段长度是不确定的),因此报头长度字段是必需的。这里需要注意,报头长度的单位是32bits(即4bytes),而不是字节和比特。
保留字段(Reserved field)的长度是6bits,留做今后使用。目前使用全部为零。
编码位(Codebits)定义了6种不同的控制字段或标志,每种一位,使用时在同一时间可设置其中的一个或者多个。编码位用于TCP的流量控制、连接的建立和释放、数据传输的方式和控制。下面我们分别介绍每位的意义。
窗口大小(Windo wsize)为2bytes。窗口大小实际上是报文发送方的接收窗口,单位为字节。通过该窗口告诉对方:“在未收到我的确认时,你能发送的数据的字节数至多是此窗口的大小。”窗口所对应的最大数据长度为65,535bytes。
校验和(Chec ksum)字段长度为2bytes。校验和字段检验的范围包括报头和数据这两部分。在计算校验和时,需要在TCP头部增加一个12字节的伪头部,伪头部中包括源IP和目标IP地址,1个byte的全0位,一个字节的TCP协议号(6),以及两个字节的TCP长度。对于TCP来说,伪头部是必须采用的。
紧急字段(Urg ent field)长度为2bytes。它与紧急比特URG共同使用,表明该报文中存在紧急数据。
选项(Options)TCP报头的选项是可变的。最多可以有40bytes的选项。选项包括以下两类:单字节选项和多字节选项。单字节选项包括选项结束和无操作。多字节选项包括最大报文长度、窗口扩大因子和时间戳。
数据(Data)上层协议数据,不包括TCP报头部分。
(三)用户数据报协议(User Datagram Protocol,UDP)
UDP是一种无连接的、不可靠的传输层协议,它在完成端到端的通信时没有流量控制机制,也没有确认机制,只提供了有限的差错控制。因此协议简单,在特定的应用中协议运行的效率高。设计UDP协议的目标是希望以较小的开销实现网络环境中的进程通信的目标。UDP适用于可靠性较高的局域网。如果进程需要发送一个很短的报文,同时对报文的可靠性要求不高,那就可以使用UDP协议。
某些实时应用,如IP电话、视频会议,它们要求主机以恒定的速度发送数据,在网络拥塞时可以丢失一些数据,并且不希望数据延时太大等特点,UDP正好满足了这种需求。此外,域名系统(DNS)、路由选择协议(RIP)、简单网络管理协议(SNMP)、网络文件服务(NFS)和多播(Multicast)服务在传输层也使用UDP协议。
UDP用户数据报有固定的8字节报头,其字段分别为:
端口号(portnu mber)
端口号包括源端口号和目标端口号,分别标识发送和接收数据的应用进程。端口号长度为16位。
长度字段(Length)
长度字段为2bytes。它定义了包括报头在内的用户数据报的总长度。因此,用户数据报的总长度最大为65,535bytes,最小为8bytes。
校验和(Chec ksum)
校验和字段长度为2bytes,用于提供整个UDP数据报的差错校验,使用循环冗余码校验CRC。UDP的校验范围包括3部分:伪头部(fakeheader)、UDP报头和应用层数据。伪头部是IP分组的一部分,只在校验过程,临时与UDP数据报结合在一起,即不向低层传输,也不向高层传送。如果应用程序对通信效率的要求高于可靠性时,应用进程可以选择不进行校验。
(四)传输层端口与应用层协议
TCP/IP的传输层提供了多路复用的功能,允许多个应用程序同时收发数据,并使用端口号来区别不同的连接。TCP和UDP使用端口号把信息传给上层,端口号被用于解释同时通过网络的不同连接会话间的区别。端口号由IANA(Internet Assigned Numbers Authority,因特网地址分配管理机构)分配,应用软件开发者同意使用IANA约定的端口号,如,约束FTP应用的连接会话使用标准的端口号:20和21。端口20用于数据传输,端口21用于连接控制。
某些特定范围的端口是不可以随便分配给网络应用或服务使用,端口号基本分为三类:
熟知端口号、注册端口号和临时端口号。端口号的分配范围如下:
(1)0~1023的端口号码被称为熟知端口号(或称为保留端口号)。
(2)1024~49151是注册端口号,某些厂商用于特定的应用或服务,需要向IANA注册。
(3)49152~65535是动态分配的端口号。这是由运行在客户端的应用程序随机选取的,可以被任何进程使用。
当发起一个远程应用程序连接时,操作系统(operating system)将选择一个系统中当前没有使用的大于1023的端口号,并将此号码指定为数据段的源端口号。根据所运行的应用程序,将其熟知端口号作为目标端口字段。接收站在接收到该数据段时,查看目标端口号,得知该数据应该定向到哪个应用程序中。
UDP与TCP协议一样,也是通过端口号来标识进程,实现多路复用。然而某些特定的端口类型是TCP端口或UDP端口,而有些端口可能既是TCP端口,又是UDP端口,如DNS的端口号53。
应用层是网络体系结构(networ ksystem structure)中的最高层,在应用层之上不存在其他的层。因此,应用层的任务不是为上层提供服务,而是向最终用户提供服务。每一个应用层的服务都是为了解决某一类具体的应用问题,而问题的解决往往通过位于不同主机中的多个进程之间的通信和协作来完成。为了解决具体的应用问题而彼此通信的进程称为应用进程(application process)。应用层的具体内容就是规定应用进程在通信时所遵循的协议。