转载自https://xiaoxueying.gitbooks.io/computer-networks-5th-/content/chuan_shu_ceng.html
本章重点:
(1)运输层为相互通信的应用进程提供逻辑通信
(2)端口和套接字的意义
(3)无连接的UDP的特点
(4)面向连接的TCP的特点
(5)在不可靠的网络上实现可靠传输的工作原理,停止等待协议和ARQ协议。
(6)TCP的滑动窗口、流量控制、拥塞控制、连接管理
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层。当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时,只有主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下三层的功能。
运输层和网络层的区别:
网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。
1.用户数据报协议UDP:UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP报文后不需要给出任何确认。
2.传输控制协议TCP:TCP提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
运输层的端口号分为下面两大类:
1. 服务器使用的端口号
熟知端口号或系统端口号,数值为0~1023,下面为一些常用的熟知端口号:
2.客户端使用的端口号
数值为49152~65535,由于这类端口号仅在客户进程运行时才动态选择,因此又叫做短暂端口号。
UDP只在IP的数据报服务之上增加了很少的一点功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点:
1.UDP是无连接的。
2.UDP使用尽最大的努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。
3.UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下面交付给IP层。UDP对应用层交下来的报文既不合并也不拆分,而是保留这些报文的边界。
4.UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。
5.UDP支持一对一、一对多、多对一和多对多的交互通信
6.UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
用户数据报UDP有两个字段:数据字段和首部字段。首部字段只有8个字节由四个字段组成,每个字段的长度都是两个字节。各字段意义如下:
1.源端口 源端口号。在需要对方回信时选用。不需要时全用0.
2.目的端口 目的端口号。这在终点交付报文时必须要使用到。
3.长度 UDP用户数据报的长度,其最小值是8.
4.检验和 检测UDP用户数据报在传输中是否有错。有错就丢弃。
如果接收方UDP发现报文中的目的端口不正确,就丢弃报文,并由网际控制报文协议ICMP发送端口不可达
差错报文给发送方。
UDP的差错检测 P195
TCP最主要的特点:
1.TCP是面向连接的运输层协议。也就是说应用程序在使用TCP协议之前,必须先建立TC连接。在传送数据完毕后必须释放已经建立的TCP连接。
2.每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
3.TCP提供可靠交付的服务,也就是说通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达。
4.TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接受缓存用来临时存放双向通信的数据。
5.面向字节流。TCP中的“流”指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块,但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。
每一条TCP连接有两个端点。TCP连接的端点叫套接字(socket)或插口。根据RFC 793的定义:端口号拼接到IP地址即构成了套接字。因此套接字的表示方法是在点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。例如:
若IP地址是192.3.4.5而端口号是80。那么所得到的套接字就是(192.3.4.5:80)
套接字socket = (IP地址:端口号)
每一条TCP连接唯一滴被通信两端的两个套接字所确定。
TCP连接 ::= {socket1, socket2} = {(IP1:port1),(IP2:port2)}
理想的传输条件有以下两个特点:
(1):传输信道不产生差错。
(2):不管发送方以多快的速度发送数据,接收方总是来得及接收。
每发送完一个分组就停止发送,等待对方确认。收到确认后再发送下一个分组。
1.无差错情况和有差错情况
出现差错时应注意以下三点:
1.A在发送完一个分组后,必须暂时保留已发送的分组副本(为发生超时重传时使用)。只有在收到相应的确认后才能清除暂时保留的分组副本。
2.分组和确认分组都必须进行编号。这样才能明确是哪一个发送出去的分组收到了确认,而哪一个分组还没有收到确认。
3.超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。
2. 确认丢失和确认迟到的情况:
图a中假定B又收到了重传分组M1,这时应采取两个行动:
1.丢弃这个重复的分组M1,不向上层交付。
2.向A发送确认,不能认为已经发送过确认就不再发送,因为之所以重传M2就表示A没有收到对M2的确认。
图b在传输过程中没有出现差错,但B对分组M1的确认迟到了。A会收到重复的确认对重复的确认处理:收下后就丢弃,B仍然收到重复的M1,并且同样要丢弃重复的M1,并重传确认分组。
像上面的这种可靠传输协议称为自动重传请求ARQ。意思是重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。下图b表示发送方收到了对第1个分组的确认,于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,那么现在就可以发送窗口内的第6个分组了。
接收方一般都是采用累积确认的方式。这就是说接收方不必对收到的分组逐个发送确认,而是可以在收到几个分组后对按序到达的最后一个分组发送确认,这样就表示:到这个分组为止的所有分组都已正确收到了。
累积确认优点:容易实现,即使确认丢失也不必重传。
累积确认缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息。
TCP报文段首部前20个字节是固定的,TCP首部最小长度是20字节
1.源端口和目的端口
各占2个字节,分别写入源端口号和目的端口号。
2.序号
占4字节。在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部中的序号字段值则是指的是本报文段所发送的数据的第一个字节的序号。
3.确认号
占4字节,是期望收到对方下一个报文段的第一个数据字节的序号。
记住:
若确认号 = N,则表明:到序号N-1的所有数据都已正确收到。
4.数据偏移 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。
5.保留
占6位,保留为今后使用,但目前应置为0。
6.紧急URG
当URG=1时,表明紧急指针字段有效。他告诉系统此报文段中有紧急数据,应当尽快传送(相当于高优先级的数据),而不是按原来的排队顺序来传送。
7.确认ACK(ACKnowlegment)
仅当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。TCP规定在连接建立后所有传送的报文段都必须把ACK置1。
8.推送PSH(PuSH)
当两个应用进程进行交互的通信时,有时在一端的应用进程希望在键入一个命令后立即就能够收到对方的响应。在这种情况下,TCP就可以使用推送操作。这时发送方TCP把PSH置1,并立即创建一个报文段发送出去。接收方TCP收到PSH=1的报文段就尽快地交付给接收应用的进程而不再等到整个缓存都填满了后再向上交付。
9.复位RST(ReSeT)
当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。RST置1还用来拒绝一个非法的报文段或拒绝打开一个连接。RST也可称为重建位或重置位。
10.同步SYN(SYNchronization)
在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意连接,则应在响应的报文段中使SYN=1和ACK=1。因此SYN置为1就表示这是一个连接请求或连接接受报文。
11.终止FIN
用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
12.窗口
占2个字节。指的是发送本报文段的一方的接收窗口。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量。窗口值作为接收方让发送方设置其发送窗口的依据。(例如,设确认号是701,窗口字段是1000。这就表明从701号算起,发送此报文段的一方还有接收1000个字节数据的接收缓存空间)。
13.检验和
占2字节,检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
14.紧急指针
占2字节。紧急指针仅在URG=1时才有意义,他指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。
15.选项
长度可变,最长可达40字节。当没有使用选项时,TCP的首部长度是20字节。
TCP的滑动窗口是以字节为单位的。 现假定A收到了B发来的确认报文段,其中窗口是20(字节)而确认号是31.根据这两个数据,A就构造出自己的发送窗口,位置如图:
假定A发送了序号为31~41的数据。这时发送窗口位置并未改变,但发送窗口内靠后面有11个字节(灰色小方框表示)表示已发送但未收到确认。而发送窗口内靠前面的9个字节(42~50)是允许发送但尚未发送的。
TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。如果把超时重传时间设置得太短就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大降低了传输效率。
方法: 报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为2倍的旧重传时间。当不再发生报文段的重传时再重新计算超时重传时间。
RTTD 是 RTT 的偏差加权平均值
课后5-33 5-34题
选择确认(Selective ACK)的工作原理:TCP的接收方在接受对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块,如下图。序号1~1000收到了但序号1001~1500没有收到。接下来的字节流又收到了可是又缺少3001~3500。也就是说接收方收到了和前面的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口之内那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方使发送方不要再重复发送这些已收到的数据
TCP的首部没有哪个字段能够提供上述这些字节的边界信息。如果要使用选择确认,那么在建立TCP连接时就要在TCP首部的选项中加上“允许SACK”的选项,而双方都必须事先商定好。
如果发送方把数据发送的过快,接收方就可能来不及接收这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
设A向B发送数据。在建立连接时,B告诉A:“我的接收窗口rwnd=400”。因此发送方的发送窗口不能超过接收方给出的接收窗口的数值。再设每一个报文段为100字节长,而数据报文段序号的初始值设为1。(大写ACK表示首部中的确认位ACK,小写ack表示确认字段的值)
在计算机网络中的链路容量即带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫拥塞。若网络中有许多资源同时呈现供应不足,网络的性能就要明显变坏,整个网络的吞吐量将随输入负荷的增大而下降。
∑对资源的需求 > 可用资源
拥塞控制与流量控制的关系密切,它们之间也存在着一些差别,所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,相反流量控制往往指点对点通信量的控制,是端到端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
P216
1. 慢开始(slow-start)
2. 拥塞避免(congestion avoidance)
3. 快重传(fast retransmit)
4. 快恢复(fast recovery)
慢开始算法
刚刚开始设置拥塞窗口 cwnd = 1
每收到一个确认后,将拥塞窗口增加到2
每经过一个传输轮次,拥塞窗口cwnd 就加倍。
慢开始门限 ssthresh,初始值设置为 16 个报文段
拥塞避免算法
让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
只要发送方判断网络出现拥塞
就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半
把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。
快重传算法
要求接收方每收到一个失序的报文段后就立即发出重复确认。
发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段。
快恢复算法
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法。
拥塞窗口设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法
rwnd接收窗口
发送窗口的上限值 = Min [rwnd, cwnd]
运输连接有三个阶段,即:连接建立、数据传送和连接释放。
在TCP连接建立过程中要解决以下三个问题:
1.要使每一方能够确知对方的存在
2.要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等)
3.能够对运输实体资源(如缓存大小、、连接表中的项目等)进行分配
TCP连接的建立采用客户服务器方式。主动发起连接建立的应用进程就做客户,而被动等待连接建立的应用进程叫做服务器。
A主动打开连接,而B被动打开连接
四次握手
图中每一个方框即TCP可能具有的状态。每个方框中的大写英文字符串是TCP标准做使用的TCP连接状态名。状态之间的箭头表示可能发生的状态变迁。箭头傍边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。图中粗实线箭头表示对客户进程的正常变迁。粗虚箭头表示对服务器进程的正常变迁。另一种细箭头表示异常变迁。