肇东市网站,上海迈诺网站建设,国外设计文章的网站,厦门网站seo哪家好一、运输层协议概述
1. 进程之间的通信
从通信和信息处理的角度看#xff0c;运输层向它上面的应用层提供通信服务#xff0c;它属于面向通信部分的最高层#xff0c;同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时…一、运输层协议概述
1. 进程之间的通信
从通信和信息处理的角度看运输层向它上面的应用层提供通信服务它属于面向通信部分的最高层同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时都要使用协议栈中的运输层而网络核心部分中的路由器在转发分组时只用到下三层的功能。
下图说明运输层的作用。设局域网LAN1上的主机A和局域网LAN2上的主机B通过互连的广域网WAN进行通信。IP协议能够把源主机A发送出的分组按照首部中的目的地址送交到目的主机B那么为什么还需要运输层呢?
从IP层来说通信的两端是两台主机。IP数据报的首部明确地标志了这两台主机的IP地址。但”两台主机之间的通信“这种说法不够明确。真正进行通信的实体是在两台主机中的哪个构件呢是主机中的应用进程是一台主机中的应用进程和另一台主机中的应用进程在交换数据通信。严格来讲两台主机进行通信就是两台主机中的应用进程互相通信。IP协议虽然能把分组送到目的主机但是这个分组还停留在主机的网络层而没有交付主机的应用进程。
通信的两端应当是两个主机中的应用进程。也就是说端到端的通信是应用进程之间的通信。在一台主机中经常有多个应用进程同时分别和另一台主机中的多个应用进程通信。例如用户在使用浏览器查找某网站的信息时其主机的应用层运行浏览器客户进程。如果在浏览网页同时还要用电子邮件给网站发送反馈意见那么主机的应用层就还要运行电子邮件的客户进程。
下图中主机A的应用进程AP1和主机B的应用进程AP3通信与此同时应用进程AP2也和对方的应用进程AP4通信。这表明运输层有一个很重要的功能-复用和分用。”复用“是指在发送方不同的应用进程都可以使用同一个运输层协议传送数据当然需要加上适当的首部而”分用“是指接收方的运输层在剥去报文的首部后能够把这些数据正确交付目的应用进程。
下图中的两个运输层之间有一个深色双向粗箭头写明”运输层提供应用进程间的逻辑通信“。”逻辑通信“的意思是从应用层来看只要把应用层报文交给下面的运输层运输层就可以把这报文传送到对方的运输层好象这种通信就是沿水平方向直接传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。数据的传送是沿着图中的虚线方向经过多个层次传送的。”逻辑通信“的意思是”好像是这样通信但事实上并非真的这样通信“。 这里可以看出网络层和运输层有明显区别。网络层为主机之间的通信提供服务而运输层则在网络层的基础上为应用进程之间的通信提供服务。然而正如后面要讨论的运输层还具有网络层无法代替的许多其他功能。
运输层还要对收到的报文进行差错检测。在网络层IP数据报首部中的检验和字段只检验首部是否出现差错而不检查数据部分。
根据应用程序的不同需求运输层需要有两种不同的运输协议即面向连接的TCP和无连接的UDP
运输层向高层用户屏蔽了下面网络核心的细节如网络拓扑、所采用的路由选择协议等它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道但这条逻辑通信信道对上层的表现却因运输层使用的不同协议而有很大的差别。当运输层采用面向连接的TCP协议时尽管下面的网络是不可靠的只提供尽最大努力服务但这种逻辑通信信道就相当于一条全双工的可靠信道。但当运输层采用无连接的UDP协议时这种逻辑通信信道仍然是一条不可靠信道。 2. 运输层的两个主要协议
TCP/IP运输层的两个主要协议都是互联网的正式标准即
1用户数据报协议UDPUser Datagram Protocol[RFC 768STD6]
2传输控制协议TCPTransmission Control Protocol[RFC 793STD7]
下图给出了这两种协议在协议栈中的位置。 按照OSI的术语两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDUTransport Protocol Data Unit。但在TCP/IP体系中则根据所使用的协议是TCP或UDP分别称之为TCP报文段或UDP用户数据报。
UDP在传送数据之前不需要先建立连接。远地主机的运输层在受到UDP报文后不需要给出任何确认。虽然UDP不提供可靠交付但由于UDP非常简单在某些情况下UDP是一种最有效的工作方式。
TCP则提供面向连接的服务。在传送数据之前必须先建立连接数据传送结束后要释放连接。TCP不提供广播或多播服务。由于TCP要提供可靠地、面向连接的运输服务因此不可避免地增加了许多开销如确认、流量控制、计时器以及连接管理等。这不仅使协议数据单元的首部增大很多还要占用许多地处理机资源。
下标给出了一些应用和应用层协议主要使用的运输层协议UDP 或TCP。 3. 运输层的端口
运输层的复用和分用功能。其实日常生活中也有很多复用和分用的例子。假定一个机构的所有部门向外单位发出的公文都由收发室负责寄出这相当于各部门都”复用“这个收发室。当收发室收到从外单位寄来的公文时则要完成”分用“功能即按照信封上写明的本机构的部门地址把公文正确进行交付。
运输层的复用共和分用功能也是类似的。应用层所有的应用进程都可以通过运输层再传送到IP层网络层这就是复用。运输层从IP层收到发送给各应用进程的数据后必须分别交付指明的各应用进程这就是分用。显然给应用层的每个应用进程赋予了一个非常明确的标志至关重要。
在单个计算机中的进程是用进程标识符一个不大的整数来标志的。但是在互联网环境下用计算机操作系统所指派的这种进程标识符来标志运行在应用层的各种应用进程则是不行的。因为在互联网上使用的计算机的操作系统种类很多而不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信就必须用统一的方法而这种方法必须与特定操作系统无关对TCP/IP体系的应用进程进行标志。
但是把一个特定机器上运行的特定进程指明为互联网上通信的最后终点是不可行的。这是因为进程的创建和撤销都是动态的通信的一方无法知道和识别对方机器上的进程。另外我们往往需要利用目的主机提供的功能来识别终点而不需要知道具体实现这个功能的进程是哪一个。
在应用层和运输层之间的界面上设置一个特殊的抽象的”门“。应用层中的应用进程要通过运输层发送到互联网必须要通过这个门。而别的主机上的应用进程要寻找本主机中的某个应用进程也必须通过这个门。这样就可以把应用层和运输层的界面上这些”门“设为通信的抽象终点。这些抽象终点的正式名称就是协议端口protocol port一般简称为端口port。每一个端口用一个称为端口号port number的正整数来标志。主机的操作系统提供了接口机制使得进程能够通过这种机制找到所要找的端口。
注意这种在协议栈层间的抽象的协议端口是软件端口和路由器或交换机上的硬件端口是不同的概念。硬件端口是不同硬件设备进行交互的端口而软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。不同的操作系统具体实现端口的方法可以是不同的。
当应用层要发送数据时应用进程就把数据发送到适当的端口然后运输层从该端口读取数据进行后续的处理把数据发送到目的主机。当运输层收到对方主机发来的数据时就把数据发送到适当的端口然后应用进程就从该端口读取这些数据。显然端口必须有一定容量的缓存来暂时存放数据。
后面的UDP和TCP的首部格式中图5-5图5-14都有源端口和目的端口这两个重要字段。这两个端口就是运输层和应用层进行交互的地点。
TCP/IP的运输层用一个16位端口号来标志一个端口。但注意端口号只具有本地意义它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网不同计算机中相同的端口号是没有关联的。16位的端口号可允许有65535个不同的端口号这个数目对一个计算机来说是足够用的。
由此可见两个计算机中的进程要通信不仅需要知道对方的IP地址找到对方的计算机而且要知道对方的端口号找到对方计算机中的应用进程。这和寄信的过程类似写信时填地址相当于IP地址还有收件人的姓名相当于端口号。信封上还要写自己的地址和姓名。收信人回信时很容易在信封上找到发信人的地址和姓名。互联网上的计算机通信采用客户-服务器方式。客户在发起通信请求时必须先知道对方服务器的IP地址和端口号。因此运输层的端口号分为以下两大类。
1服务器端使用的端口号
这里又分为两类最重要的一类叫作熟知端口号well-known port number或全球通用端口号数值为0~1023。这些熟知端口号最初公布在文档中[RFC 1700STD2]但后来因为互联网发展太快这种标准文档无法随时更新因此在RFC3232中就把RFC1700列为陈旧的而当前最新的熟知端口号可在网址www.iana.org上查到。IANA把这些熟知端口号指派给了TCP/IP最重要的一些应用程序让所有用户都知道。当一种新的应用程序出现后IANA必须为它指派一个熟知端口否则在互联网上的其他应用进程就无法和它进行通信。和电话通信相比熟知端口号相当于所有人都知道的应急电话120110等。下标给出了一些常用的熟知端口号。 另一类叫作登记端口号数值为1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。要使用这类端口号必须在IANA按照规定的手续登记以防止重复。
2客户端使用的端口号
数值为49152~65535。由于这类端口号仅在客户进程运行时才动态选择因此又叫作短暂端口号。这类端口号就是临时端口号留给客户进程选择临时使用。当服务器进程收到客户进程的报文后就知道了客户进程所使用的端口号因而可以把数据发送给客户进程。通信结束后刚才已使用过的客户端口号就被系统收回以便给其他客户进程使用。 二、用户数据报协议UDP
1. UDP概述
用户数据报协议UDP只在IP的数据报服务至上增加了很少一点功能这就是复用和分用的功能以及差错检测的功能。UDP的主要特点
1UDP是无连接的即发送数据之前不需要建立连接因此减少了开销和发送数据之前的时延。
2UDP使用尽最大努力交付即不保证可靠交付因此主机不需要维持复杂的连接状态表。
3UDP是面向报文的。发送方的UDP对应用程序交下来的报文在添加首部后就向下交付IP层。UDP对应用层交下来的报文既不合并也不拆分而是保留这些报文的边界。这就是说应用层交给UDP多长的报文UDP就照样发送即一次发送一个报文如下图所示。在接收方的UDP对IP层交上来的UDP用户数据报在去除首部后就原封不动地交付上层的应用进程。也就是说UDP一次交付一个完整的报文。因此应用程序必须选择合适大小的报文。若报文太长UDP把它交给IP层后IP层在传送时可能要进行分片这会降低IP层的效率。反之若报文太短UDP把它交给IP层后会使IP数据报的首部的相对长度太大这也降低了IP层的效率。 4UDP没有拥塞控制因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用很重要。很多的实时应用如IP电话、实时视频会议等要求源主机以恒定的速率发送数据并且允许在网络发生拥塞时丢失一些数据但却不允许数据有太大的时延。UDP正好适合这种要求。
5UDP支持一对一、一对多、多对一和多对多的交互通信。
6UDP的首部开销小只有8个字节比TCP的20个字节的首部要短。
举例说明UDP的通信和端口号的关系如下图所示。主机H1中有三个应用进程分别要和主机H2中的两个应用进程进行通信。通信双方的关系是P1-P4P2-P4P3-P5。主机H1的操作系统为这三个进程分别指派了端口其端口号分别为ab和c。图中位于应用层和运输层之间的小方框代表端口。在端口小方框中间还画有队列表示端口具有缓存的功能可以把收到的数据暂时存储一下。有时也可以把队列画成双向的即分别表示存放来自应用层或运输层的数据。现在假定主机H1中的进程已经知道了对方进程P4和P5的端口号分别为x和y于是在主机H1的运输层就可以组装成需要发送的UDP用户数据报其中最重要的地址信息源端口目的端口分别是axbx和cy。下图中把运输层以下的都省略了。因此进程之间的通信现在可以看成是两个端口之间的通信。
图中在两个运输层之间有一条虚线表示在两个运输层之间可以进行通信而不是在一条连接。但这种通信是不可靠的通信即所发送的报文在传输过程中有可能丢失同时也不保证报文都能按照发送的先后顺序到达终点。这正是UDP通信的特点简单方便但不可靠。如果想要得到可靠地运输层通信那就要使用TCP进行通信。注意在两个运输层的UDP之间没有建立连接。 上图的例子画出了多对一的通信a-xb-x。如果改成a-xa-y则是一对多的情况了。
主机H1中的3个应用进程把用户数据通过各自的端口传送到了运输层后就共用一个网络层协议把收到的UDP用户数据报组装成不同的IP数据报发送到互联网。这就是UDP的复用功能。主机H2的网络层收到3个IP数据报后提取出数据部分即UDP用户数据报然后根据其首部中的目的端口号分别传送到相应的端口以便上层的应用进程到端口读取数据。这就是UDP的分用功能。
虽然某些实时应用需要使用没有拥塞控制的UDP但当很多的源主机同时都向网络发送高速率的实时视频流时网络就有可能发生拥塞结果大家都无法正常接收。因此不使用拥塞控制功能的UDP有可能会引起网络产生严重的拥塞问题。
还有一些使用UDP的实时应用需要对UDP的不可靠的传输进行适当的改进以减少数据的丢失。这种情况下应用进程本身可以在不影响应用的实时性的前提下增加一些提高可靠性的措施如采用前向纠错或重传已丢失的报文。 2. UDP的首部格式
用户数据报UDP有两个字段数据字段和首部字段。首部字段很简单只有8个字节如下图由4个字段组成每个字段的长度都是2字节。各字段意义如下
1源端口 源端口号。在需要对方回信时选用。不需要时可全为0。
2目的端口 目的端口号。这在终点交付报文时必须使用。
3长度 UDP用户数据报的长度其最小值是8仅有首部。
4校验和 检测UDP用户数据报在传输中是否有差错。有错就丢弃。 如果接收方UDP发现收到的报文中目的端口号不正确即不存在对应于该端口号的应用进程就丢弃该报文并由网际控制协议ICMP发送“端口不可达”差错报文给发送方。上一章的”ICMP的应用举例“谈论traceroute时就是让发送的UDP用户数据报故意使用一个非法的UDP端口结果ICMP就返回”端口不可达“差错报文因而达到了测试的目的。
UDP用户数据报首部中检验和的计算方法有些特殊。在计算检验和时要在UDP用户数据报之前增加12个字节的伪首部。所谓”伪首部“是因为这种伪首部并不是UDP用户数据报真正的首部。只是计算检验和时临时添加在UDP用户数据报前面得到一个临时的UDP用户数据报。检验和就是按照这个临时的UDP用户数据报来计算的。伪首部既不向下传送也不向上递交而仅仅是为了计算检验和。上图的最上面给出了伪首部各字段的内容。
UDP计算检验和的方法和计算IP数据报首部检验和的方法相似。但不同的是IP数据报的检验和只检验IP数据报的首部但UDP的检验和是把首部和数据部分一起都检验。在发送方首先是先把全零放入检验和字段。再把伪首部以及UDP用户数据报看成是由许多16位的字串接起来的。若UDP用户数据报的数据部分不是偶数个字节则要填入一个全零字节但此字节不发送。然后按二进制反码计算出这些16位字的和。将此和的二进制反码写入检验和字段后就发送这样的UDP用户数据报。在接收方把收到的UDP用户数据报连同伪首部以及可能的填充全零字节一起按二进制反码求这些16位字的和。当无差错时其结果应为全1。否则就表明有差错出现接收方就应丢弃这个UDP用户数据报也可以上交给应用层但附上出现了差错的警告。下图给出了一个计算UDP检验和的例子。这里假定用户数据报的长度是15字节因此要添加一个全0的字节。这种简单的差错检验方法的检错能力并不强但它简单处理起来较快。 上图所示伪首部的第3字段是全零第4字段是IP首部中的协议字段的值。以前讲过对于UDP此协议字段值为17第5字段是UDP用户数据报的长度。因此这样的检验和既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分有检查了IP数据报的源IP地址和目的地址。 三、传输控制协议TCP概述
1. TCP最主要的特点
TCP是TCP/IP体系中非常复杂的一个协议。TCP最主要的特点
1TCP是面向连接的运输层协议。这就是说应用程序在使用TCP协议之前必须先建立TCP连接。在传送数据完毕后必须释放已经建立的TCP连接。也就是说应用进程之间的通信好像在”打电话“通话前要先拨号建立连接通话结束后要挂机释放连接。
2每一条TCP连接只能有两个端点每一条TCP连接只能是点对点的一对一。
3TCP提供可靠交付的服务。通过TCP连接传送的数据无差错、不丢失、不重复并且按需到达。
4TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存用来临时存放双向通信的数据。在发送时应用程序在把数据传送给TCP的缓存后就可以做自己的事而TCP在合适的时候把数据发送出去。在接收时TCP把收到的数据存入缓存上层的应用进程在合适的时候读取缓存中的数据。
5面向字节流。TCP中的”流“指的是流入到进程或从进程流出的字节序列。”面向字节流“的含义是”虽然应用程序和TCP的交互是一次一个数据块大小不等但TCP把应用程序交下来的数据仅仅堪称是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系例如发送方应用程序交给发送方的TCP共有10个数据块但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序。但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一致。当然接收方的应用程序必须有能力识别收到的字节流把它还原成有意义的应用层数据。下图是上述概念的示意图。 为了突出示意图要点只画出了一个方向的数据流。注意在实际的网络中一个TCP报文段包含上千个字节很常见而图中的各部分都之画出了几个字节仅仅方面地说明“面向字节流”的概念。另一点很重要的是上图中的TCP连接是一条虚连接也就是逻辑连接而不是一条真正的物理连接。TCP报文段先要传送到IP层加上IP首部后再传送到数据链路层再加上数据链路层的首部和尾部后才离开主机发送到物理链路。
上图可看出TCP和UDP在发送报文时所采用的方式完全不同。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中而是本剧对方给出的窗口之和当前网络拥塞的程度来决定一个报文段应包含多少个字节UDP发送的报文长度是应用进程给出的。如果应用进程传送到TCP缓存的数据块太长TCP就可以把它划分成为短一些的数据块再传送。如果应用进程一次只发来一个字节TCP也可以等待积累足够多的字节后再构成报文段发送出去。 2. TCP的连接
TCP把连接作为最基本的抽象。TCP的许多特性都与TCP是面向连接的这个基本特性有关。
每一条TCP连接有两个端点。那么TCP连接的端点是什么呢不是主机不是主机的IP地址不是应用进程也不是运输层的协议端口。TCP连接的端点叫作套接字socket或插口。根据RFC793的定义端口号拼接到concatenated withIP地址即构成了套接字。因此套接字的表示方法在点分十进制的IP地址后面写上端口号中间用冒号或逗号隔开。例如若IP地址是192.3.4.5而端口号是80那么得到的套接字就是192.3.4.5:80。总之有 每一条TCP连接唯一地被通信两端的两个端点即套接字对 socket pair所确定。即 这里IP1和IP2分别是两个端点主机的IP地址而port1和port2分别是两个端点主机中的端口号。因此TCP连接就是两个套接字socket1和socket2之间的连接。套接字socket是个很抽象的概念。
总之TCP连接就是由协议软件所提供的一种抽象。虽然有时为了方便也可以说在一个应用进程之间建立了一条TCP连接但一定要记住TCP连接的端点是个很抽象的套接字即IP地址端口号。记住同一个IP地址可以有多个不同的TCP连接而同一个端口号也可以出现在不同的TCP连接中。
本来socket的意思是插座或插口。选用socket这个名词是相当准确的。其实一条TCP连接就像一条电缆线其两端都各带有一个插头。把每一端的插头插入位于主机的应用层和运输层之间的插座后连个主机之间的进程就可以通过这条电缆线进行可靠通信了。但插座这个名词很容易让人想起来是个硬件而socket是个软件名词这样”套接字“就成了socket的标准译名了。
注意socket这个名词有时容易使人把一些概念混淆因为随着互联网的不断发展以及网络技术的进步同一个名词socket可表示多种不同的意思。例如
1允许应用程序访问连网协议的应用编程接口API即运输层和应用层之间的一种接口称为socket API简称为socket。
2socket API中使用的一个函数名也叫作socket。
3调用scoket函数的端点称为socket如”创建一个数据报socket“。
4调用socket函数时其返回值称为socket描述符可简称为socket。
5在操作系统内核中连网协议的Berkeley实现称为socket实现。 四、可靠传输的工作原理
TCP发送的报文是交给IP层传送的。但IP层只能提供尽最大努力服务也就是说TCP下面的网络所提供的是不可靠的传输。因此TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。
理想的传输条件有以下两个特点
1传输信道不产生差错。
2不管发送方以多块的速度发送数据接收方总是来得及处理收到的数据。
在这样的理想传输条件下不需要采用任何措施就能够实现可靠传输。
然而实际的网络都不具备以上两个理想条件。但可以使用一些可靠传输协议当出现差错时让发送方重传出现差错的数据同时在接收方来不及处理收到的数据时及时告诉发送方适当降低发送数据的速率。这样本来不可靠的传输信道就能够实现可靠传输了。 1. 停止等待协议
全双工通信的双方既是发送方也是接收方。为方便讨论仅考虑A发送数据而B接收数据并发送确认。因此A叫作发送方而B叫作接受方。因为这里讨论可靠传输的原理因此把传送的数据单元都称为分组而并不考虑数据是在哪一个层次上传送的。“停止等待”就是每发送完一个分组就停止发送等待对方的确认。在收到确认后再发送下一个分组。 1. 无差错情况
停止等待协议可用下图说明。下图a是最简单的无差错情况。A发送分组M1发完就暂停发送等待B确认。B收到了M1就向A发送确认。A在收到了对M1的确认后就再发送下一个分组M2。同样在收到B对M2的确认后再发送M3。 2. 出现差错
上图b是分组在传输过程中出现差错的情况。B接收M1时检测出了差错就丢弃了M1其他什么也不做不通知A收到有差错的分组。也可能是M1在传输过程中丢失了这时B什么都不知道。在这两种情况下B都不会发送任何信息。可靠传输协议是这样设计的A只要超过一段时间仍然没有收到确认就认为刚才发送的分组丢失了因而重传前面发送过的分组。这就叫作超时重传。要实现超时重传就要在每发送完一个分组时设置一个超时计时器。如果在超时计时器到期之前收到了对方的确认就撤销已设置的超时计时器。其实图a中A为每一个已发送的分组都设置了一个超时计时器。但A只要在超时计时器到期之前收到了相应的确认就撤销该超时计时器。
这里注意三点
1A在发送完一个分组后必须暂时保留已发送的分组的副本在发送超时重传时使用。只有在收到相应的确认后才能清除暂时保留的分组副本。
2分组和确认分组都必须进行编号。这样才能明确哪一个发送出去的分组收到了确认哪一个分组没有确认。
3超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。上图b中的一段虚线表示如果M1正确到达B同时A也正确收到确认的过程。可见重传时间应设定为比平均往返时间更长一些。显然重传时间设定得很长那么通信的效率就会很低。但如果重传时间设定得太短以致产生不必要得重传就浪费了网络资源。然而在运输层重传时间得准确设定非常复杂因为已发送的分组到底会经过哪些网络以及这些网络将会产生多大的时延这取决于这些网络当时的拥塞情况。下图中把往返时间当作固定的显然不符合网络的实际情况只是为了讲述原理的方便。
3. 确认丢失和确认迟到
下图a说明的是另一种情况。B所发送的对M1的确认丢失了。A在设定的超时重传时间内没有收到确认并无法知道是自己发送的分组出错、丢失或者是B发送的确认丢失了。因此A在超时计时器到期后就要重传M1。应注意B的动作。假定B又收到了重传的分组M1。这是应采取两个行动。
第一丢弃这个重复的分组M1不向上层重复交付。
第二向A发送确认。A之所以重传是因为A没有收到确认。 上图b也是一种情况的出现。传输过程中没有出现差错但B对分组M1的确认迟到了。A会受到重复的确认。对重复的确认的处理很简单收下后丢弃但什么也不做。B仍然会收到重复的M1并且同样要丢弃重复的M1并重传确认分组。
通常A最终总是可以收到对所有发出的分组的确认。如果A不断重传分组但总是收不到确认就说明通信线路太差不能进行通信。
使用上述的确认和重传机制就可以在不可靠的传输网络上实现可靠的通信。
像上述的这种可靠传输协议常称为自动重传请求ARQAutomatic Repeat reQuest。意思是重传的请求是自动进行的因此也可见自动请求重传这样的译名。接收方不需要请求发送方重传某个出错的分组。
4. 信道利用率
停止等待协议的优点是简单但缺点是信道利用率太低。下图说明了这个问题。简单起见假定在A和B之间有一条直通的信道来传送分组。 假定A发送分组需要的时间是TD。显然。TD等于分组长度除以数据率。再假定分组正确到达B后B处理分组的时间可以忽略不计同时立即发回确认。假定B发送确认分组需要时间TA。如果A处理确认分组的时间也可以忽略不计那么A在经过时间TDRTTTA后就可以再发送下一个分组这里的RTT是往返时间。因为仅仅是在时间TD内采用来传送有用的数据包括分组的首部因此信道的利用率U可用下式计算 注意更细致的计算还可以在上式分子的时间TD内扣除传送控制信息如首部所花费的时间。但在进行粗略计算时用近似的式就可以了。
上式中的往返时间RTT取决于所使用的信道。例如假定1200KM的信道往返时间RTT20ms分组长度是1200bit发送速率是1Mbit/s。若忽略处理时间和TATA一般远小于TD则可算出信道的利用率U 5.66%。但若把发送速率提高到10Mbit/s则U 5.96 * 。信道在绝大多数时间内都是空闲的。
上图可看出当往返时间RTT远大于分组发送时间TD时信道的利用率会非常低。还应注意上图并没有考虑出现差错后的重传分组。若出现重传则对传送有用的数据信息来说信道的利用率还要降低。
为了提高传输效率发送方可以不使用低效率的停止等待协议而是采用流水线传输下图所示。流水线传输就是发送方可连续发送多个分组不必每发完一个分组就停顿下来等待对方的确认。这样可使信道上一直有数据在不间断地传送。显然这种传输方式可以获得很高的信道利用率。 使用流水线传输时就要使用下面的连续ARQ协议和滑动窗口协议。 2. 连续ARQ协议
滑动窗口协议比较复杂是TCP协议的精髓所在。
下图a表示发送方维持的发送窗口它的意义是位于发送窗口内的5个分组都可连续发送出去而不需要等待对方的确认。这样信道利用率就提高了。
在讨论滑动窗口时应注意图中还有一个时间坐标以后往往省略这样的时间坐标。按习惯“向前”是指“向着时间增大的方向”而“向后”则是“向着时间减少的方向”。分组发送是按照分组序号从小到大发送的。 连续ARQ协议规定发送方每收到一个确认就把发送窗口向前滑动一个分组的位置。上图b表示发送方收到了对第1个分组的确认于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组那么现在就可以发送窗口内的第6个分组了。
接收方一般都是采用累计确认的方式。也就是说接收方不必对收到的分组逐个发送确认而是在收到几个分组后对按序到达的最后一个分组发送确认这就表示到这个分组为止的所有分组都已正确收到了。
累计确认有优点也有缺点。优点是容易实现即使确认丢失也不必重传缺点是不能向发送方及时反映接收方已经正确收到所有分组的信息。
例如如果发送方发送了前5个分组而中间的第3个分组丢失了。这是接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落而只好把后面的三个分组都再重传一次。这就叫作Go-back-N回退N表示需要再退回来重传已发送过的N个分组。可见当通信线路质量不好时连续ARQ协议会带来负面的影响。 五、TCP报文段的首部格式
TCP虽然是面向字节流的但TCP传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分而TCP的全部功能都体现在它首部中个字段的作用。
TCP报文段首部的前20个字节是固定的如下图所示后面有4n字节是根据需要而增加的选项。因此TPC首部的最小长度是20字节。
首部固定部分各字段的意义
1源端口和目的端口
各占2个字节分别写入源端口号和目的端口号。和前面图5-5所示的UDP的分用相似TCP的分用功能也是通过端口实现的。
2序号
占4个字节。序号范围是[0, - 1]共个序号。序号增加到-1后下一个序号就又回到0。也就是说序号使用mod运算。TCP是面向字节流的。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。例如一报文段的序号字段值是301最后一个字节的序号是400。显然下一个报文段如果有的话的数据序号应当从401开始即下一个报文段的序号字段值应为401。这个字段的名称也叫作“报文段序号”。 3确认号
占4字节是期望收到对方下一个报文段的第一个数据字节的序号。例如B正确收到了A发送过来的一个报文段其序号字段值是501而数据长度是200字节序号501~700这表明B正确收到了A发送的到序号700为止的数据。因此B期望收到A的下一个数据序号是701于是B在发送给A的确认报文段中把确认号置为701。注意现在的确认号不是501也不是700而是701。
总之记住 若确认号 N则表明到序号N - 1为止的所有数据都已正确收到。 由于序号字段有32位长可对4GB4千兆字节的数据进行编号。在一般情况下可保证当序号重复使用时旧序号的数据早已通过网络达到终点了。
4数据偏移
占4位它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段因此数据偏移字段是必要的。但注意“数据偏移”的单位是32位字即以4字节长的字为计算单位。由于4位二进制数能够表示的最大十进制数字是15因此数据偏移的最大值是60字节这也是TCP首部的最大长度即选项长度不能超过40字节。
5保留
占6位保留为今后使用但目前应置为0。
下面有6个控制位用来说明本报文段的性质它们的意义见下面6~11。
6紧急URGURGent
当URG 1时表明紧急指针字段有效。它告诉系统此报文段中有紧急数据应尽快传送相当于高优先级的数据而不要按原来的排队顺序传送。例如已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题需要取消该程序的运行。因此用户从键盘发出中断命令Control-C。如果不使用紧急数据那么这两个字符将存储在接收TCP缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样就浪费了许多时间。
当URG置1时发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报问段数据的最前面而在紧急数据后面的数据仍是普通数据。这是要与首部中紧急指针字段配合使用。
然而在紧急指针字段的具体实现上由于过去的有些文档有错误或有不太明确的地方这就导致人们对有关的RFC文档产生了不同的理解。于是2011年公布的建议标准RFC6093对紧急指针字段的使用方法做出了更加明确的解释并更新了几个重要的RFC文档如RFC793RFC1011RFC1122等。
7确认ACKACKnowledgment
仅当ACK1时确认号字段才有效。当ACK0时确认号无效。TCP规定在连接建立后所有传送的报文段必须把ACK置为1.
8推送PSHPuSH
当两个应用进程进行交互式的通信时有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下TCP就可以使用推送操作。这时发送方TCP把PSH置1并立即创建一个报文段发送出去。接收方TCP收到PSH1的报文段就尽快地即“推送”向前交付接收应用进程而不再等到整个缓存都填满了再向上交付。
虽然应用进程可以选择推送操作但推送操作很少使用。
9复位RSTReSeT
当RST1时表明TCP连接种出现严重差错如主机崩溃或其他原因必须释放连接然后再重新建立运输连接。将RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。
10同步SYNSYNchronization
在连接建立时用来同步序号。当SYN1而ACK0时表明这是一个连接请求报文段。对方若同意建立连接则应在响应的报文段中使SYN1和ACK1。因此SYN置为1就表示这是一个连接请求或连接接收报文。
11终止FINFINish
用来释放一个连接。当FIN1时表明此报文的发送方的数据已发送完毕并要求释放运输链接。
12窗口
占2字节。窗口值是[0 - 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口而不是自己的发送窗口。窗口值告诉对方从本报文段首部中的确认号算起接收方目前允许对方发送的数据量以字节为单位。之所以要有这个限制是因为接收方的数据缓存空间是有限的。总之窗口值作为接收方让发送方设置其发送窗口的依据。
例如发送一个报文段其确认号是701窗口字段是10000。这就是告诉对方“从701号算起我即发送此报文段的一方的接收缓存空间还可接收1000个字节数据字节序号是701~1700你在给我发送数据时必须考虑到我的接收缓存容量”。
总之应记住 窗口字段明确指出了现在允许对方发送的数据量。窗口值经常再动态地变化着。 13检验和
占2字节。检验和字段检验的范围包括首部和数据两部分。和UDP用户数据报一样在计算检验和时要在TCP报文段地前面加上12字节的伪首部。伪首部的格式与图5-5中UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6TCP的协议号是6把第5字段中的UDP长度改为TCP长度。接收方收到此报文段后仍要加上这个伪首部来计算检验和。若使用IPv6则相应的伪首部也要改变。
14紧急指针
占2字节。紧急指针仅在URG1时才有意义它指出本报文段中的紧急数据的字节数紧急数据结束后就是普通数据。因此紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时TCP就告诉应用程序恢复到正常操作。注意即使窗口为0时也可发送紧急数据。
15选项
长度可变最长可达40字节。当没有使用”选项“时TCP的首部长度是20字节。最后的填充字段仅仅是为了使整个TCP首部字段是4字节的整数倍。
TCP最初只规定了一种选项即最大报文段长度MSSMaximum Segment Size[RFC 6691]。注意MSS这个名词的含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度而是”TCP报文段长度减去TCP首部长度“。
为什么要规定一个最大报文段长度MSS呢这并不是考虑接收方的接收缓存可能放不下TCP报文段中的数据。实际上MSS与接收窗口值没有关系。TCP报文段的数据部分至少要加上40字节的首部TCP首部20字节和IP首部20字节这里都还没有考虑首部中的选项部分才能组装成一个IP数据报。若选择较小的MSS长度网络的利用率就降低了。设想在极端的情况下当TCP报文段只含有1字节的数据时在IP层传输的数据报的考校至少有40字节包括TCP报文段的首部和IP数据报的首部。这样对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来若TCP报文段非常长那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片装配成原来的TCP报文段。当传输出错时还要进行重传。这些也都会使开销增大。
因此从提高网络传输效率考虑MSS应尽可能大些只要在IP层传输时不需要再分片就行。由于IP数据报所经历的路径是动态变化的因此在某条路径上确定的不需要分片的MSS如果改走另一条路径就可能需要进行分片。因此最佳的MSS实际上是很难确定的。在连接建立的过程中双方都把自己能够支持的MSS写入这一字段以后就按照这个数值传送数据两个传送方向可以有不同的MSS值。若主机未填写这一项则MSS的默认值是536字节这个数值来自576字节的IP数据报总长度减去TCP和IP的固定首部。因此所有互联网上的主机都应能接收的报文段长度是53620固定首部长度556字节。
随着互联网的发展又陆续增加了几个选项如窗口扩大选项、时间戳选项等见建议标准RFC 7323。以后又增加了有关选择确认SACK选项RFC 2018。这些选项的位置都在图5-13所示的选项字段中。
窗口扩大选项是为了扩大窗口。TCP首部中窗口字段长度是16位因此最大的窗口大小为64KB.虽然这对早期的网络是足够用的但对于包含卫星信道的网络其传播时延和带宽都很大要获得高吞吐率需要更大的窗口大小。
窗口扩大选项占3字节其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到16 S。移位值允许使用的最大值是14相当于窗口最大值增大到 - 1 - 1。
窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一段实现了窗口扩大当它不需要再扩大其窗口值时可发送S 0的选项使窗口大小回到16。
时间戳选项占10字节其中最主要的字段是时间戳值字段4字节和时间戳回送回答字段4字节。时间戳选项有以下两个功能
第一用来计算往返时间RTT。发送方再发送报文段时把当前时钟的时间值放入时间戳字段接收方在确认该报文段时把时间戳字段值复制到时间戳送回答字段。因此发送方在收到确认报文后可以准确计算出RTT。
第二用于处理TCP序号超过的情况这又称为防止序号绕回PAWS。TCP报文段的序号只有32位而每增加个序号就会重复使用原来用过的序号。当使用高速网络时在一次TCP连接的数据传送中序号很可能会被重复使用。例如当使用1.5Mbit/s的速率发送报文段时序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段则不到14秒序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开可以在报文段加上这种时间戳。 六、TCP可靠传输的实现
为讲述可靠传输原理的方便假定数据传输只在一个方向进行即A发送数据B给出确认。这样的好处是使讨论限于两个窗口即发送方A的发送窗口和接收方B的接收窗口。如果再考虑B也向A发送数据那么还要增加A的接收窗口和B的发送窗口这样总共有4个都不断在变化大小的窗口。 1. 以字节为单位的滑动窗口 2. 超时重传时间的选择 3. 选择确认SAK 七、TCP的流量控制 1. 利用滑动窗口实现流量控制 2. TCP的传输效率 八、TCP的拥塞控制 1. 拥塞控制的一般原理 2. TCP的拥塞控制 3. 主动队列管理AQM 九、TCP的运输连接管理 1. TCP的连接建立 2. TCP的连接释放 3. TCP的优先状态机