根据《计算机网络(第七版)-谢希仁》原书摘录,个人见解。详细内容请支持原作!后附习题答案与典题分析-复习可用。手工码字。
本章概括运输层协议特点、进程之间的通信和端口等概念,然后讲UDP协议。其余讲较为复杂的(重要概念)**TCP协议**和可靠传输的工作原理,包括停止等待协议和ARQ协议。TCP三个重要问题:滑动窗口、流量控制和拥塞控制机制。最后,TCP连接管理。 本章最重要的概念: 运输层向它上面的应用层提供通信服务,它属于面向通信部份的最高层,同时也是用户功能的最底层。当网络的边缘部分中的两台主机使用网络核心部分功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用下三层的功能。
通过分析下图说明运输层功能
提示:LAN局域网;WAN广域网。
要LAN1上的主机A和LAN2上的主机B通过互连的WAN进行通信。通过前一章内容,可以知道IP协议就能够将源主机A发送的分组,按照首部目的地址,交送到B。那么运输层有什么功能呢?看图
注意比较IP协议和运输层协议的作用范围。
要知道,两台主机真正通信的实体是在主机中的进程,进程之间交换数据。从IP层讲,IP数据报首部仅仅明确标志两台主机的IP地址,因此分组可以交给目的主机,但是这个分组只停留在目的主机的网络层而没有交付给应用进程。
复用和分用
功能 | 概念 |
---|---|
复用 | 发送方不同的应用进程都可以使用同一个运输层协议传送数据(加适当首部) |
分用 | 接收方的运输层在剥去报文首部后能够把数据正确的交付目的应用程序 |
上图中逻辑通信指传送文件好像沿着双向箭头那样水平传送,但实际上是沿着虚线传送。
综上,网络层为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
这里再和大家理解一下逻辑通信:
从应用层来讲,应用层报文交给下面的运输层,运输层就把报文交给对方的运输层。看上去就好像运输层与运输层是直接水平相传送的,但实际上经过了多个下三层,而下层往往为上层提供服务,相对忽视掉了,实际上是要经过的。
运输层向高层用户屏蔽下面网络核心的细节(如网络拓扑、路由选择协议等),在进程眼中就好像一条端到端的逻辑通信通道。
运输层还有网络层无法替代的其他功能,如差错检测。网络层,IP数据报首部中的检验和字段,只检验首部而不检验数据。
根据应用程序不同需求,运输层需要两种不同的运输协议,面向连接的TCP和无连接的UDP。
运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信通道就相当于一条全双工的可靠信道。当采用UDP协议时,这种逻辑信道仍然是一条不可靠信道。
TCP/IP运输层的两个协议都是互联网的正式标准。
(1)用户数据报协议UDP(2)传输控制协议TCP
TPDU运输协议数据单元:两个对等运输实体在通信时传送的数据单位。
在TCP/IP协议中,根据协议分别叫TCP报文段或UDP用户数据报。
UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后,不需要给出任何确定。不提供可靠交付但是一种有效的工作方式。
TCP提供面向连接的服务。传送数据前必须先建立连接,数据传送结束后释放连接。不提供广播或多播服务。因为要提供可靠面向连接的运输服务,不可避免地增加许多开销。不仅使首部增多,还占用许多处理机资源。
※书上类比复用分用例子:一个机构包括很多部门,所有的部门向外发文件时都由收发室负责寄出,这相当于各部门都**“复用”这个收发室。当收发室收到外面寄来的文件时,则用“分用”**功能,根据信上的地址正确交付给各个部门。
各部门就相当于应用层各个进程,收发室就是运输层,外面就是IP网络层。
运输层使用协议端口号即端口(port)。
虽然通信的终点是应用进程,但只要把所传送的报文交到目的主机某个合适的端口,剩下的工作(即最后交付目的进程)就由TCP或UDP来完成。
为什么要采用上述方式呢?单个计算机中的进程可以用进程标识符来表示(一个不大的整数)。但是在互联网环境下,计算机各种各样,使用各种操作系统,不同操作系统使用的进程标识符也不同。为了不同操作系统的计算机能够相互通信,就必须用统一的方法。
**注意:**这种在协议栈层间抽象的协议端口是软件端口,和路由器或交换机上的硬件接口是不同的。软件端口是应用层的各种协议进程与运输层实体进行层间交互的一种地址。不同系统实现不同端口的方法可以是不同的。
TCP/IP的运输层用一个16位端口号来标志一个端口。但是,端口号只具有本地意义,只是为了标志本计算机应用层中各个进程在和运输层交互时的层间接口。在不同计算机中,相同的端口号是没有关联的。16位的端口号可允许65535个不同的端口号。
因此,两台计算机要相互通信必须知道对方IP地址和端口号。
运输层端口号或系统端口号,数值为0~1023。可以在www.iana.org中查到。
常用的熟知端口号:(能记住最好)
UDP只是在IP的数据报服务上增加了复用、分用和差错检测的功能。
UDP主要特点:
特点 | 概念 |
---|---|
UDP是无连接的 | 发送数据之间不需要建立连接 |
UDP使用尽最大努力交付 | 不保证可靠交付,因此主机不需要维持复杂的连接状态表 |
UDP是面向报文的 | 对于应用程交付的报文不拆分也不合并,具体看下图 |
UDP没有拥塞控制 | 网络的拥塞不会使源主机的发送速率降低,对实时应用很重要。允许网络拥塞时丢失一些数据的应用 |
UDP支持 | 一对一、一对多、多对一和多对多的交互通信 |
UDP首部开销小 | 只有八个字节,TCP要20个字节 |
用户数据报UDP有两个字段:数据字段和首部字段。首部字段只有8个字节。
字段 | 意义 |
---|---|
源端口 | 源端口号。在需要对方回信时选用。不需要时可全用0 |
目的端口 | 目的端口号。这在终点交付报文时必须使用 |
长度 | UDP用户数据报长度,最小值为8(只有首部) |
检验和 | 检测UDP用户数据报在传输中是否有错。有错就丢弃 |
运输层从IP层收到UDP数据报十五,根据首部中的目的端口,把数据报通过相应的端口,上交终点。
如果收到的目的端口号不正确,不存在相应应用进程,就丢弃该报文,并且由网络控制报文协议ICMP发送“端口不可达”的差错报文给发送方。那么可以故意发错目的端口达到检测的目的。
在计算检验和时,要在UDP用户数据报之前增加12字节的伪首部。伪首部不是真正的首部,是在计算检验和时临时添加在UDP用户数据报前面的。
UDP计算检验和的方法和计算IP数据报首部检验和的方法相似。不同的是:IP数据报的检验和只检验IP数据报的首部,但UDP检验和把首部和数据部分一起都检验。
由上图所示,伪首部的第3字段是全零;第4字段是IP首部中的协议字段的值。对于UDP,此协议字段值为17;第5字段是UDP用户数据报的长度。因此,这样的检验和既检查了UDP用户数据报的源端口号和目的端口号以及UDP用户数据报的数据部分,又检查了Ip数据报的源IP地址和目的地址。
TCP是TCP/IP协议中非常复杂的一个协议。
TCP主要特点:
特点 | 简述 |
---|---|
面向连接的运输层协议 | 应用程序在使用TCP协议之前必须先建立连接 |
每条连接只能有两个端点 | 每条TCP连接正能是点对点,即一对一 |
提供可靠交付服务 | 通过TCP连接传送的数据,无差错、不丢失、不重复,按序到达 |
提供双全工通信 | 允许双方应用进程在任何时候都能发送数据,在两端都设有发送和接收缓存,应用程序将数据交付给缓存即可。再由TCP适时发送或应用适时接收 |
面向字节流 | TCP把应用程序交下来的数据仅仅看成一连串的无结构的字节流 |
面向字节流具体表述:
TCP中的**“流”指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据仅仅看成一连串的无结构的字节流**。TCP并不知道所传送字节流的含义。
从上图中分析:发送方发送的数据块数量与接收方接收的数据块数量是不同的。但是双方发送和接收字节流必须相同。
TCP的连接是逻辑链接。
TCP 和UDP在发送报文时所采用的方式完全不同。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)。如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。关于TCP报文段的长度问题,在后面还要进行讨论。
TCP把连接作为最基本的抽象。
**TCP连接的两个端点叫做套接字或插口,端口号拼接到IP地址即套接字。**套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。
例如,IP地址为192.3.4.5,端口号为80
那么套接字就是(192.3.4.5:80)。
再次强调:TCP连接的端点是很抽象的套接字!
下面了解:
TCP发送的报文段是交给IP层传送的。但IP层只能提供尽最大努力服务,也就是不可靠服务。因此,TCP必须采取一定的措施才能使这两层之间通信变得可靠。
理想传输条件的两个特点:
(1)传输信道不产生差错。
(2)不管发送方以多快的速度发送数据,接收方总是来得及处理。
理想条件下,必然是可靠传输。
当然就只是理想状态;下面解决
“停止等待协议”就是每发送完一个分组就停止发送,等待对方确定。在收到确定后再发送下一组。
上图中图b为有差错情况。
每次发送一个分组时设置一个超时计时器。
超过时长未收到确定信息就重新发送。
如果,接收方反馈的确定信息丢失,导致发送方无法确定自己发送数据出错还是反馈出错。超时后发送方重新发送。
假设接收方又收到了重传的分组,那么:
(1)丢弃这个重复分组,不向上层交付
(2)向发送方发送确认。
使用这个机制我们就可以在不可靠的传输网络上实现可靠的通信。
自动重传请求ARQ。自动重传
>>1.6.1 性能指标
某信道有百分之几的时间是被利用的(有数据通过)
停止等待协议很简单,但是信道利用率太低。
假定A和B之间有一条直通的信道:
TD分组发送时间。同时忽略B处理时间。
上式是粗略计算。
发送速率越高,那么信道就越空闲。
为了提高效率,使用流水线传输,可以连续发送多个分组。
当使用流水线传输时,就要用到下面的连续ARQ协议和滑动窗口协议。
位于发送窗口的5个分组都可以连续发送出去,而不需要等待对方确认。这样可以提高信道利用率。
每收到一个确认信号就往前滑动一个分组位置。接收方一般采用累计确认方式:接收方不必对收到的分组逐个发送确认,而是收到几个分组后,对按序到达的最后一个分组发送确认,表示全部收到。
累计确认优缺点:
优点:容易实现,即使确认丢失也不用重传。缺点是不能向发送方反映出接收方已经收到的所有分组信息。
例如:如果发送了5个分组,而中间的第三个分组丢失,接收方只能收到前两组的确认,其它三组都要重发。Go-back-N(回退N),需要重传已经发送的N个分组。
深入讨论TCP可靠传输问题之前,必须先了解TCP报文段首部格式。
TCP虽然是面对字节流的,但TCP传送的数据单元却是报文段。报文段分为首部和数据两部分,而TCP全部功能体现在首部中各字段的作用。
TCP报文段首部前20个字节是固定的,后面4n字节是根据需要增加的选项。因此,TCP首部最小长度为20字节。
字段 | 大小 | 功能 |
---|---|---|
源端口和目的端口 | 各占2字节 | 源端口号和目的端口号 |
序号 | 4字节 | 序号使用mod223运算,每一个字节都编号,首部序号是本报文段所发送数据的第一个字节的序号,所以也叫报文段序号 |
确认号 | 4字节 | 期望收到对方下一报文段的第一个数据字节的序号。同时,反馈确认号之前的数据都正确收到 |
数据偏移 | 4位 | TCP报文段首部长度,因为选项字段是不确定的,限制了首部最大60字节 |
保留 | 6位 | 保留为之后使用,下面有六个控制位,说明报文段性质,后面表格介绍 |
窗口 | 2字节 | 窗口值是接收方让发送方设置其发送窗口的依据。从确认号开始,接收方目前允许对方发送的数据量(字节) |
检验和 | 2字节 | 计算时加伪首部,类似UDP,第四部分17改为6(协议号) |
紧急指针 | 2字节 | URG=1时有效(下方表格),指出紧急数据字节数。指针指出紧急数据末尾在报文段的位置。窗口为0也能发送 |
选项 | 最长40字节 | 可以为0字节。MSS是TCP报文段数据字段最大长度;默认536字节,因此所有在互联网上的主机都能接受报文段长度536+20=556字节。后文加扩展 |
保留下面的控制位及其功能:
控制位 | 功能 |
---|---|
紧急URG | =1时,表示紧急指针字段有效。此报文段不用按原来排队顺序传送,把紧急数据插入到本报文段数据最前面。要与紧急指针搭配使用 |
确认ACK | =1时,确认号字段生效。在建立连接后所有传送的报文必须置1 |
推送PSH | 发送方将PSH置1,并立即创建一个报文段发送,接收方收到后尽快交付接受应用进程 |
复位RST | =1时,表示TCP连接中出现严重差错,必须释放连接,重新连接。还用来拒绝一个非法报文或拒绝打开一个连接。重置位或重建位 |
同步SYN | 在建立连接时用来同步序号。当SYN=1而ACK=0时,表明连接请求。同意链接ACK=1。SYN=1表示这是一个连接请求或链接接收报文。 |
终止FIN | 释放一个连接。=1时,表明数据发送完毕,并要求释放连接 |
选项扩展:
随着互联网发展,陆续增加了几个选项。
窗口扩大选项:
时间戳选项:
TCP滑动窗口是以字节为单位的
根据对方的窗口字段值,来设定发送窗口
假定A给B发送数据
A根据B窗口字段值,设定发送窗口
发送缓存
接收缓存
TCP每发送一个报文段就要设置一个计时器,如果到了计时器设定的重传时间还没有收到确认信息,就重新发送报文段。
重传时间设定过长或过短都会造成一定问题:空闲时间过长降低传输率或使网络负荷增大。TCP采用了一种自适应算法。
加权平均往返时间的计算