• 计算机网络运输层


    目录

    5.1 传输层概述

    5.1.1 传输层的功能

    5.1.2 传输层端口

    5.1.3 面向连接与无连接服务

    5.2 UDP协议

    5.2.1 UDP概述

    5.2.2 UDP数据报

    5.2.3 UDP校验

    5.3 TCP协议

    5.3.1 TCP协议概述

    5.3.2 TCP报文段

    5.3.3 TCP连接管理

    5.3.4 TCP流量控制

    5.3.5 TCP拥塞控制

    5.3.6 TCP可靠传输


    掌握UDP及TCP (如首部格式、可靠传输、流量控制、拥塞控制、连接管理等),其中,TCP报文分析、流量控制与拥塞控制机制重点掌握。

    5.1 传输层概述

    5.1.1 传输层的功能

    1)传输层提供应用进程之间的逻辑通信(即端到端的通信)。对网络层来说通信的双方是两台主机,提供的是主机之间的逻辑通信。

    【注】:“主机之间的通信”实际上是主机中的应用进程间的通信,这里“逻辑通信”是传输层之间的通信好像是沿水平方向传送数据,但事实上这两个传输层之间并没有一条水平方向的物理连接。

    2)复用和分用。复用指发送方不同的应用进程都可使用同一个传输层协议传送数据;分用指接收方的传输层在剥去报文的首部后能够把这些数据正确交付到目的应用进程。

    3)对收到的报文的首部和数据部分进行差错检测。网络层只检查IP 数据报的首部,不检验数据部分是否出错。

    4)提供面向连接的TCP和无连接的UDP的传输协议。网络层要么只提供面向连接的服务,如虚电路;要么只提供无连接服务,如数据报,不可能在网络层同时存在这两种方式。

    5.1.2 传输层端口

    ·端口

    端口能让应用层的各种应用进程将其数据通过端口向下交付给传输层,以及让传输层知道应当将其报文段中的数据向上通过端口交付给应用层相应的进程。端口在传输层的作用类似于IP地址在网络层、或MAC地址在数据链路层的作用,只不过IP地址和MAC地址标识的是主机,而端口标识的是主机中的应用进程。

    ·端口号

    应用进程通过端口号进行标识,长度为16bit, 能表示65536 个不同的端口号。端口号只具有本地意义,只标识本计算机应用层中的各进程,在因特网中不同计算机的相同端口号是没有联系的。

    ·端口号的分类

    1)熟知端口号 0~1023, IANA把这些端口号指派给了TCP/IP体系中最重要的一些应用协议

    【应用层常用协议所使用的运输层熟知端口号】:

    2)登记端口号 1024~49151为没有熟知端口号的应用程序使用。使用这类端口号必须在IANA按照规定的手续登记,以防止重复

    3)短暂端口号 49152~65535, 留给客户进程选择暂时使用。当服务器进程收到客户进程的报文时,就知道了客户进程所使用的动态端口号。通信结束后,这个端口号可供其他客户进程以后使用

    ·套接字Socket

    在网络中通过IP地址来标识和区别不同的主机,通过端口号来标识和区分一台主机中的不同应用进程,端口号拼接到IP地址即构成套接字Socket。套接字实际上是一个通信端点,Socket= (IP 地址:端口号),它唯一地标识网络中的一台主机和其上的一个应用进程。

    5.1.3 面向连接与无连接服务

    ·面向连接服务就是在通信双方进行通信之前,必须先建立连接,在通信过程中,整个连接的情况一直被实时地监控和管理。通信结束后,释放这个连接。

    TCP提供面向连接的服务,不提供广播或组播服务。由于TCP提供面向连接的可靠传输服务,因此不可避免地增加了许多开销,如确认、流量控制、计时器及连接管理等。这不仅使协议数据单元的头部增大很多,还要占用许多的处理机资源。因此TCP主要适用于可靠性更重要的场合,如文件传输协议(FTP)、超文本传输协议(HTTP)、 远程登录(TELNET) 等。

    ·无连接服务是指两个实体之间的通信不需要先建立好连接,需要通信时,直接将信息发送到网络中,让该信息的传递在网上尽力而为地往目的地传送。

    UDP是一个无连接的非可靠传输层协议。在传送数据之前不需要先建立连接,远程主机的传输层收到UDP报文后,不需要给出任何确认。它在IP之上仅提供两个附加服务行多路复用和对数据的错误检查。由于UDP比较简单,因此执行速度比较快、实时性好,使用UDP的应用主要包括小文件传送协议(TFTP)、 DNS、SNMP和实时传输协议(RTP)。

    5.2 UDP协议

    5.2.1 UDP概述

    UDP仅在IP的数据报服务之上增加了复用和分用以及差错检测两个基本服务,且不提供可靠服务。而TCP提供可靠的服务,为什么应用仍用UDP

    1)UDP无须建立连接。不会引入建立连接的时延。

    2)无连接状态。UDP不维护连接状态,也不跟踪这些参数。因此某些专用应用服务器使用UDP时,一般都能支持更多的活动客户机。

    3)分组首部开销小。UDP仅有8B的开销,TCP有20B的首部开销。

    4)应用层能更好地控制要发送的数据和发送时间。UDP没有拥塞控制,因此网络中的拥塞不会影响主机的发送效率。某些实时应用要求以稳定的速度发送,能容忍一些数据的丢失,但不允许有较大的时延,而UDP正好满足这些应用的需求。

    5) UDP支持一对一、一对多、多对一和多对多的交互通信。

    5.2.2 UDP数据报

    UDP数据报包含UDP首部和用户数据两部分。UDP首部有8B,由4个长2B的字段组成

    1)源端口 源端口号在需要对方回信时选用,不需要时可用全0。

    2)目的端口 目的端口号这在终点交付报文时必须使用到。

    3)长度 UDP数据报的长度(首部+数据),仅有首部是有最小值是8 。

    4)校验和 检测UDP数据报在传输中是否有错,有错就丢弃。可选字段,当源主机不想计算校验和时,则直接令该字段为全0

    5.2.3 UDP校验

    计算校验和时,要在UDP数据报之前临时增加12B的伪首部,得到一个临时的UDP数据报。伪首部并不是UDP的真正首部。校验和就按照这个临时的UDP数据报来计算。伪首部既不向下传送又不向上递交,而只是为了计算校验和。

    UDP校验和的计算方法和IP数据报首部校验和的计算方法相似。但IP数据报的校验和只检验IP数据报的首部,但UDP的校验和则检查首部和数据部分。

    5.3 TCP协议

    5.3.1 TCP协议概述

    TCP是在不可靠的IP层之上实现的面向连接提供可靠交付服务的传输层协议,它主要解决传输的可靠、有序、无丢失和不重复问题。主要特点有:

    1)TCP连接是一条逻辑连接,每条TCP连接只能有两个端点,每条TCP连接只能是端到端的(进程对进程)。

    2) TCP提供全双工通信,允许通信双方的应用进程在任何时候都能发送数据,为此TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。

    发送缓存用来暂时存放以下数据:

    ①发送应用程序传送给发送方TCP准备发送的数据;②TCP已发送但尚未收到确认的数据。

    接收缓存用来暂时存放以下数据:

    ①按序到达但尚未被接收应用程序读取的数据:②不按序到达的数据。

    3) TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据仅视为一连串的无结构的字节流。

    5.3.2 TCP报文段

    TCP传送的数据单元称为报文段。TCP报文段既可以用来运载数据,又可以用来建立连接,释放连接和应答。一个TCP报文段分为首部和数据两部分,整个TCP报文段作为IP数据报的数据部分封装在IP数据报中。首部的前20B是固定的,最短为20B, 后面有4N字节是根据需要而增加的选项,长度为4B的整数倍。

    5.3.3 TCP连接管理

    每个TCP连接都有三个阶段:连接建立、数据传送和连接释放。TCP 连接管理就是使运输连接的建立和释放都能正常进行。

    【注】:TCP连接的端点不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。TCP连接的端口为套接字Socket或插口,每条TCP连接唯一地被通信的两个端点(套接字)确定。

    ·TCP连接的建立—三次握手

    TCP连接建立的过程中,要解决三个问题:

    1)使每一方能够确知对方的存在。

    2)允许双方协商一些参数(最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。

    3)能够对运输实体资源(缓存大小、连接表中的项目等)进行分配。

     【问】:是否能采用两次握手?

    答:不能,这样已失效的连接请求报文若传送到TCP服务器,进而导致错误造成资源浪费

    ·TCP连接的释放—四次握手

    【问】:客户进程发送完最后一个确认报文段为什么不直接进入关闭状态,而进入时间等待?

    答:经过时间等待2MLS后,可以确保TCP服务器进程可以收到最后一个TCP确认报文段而进入关闭状态。另外经过2MLS后还可以使本次连接持续时间内所产生的所有报文段都从网络消失,这样下一个新的TCP连接中不会出现旧连接中的报文段

     【注】:对于有关TCP连接与释放,只要出现ACK SYN FIN,其值一定为1

    5.3.4 TCP流量控制

    TCP提供流量控制服务来消除发送方发送速率太快使接收方缓存区溢出的可能性,因此可以说流量控制是一个速度匹配服务。

    TCP提供一种基于滑动窗口协议的流量控制机制,在通信过程中,接收方根据自己接收缓存的大小,动态地调整发送方的发送窗口大小,这称为接收窗口rwnd,即调整TCP报文段首部中的窗口字段值,来限制发送方向网络注入报文的速率。同时,发送方根据其对当前网络拥塞程度的估计而确定的窗口值,这称为拥塞窗口cwnd,大小与网络的带宽和时延相关。

    发送窗口的上限值=min[rwnd,cwnd]

    【传输层与数据链路层的流量控制】:

    传输层定义端到端用户之间的流量控制,数据链路层定义两个中间的相邻结点的流量控制;数据链路层的滑动窗口协议的窗口大小不能动态变化,传输层的可以动态变化。

    5.3.5 TCP拥塞控制

    拥塞控制是指防止过多的数据注入网络,保证网络中的路由器或链路不致过载。出现拥塞时,

    端点并不了解拥塞发生的细节,对通信连接的端点来说,拥塞往往表现为通信时延的增加。

    发送方是如何维护拥塞窗口,有以下四种算法:

    ·慢开始与拥塞避免

    拥塞窗口的维护原则:只要网络没有出现拥塞,拥塞窗口就再增大一些;但只要网络出现拥塞,拥塞窗口就减少一些。

    判断出现网络拥塞的依据:没有按时收到应当到达的确认报文(即发生超时重传)。

    发送方将拥塞窗口作为发送窗口:swnd = cwnd.

    1)慢开始

    在TCP刚刚连接好并开始发送TCP报文段时,先令拥塞窗口cwnd= 1,即一个最大报文段长度MSS。每收到一个对新报文段的确认后,将cwnd加1,即增大一个MSS。

    例如,A向B发送数据,发送方先置拥塞窗口cwnd=1, A发送第一个报文段,A收到B对第一个报文段的确认后,把cwnd从1增大到2;于是A接着发送两个报文段,A收到B对这两个报文段的确认后,把cwnd从2增大到4,下次就可一次发送4个报文段。

    2)拥塞避免

    让拥塞窗口cwnd缓慢增大,每经过一个往返时延RTT就把发送方的拥塞窗口cwnd加1,而不是加倍,使拥塞窗口cwnd按线性规律缓慢增长(加法增大),这比慢开始的拥塞窗口增长速率缓慢得多。

    根据cwnd的大小执行不同的算法:

    ●当cwnd < ssthresh时,使用慢开始算法。

    ●当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法。

    ●当cwnd=ssthresh时,既可使用慢开始算法,又可使用拥塞避免算法

    无论在哪种阶段,只要发送方判断网络出现拥塞(未按时收到确认),就把慢开始门限ssthresh设置为出现拥塞时的发送方的cwnd值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。目的是迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完

    【注】慢增长阶段cwnd不能越过ssthresh值

    ·快重传与快恢复

    1)快重传

    快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。当发送方连续收到三个重复的ACK报文时,直接重传对方尚未收到的报文段,而不必等待那个报文段设置的重传计时器超时。对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞,进而降低拥塞窗口cwnd为1。

     2)快恢复

    当发送方连续收到三个冗余ACK (重复确认)时,把慢开始门限ssthresh设置为此时发送方cwnd的一半。这是为了预防网络发生拥塞。

    但发送方现在认为网络很可能没有发生(严重)拥塞,否则就不会有几个报文段连续到达接收方,也不会连续收到重复确认。所以与慢开始不同之处是它把cwnd值设置为慢开始门限ssthresh 改变后的数值,而不是设置为1起始的慢开始过程然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

    【总结】:慢开始、拥塞避免、快重传和快恢复几种算法是同时应用在拥塞控制机制中。在TCP连接建立和网络出现超时时,采用慢开始和拥塞避免算法;当发送方接收到冗余ACK时,采用快重传和快恢复算法。

    【拥塞控制与流量控制的区别】:

    拥塞控制是让网络能够承受现有的网络负荷,是全局性的过程,涉及所有的主机、路由器,以及与降低网络传输性能有关的所有因素,由发送方自己通过检测网络状况来决定;相反,流量控制往往是指点对点的通信量的控制,是端到端的问题(接收端控制发送端),它所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收,发送方发送数据的量由接收方决定。

    当然,拥塞控制和流量控制它们都通过控制发送方发送数据的速率来达到控制效果

    5.3.6 TCP可靠传输

    TCP是在IP层不可靠的、尽力而为服务的基础上建立一种可靠数据传输服务,保证接收方进程从缓存区读出的字节流与发送方发出的字节流完全一样。TCP使用校验、序号、确认和重传等机制来达到目的(校验机制与UDP校验一样)

    ·序号

    TCP首部的序号字段用来保证数据能有序提交给应用层, TCP把数据视为一个无结构但有序

    的字节流,序号建立在传送的字节流之上,而不建立在报文段之上

    ·确认

    确认机制:TCP首部的确认号期望收到对方的下一个报文段的数据的第一个字的序号。如上图若接收方B已收到第一个报文段, 此时B希望收到的下一个报文段的数据是从第3个字节开始的,那么B发送给A的报文中的确认号字段应为3。

    发送方缓存区会继续存储那些已发送但未收到确认的报文段,以便在需要时重传。

    累积确认:只确认数据流中至第一个丢失字节为止的字节。如上图中,接收方B收到了A发送的包含字节0~2及字节6~7的报文段。某种原因,B还未收到字节3~5的报文段,此时B仍在等待字节3 和其后面的字节,因此B到A的下一个报文段将确认号字段置为3。

    ·重传

    1)超时重传

    ·重传

    每发送一个报文段,就对这个报文段设置一次计时器。计时器设置的重传时间到期但还未收到确认时,就要重传这一报文段。

    为了计算超时计时器的重传时间,TCP采用自适应算法,它记录一个报文段发出的时间,以及收到相应确认的时间,这两个时间之差称为报文段的往返时间RTT。 TCP保留了RTT的一个加权平均往返时间RTTs,随新测量RTT样本值的变化而变化。显然超时计时器设置的超时重传时间RTO应略大于RTTs,但也不能大太多,否则当报文段丢失时,TCP不能很快重传,导致数据传输时延大。

    2)冗余确认ACK

    超时触发重传存在的一个问题是超时周期往往太长,发送方通常可在超时事件发生之前通过注意所谓的冗余ACK来较好地检测丢包情况。

    冗余ACK就是再次确认某个报文段的ACK,而发送方先前已经收到过该报文段的确认。例如:发送方A发送了序号为1、2、3、4、5的TCP报文段,其中2号报文段在链路中丢失,无法到达接收方B。因此3、4、5号报文段对于B来说就成了失序报文段。TCP规定每当比期望序号大的失序报文段到达时,就发送一个冗余ACK,指明下一个期待字节的序号。3、4、5号报文到达B,但它们不是B所期望收到的下一个报文,于是B就发送3个对1号报文段的冗余ACK,表示自己期望接收2号报文段。TCP规定当发送方收到对同一个报文段的3个冗余ACK时,就可以认为跟在这个被确认报文段之后的报文段已经丢失。前面的快重传快恢复就用到冗余确认机制。

  • 相关阅读:
    Spanner: Google’s Globally Distributed Database
    详解ODX诊断数据库——ODX-V(整车网络拓扑)
    (总结一)Halcon基础之寻找目标特征+转正
    进程中的任务状态解析
    【SpringBoot】| SpringBoot 集成 Redis
    【经典PageRank 】02/2 算法和线性代数
    JS6种继承方式
    Armbian OS(基于ubuntu24) 源码编译mysql 5.7
    合数世纪 马蹄集
    数字孪生体标准编程
  • 原文地址:https://blog.csdn.net/weixin_46516647/article/details/127734132