当前位置: 首页 > news >正文

计算机网络抄手 运输层

一、运输层协议概述

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)用户数据报协议UDP(User Datagram Protocol)[RFC 768,STD6]

(2)传输控制协议TCP(Transmission Control Protocol)[RFC 793,STD7]

下图给出了这两种协议在协议栈中的位置。

按照OSI的术语,两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元TPDU(Transport 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)的正整数来标志。主机的操作系统提供了接口机制,使得进程能够通过这种机制找到所要找的端口。

注意,这种在协议栈层间的抽象的协议端口是软件端口,和路由器或交换机上的硬件端口是不同的概念。硬件端口是不同硬件设备进行交互的端口,而软件端口是应用层的各种协议进程与运输实体进行层间交互的地点。不同的操作系统具体实现端口的方法可以是不同的。

当应用层要发送数据时,应用进程就把数据发送到适当的端口,然后运输层从该端口读取数据,进行后续的处理(把数据发送到目的主机)。当运输层收到对方主机发来的数据时,就把数据发送到适当的端口,然后应用进程就从该端口读取这些数据。显然,端口必须有一定容量的缓存来暂时存放数据。

后面的UDPTCP的首部格式中(图5-5,图5-14),都有源端口目的端口这两个重要字段。这两个端口就是运输层和应用层进行交互的地点。

TCP/IP的运输层用一个16位端口号来标志一个端口。但注意,端口号只具有本地意义,它只是为了标志本计算机应用层中的各个进程在和运输层交互时的层间接口。在互联网不同计算机中,相同的端口号是没有关联的。16位的端口号可允许有65535个不同的端口号,这个数目对一个计算机来说是足够用的。

由此可见,两个计算机中的进程要通信,不仅需要知道对方的IP地址(找到对方的计算机),而且要知道对方的端口号(找到对方计算机中的应用进程)。这和寄信的过程类似,写信时填地址(相当于IP地址),还有收件人的姓名(相当于端口号)。信封上还要写自己的地址和姓名。收信人回信时,很容易在信封上找到发信人的地址和姓名。互联网上的计算机通信采用客户-服务器方式。客户在发起通信请求时,必须先知道对方服务器的IP地址和端口号。因此运输层的端口号分为以下两大类。

(1)服务器端使用的端口号

这里又分为两类,最重要的一类叫作熟知端口号(well-known port number)或全球通用端口号,数值为0~1023。这些熟知端口号最初公布在文档中[RFC 1700,STD2],但后来因为互联网发展太快,这种标准文档无法随时更新,因此在RFC3232中就把RFC1700列为陈旧的,而当前最新的熟知端口号可在网址www.iana.org上查到。IANA把这些熟知端口号指派给了TCP/IP最重要的一些应用程序,让所有用户都知道。当一种新的应用程序出现后,IANA必须为它指派一个熟知端口,否则在互联网上的其他应用进程就无法和它进行通信。和电话通信相比,熟知端口号相当于所有人都知道的应急电话120,110等。下标给出了一些常用的熟知端口号。

另一类叫作登记端口号,数值为1024~49151。这类端口号是为没有熟知端口号的应用程序使用的。要使用这类端口号必须在IANA按照规定的手续登记,以防止重复。

(2)客户端使用的端口号

数值为49152~65535。由于这类端口号仅在客户进程运行时才动态选择,因此又叫作短暂端口号。这类端口号就是临时端口号,留给客户进程选择临时使用。当服务器进程收到客户进程的报文后,就知道了客户进程所使用的端口号,因而可以把数据发送给客户进程。通信结束后,刚才已使用过的客户端口号就被系统收回,以便给其他客户进程使用。


二、用户数据报协议UDP

1. UDP概述

用户数据报协议UDP只在IP的数据报服务至上增加了很少一点功能,这就是复用和分用的功能以及差错检测的功能。UDP的主要特点:

(1)UDP是无连接的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。

(2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。

(3)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这就是说,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文,如下图所示。在接收方的UDP,对IP层交上来的UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程。也就是说,UDP一次交付一个完整的报文。因此,应用程序必须选择合适大小的报文。若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率。反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太大,这也降低了IP层的效率。

(4)UDP没有拥塞控制,因此网络出现的拥塞不会使源主机的发送速率降低。这对某些实时应用很重要。很多的实时应用(如IP电话、实时视频会议等)要求源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太大的时延。UDP正好适合这种要求。

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

(6)UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

举例说明UDP的通信和端口号的关系(如下图所示)。主机H1中有三个应用进程分别要和主机H2中的两个应用进程进行通信。通信双方的关系是:P1->P4,P2->P4,P3->P5。主机H1的操作系统为这三个进程分别指派了端口,其端口号分别为a,b和c。图中位于应用层和运输层之间的小方框代表端口。在端口小方框中间还画有队列,表示端口具有缓存的功能,可以把收到的数据暂时存储一下。有时也可以把队列画成双向的,即分别表示存放来自应用层或运输层的数据。现在假定主机H1中的进程已经知道了对方进程P4和P5的端口号分别为x和y,于是在主机H1的运输层就可以组装成需要发送的UDP用户数据报,其中最重要的地址信息(源端口,目的端口)分别是(a,x),(b,x)和(c,y)。下图中把运输层以下的都省略了。因此,进程之间的通信现在可以看成是两个端口之间的通信。

图中在两个运输层之间有一条虚线,表示在两个运输层之间可以进行通信,而不是在一条连接。但这种通信是不可靠的通信,即所发送的报文在传输过程中有可能丢失,同时也不保证报文都能按照发送的先后顺序到达终点。这正是UDP通信的特点:简单方便,但不可靠。如果想要得到可靠地运输层通信,那就要使用TCP进行通信。注意,在两个运输层的UDP之间没有建立连接。

上图的例子画出了多对一的通信(a->x,b->x)。如果改成a->x,a->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最主要的特点:

(1)TCP是面向连接的运输层协议。这就是说,应用程序在使用TCP协议之前,必须先建立TCP连接。在传送数据完毕后,必须释放已经建立的TCP连接。也就是说,应用进程之间的通信好像在”打电话“:通话前要先拨号建立连接,通话结束后要挂机释放连接。

(2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)。

(3)TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复,并且按需到达。

(4)TCP提供全双工通信。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。

(2)socket 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只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器。

这里注意三点:

(1)A在发送完一个分组后,必须暂时保留已发送的分组的副本(在发送超时重传时使用)。只有在收到相应的确认后才能清除暂时保留的分组副本。

(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不断重传分组但总是收不到确认,就说明通信线路太差,不能进行通信。

使用上述的确认和重传机制,就可以在不可靠的传输网络上实现可靠的通信

像上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest)。意思是重传的请求是自动进行的,因此也可见自动请求重传这样的译名。接收方不需要请求发送方重传某个出错的分组。

4. 信道利用率

停止等待协议的优点是简单,但缺点是信道利用率太低。下图说明了这个问题。简单起见,假定在A和B之间有一条直通的信道来传送分组。

假定A发送分组需要的时间是TD。显然。TD等于分组长度除以数据率。再假定分组正确到达B后,B处理分组的时间可以忽略不计,同时立即发回确认。假定B发送确认分组需要时间TA。如果A处理确认分组的时间也可以忽略不计,那么A在经过时间(TD+RTT+TA)后就可以再发送下一个分组,这里的RTT是往返时间。因为仅仅是在时间TD内采用来传送有用的数据(包括分组的首部),因此信道的利用率U可用下式计算:

注意,更细致的计算还可以在上式分子的时间TD内扣除传送控制信息(如首部)所花费的时间。但在进行粗略计算时,用近似的式就可以了。

上式中的往返时间RTT取决于所使用的信道。例如,假定1200KM的信道往返时间RTT=20ms,分组长度是1200bit,发送速率是1Mbit/s。若忽略处理时间和TA(TA一般远小于TD),则可算出信道的利用率U = 5.66%。但若把发送速率提高到10Mbit/s,则U = 5.96 * 10^{-3}。信道在绝大多数时间内都是空闲的。

上图可看出,当往返时间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, 2^{32} - 1],共2^{32}个序号。序号增加到2^{32}-1后,下一个序号就又回到0。也就是说,序号使用mod2^{32}运算。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位长,可对4GB(4千兆字节)的数据进行编号。在一般情况下可保证当序号重复使用时,旧序号的数据早已通过网络达到终点了。

(4)数据偏移

占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个字段实际上是指出TCP报文段的首部长度。由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。但注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。由于4位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度(即选项长度不能超过40字节)。

(5)保留

占6位,保留为今后使用,但目前应置为0。

下面有6个控制位,用来说明本报文段的性质,它们的意义见下面6~11。

(6)紧急URG(URGent)

当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据),而不要按原来的排队顺序传送。例如,已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序的运行。因此用户从键盘发出中断命令(Control-C)。如果不使用紧急数据,那么这两个字符将存储在接收TCP缓存末尾。只有在所有的数据被处理完毕后这两个字符才被交付接收方的应用进程。这样就浪费了许多时间。

当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送。于是发送方TCP就把紧急数据插入到本报问段数据的最前面,而在紧急数据后面的数据仍是普通数据。这是要与首部中紧急指针字段配合使用。

然而在紧急指针字段的具体实现上,由于过去的有些文档有错误或有不太明确的地方,这就导致人们对有关的RFC文档产生了不同的理解。于是,2011年公布的建议标准RFC6093,对紧急指针字段的使用方法做出了更加明确的解释,并更新了几个重要的RFC文档,如RFC793,RFC1011,RFC1122等。

(7)确认ACK(ACKnowledgment)

仅当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(FINish)

用来释放一个连接。当FIN=1时,表明此报文的发送方的数据已发送完毕,并要求释放运输链接。

(12)窗口

占2字节。窗口值是[0,2^{16} - 1]之间的整数。窗口指的是发送本报文段的一方的接收窗口(而不是自己的发送窗口)。窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。总之,窗口值作为接收方让发送方设置其发送窗口的依据

例如,发送一个报文段,其确认号是701,窗口字段是10000。这就是告诉对方:“从701号算起,我(即发送此报文段的一方)的接收缓存空间还可接收1000个字节数据(字节序号是701~1700),你在给我发送数据时,必须考虑到我的接收缓存容量”。

总之,应记住:

窗口字段明确指出了现在允许对方发送的数据量。窗口值经常再动态地变化着。

(13)检验和

占2字节。检验和字段检验的范围包括首部和数据两部分。和UDP用户数据报一样,在计算检验和时,要在TCP报文段地前面加上12字节的伪首部。伪首部的格式与图5-5中UDP用户数据报的伪首部一样。但应把伪首部第4个字段中的17改为6(TCP的协议号是6),把第5字段中的UDP长度改为TCP长度。接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用IPv6,则相应的伪首部也要改变。

(14)紧急指针

占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。注意,即使窗口为0时也可发送紧急数据。

(15)选项

长度可变,最长可达40字节。当没有使用”选项“时,TCP的首部长度是20字节。最后的填充字段仅仅是为了使整个TCP首部字段是4字节的整数倍。

TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum 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的固定首部)。因此,所有互联网上的主机都应能接收的报文段长度是536+20(固定首部长度)=556字节。

随着互联网的发展,又陆续增加了几个选项,如窗口扩大选项、时间戳选项等(见建议标准RFC 7323)。以后又增加了有关选择确认(SACK)选项(RFC 2018)。这些选项的位置都在图5-13所示的选项字段中。

窗口扩大选项是为了扩大窗口。TCP首部中窗口字段长度是16位,因此最大的窗口大小为64KB.虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,其传播时延和带宽都很大,要获得高吞吐率需要更大的窗口大小。

窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16 + S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2^{16 + 14} - 1 = 2^{30} - 1。

窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一段实现了窗口扩大,当它不需要再扩大其窗口值时,可发送S = 0的选项,使窗口大小回到16。

时间戳选项占10字节,其中最主要的字段是时间戳值字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个功能:

第一,用来计算往返时间RTT。发送方再发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段值复制到时间戳送回答字段。因此,发送方在收到确认报文后,可以准确计算出RTT。

第二,用于处理TCP序号超过2^{32}的情况,这又称为防止序号绕回PAWS。TCP报文段的序号只有32位,而每增加2^{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的优先状态机

相关文章:

计算机网络抄手 运输层

一、运输层协议概述 1. 进程之间的通信 从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&…...

激光雷达YDLIDAR X2 SDK安装

激光雷达YDLIDAR X2 SDK安装 陈拓 2024/12/15-2024/12/19 1. 简介 YDLIDAR X2官方网址https://ydlidar.cn/index.html‌YDLIDAR X2 YDLIDAR X2是一款高性能的激光雷达传感器,具有以下主要特点和规格参数‌: ‌测距频率‌:3000Hz ‌扫描频…...

DeepSeek-R1:使用KTransformers部署(保姆级教程)

1. 引言 KTransformers作为一个开源框架,专门为优化大规模语言模型的推理过程而设计。它支持GPU/CPU异构计算,并针对MoE架构的稀疏性进行了特别优化,可以有效降低硬件要求,允许用户在有限的资源下运行像DeepSeek-R1这样庞大的模型…...

什么是Spring Boot?

Spring Boot 是基于 Spring 框架的扩展工具,旨在简化 Spring 应用的初始搭建和开发流程。它通过约定优于配置和自动装配机制,减少了传统 Spring 开发中的繁琐配置,使开发者能快速构建独立运行、生产级别的应用。 Spring Boot 的核心特性 自动…...

C++ 学习路线:从入门到精通,全面掌握 C++ 编程

引言 C 是一种高性能的系统级编程语言,广泛应用于游戏开发、嵌入式系统、高性能计算等领域。尽管 C 的学习曲线较为陡峭,但掌握它将为你的职业发展带来巨大的优势。本文将为你提供一条清晰的 C 学习路线,帮助你从入门到精通,逐步…...

【算法精练】背包问题(01背包问题)

目录 1. 背包问题 2. 01背包问题 3. 优化 总结 1. 背包问题 经典的背包问题: 有一个背包,限制背包的体积;有一堆物品,从这堆物品中选择,在不超过背包容量的前提下,选出最大价值的物品; 从这个…...

宇树机器人G1 SDK实战和交付

最近客户有需求定制机宇树机器人G1 的功能,在接到需求后。进行了评估报价和开发。现在已经进入开发交付阶段 现在已经拿到了G1和H1版本的人型机器人。 需求是使用宇树机器G1 或H1在展馆进行路线移动,或指定移动路径,并且不能碰到小朋友&…...

使用EasyExcel和多线程实现高效数据导出

​ 使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中,数据导出是一个常见的需求。为了提高导出效率,尤其是在处理大量数据时,我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…...

如何监控和优化 MySQL 中的慢 SQL

如何监控和优化 MySQL 中的慢 SQL 前言一、什么是慢 SQL?二、如何监控慢 SQL?1. 启用慢查询日志启用方法:日志内容: 2. 使用 mysqldumpslow 分析日志 三、如何分析慢 SQL?1. 使用 EXPLAIN 分析执行计划使用方法&#x…...

SPO(Self-Supervised Prompt Optimization)自我监督Prompt提示优化的全景指南

HuggingFace 链接:https://huggingface.co/spaces/XiangJinYu/SPO 作者也与国内的 ModelScope 魔搭社区官方进行了合作,现在可以体验由 Deepseek-V3 和 Qwen-2.5-72B 等开源模型驱动的 SPO。 ModelScope 链接: https://modelscope.cn/studios/AI-ModelScope/SPO 在大语言…...

【云安全】云原生-Docker(六)Docker API 未授权访问

Docker API 未授权访问 是一个非常严重的安全漏洞,可能导致严重的安全风险。 什么是 Docker API ? Docker API 是 Docker 容器平台提供的一组 RESTful API,用于与 Docker 守护程序进行通信和管理 Docker 容器。通过 Docker API,…...

9.PG数据库层权限管理(pg系列课程)第2遍

一、PostgreSQL数据库属主 Postgres中的数据库属主属于创建者,只要有createdb的权限就可以创建数据库,数据库属主不一定拥有存放在该数据库中其它用户创建的对象的访问权限。数据库在创建后,允许public角色连接,即允许任何人连接…...

Pytorch深度学习教程_3_初识pytorch

欢迎来到《PyTorch深度学习教程》系列的第三篇!在前面的两篇中,我们已经介绍了Python及numpy的基本使用。今天,我们将深入探索PyTorch的核心功能,帮助你更好地理解和使用这个强大的深度学习框架。 欢迎订阅专栏: 深度…...

个人博客5年回顾

https://huangtao01.github.io/ 五年前,看程序羊的b站视频做的blog,受限于网络,只能单向学习,没有人指导与监督,从来没有想过,有没有什么问题? 一、为什么要做个人博客? 二、我是怎么…...

DeepSeek与ChatGPT:会取代搜索引擎和人工客服的人工智能革命

云边有个稻草人-CSDN博客 在众多创新技术中,DeepSeek和ChatGPT无疑是最为引人注目的。它们通过强大的搜索和对话生成能力,能够改变我们与计算机交互的方式,帮助我们高效地获取信息,增强智能服务。本文将深入探讨这两项技术如何结合…...

SpringBoot高级-底层原理

目录 1 SpringBoot自动化配置原理 01-SpringBoot2高级-starter依赖管理机制 02-SpringBoot2高级-自动化配置初体验 03-SpringBoot2高级-底层原理-Configuration配置注解 04-SpringBoot2高级-底层原理-Import注解使用1 05-SpringBoot2高级-底层原理-Import注解使用2 06-S…...

百问网(100ask)的IMX6ULL开发板的以太网控制器(MAC)与物理层(PHY)芯片(LAN8720A)连接的原理图分析(包含各引脚说明以及工作原理)

前言 本博文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 。 本博文和博文 https://blog.csdn.net/wenhao_ir/article/details/145663029 的目录是找出百问网(100ask)的IMX6ULL开发板与NXP官方提供的公板MCIMX6ULL-EVK(imx6ull14x14evk)在以太网硬件…...

使用 PyTorch 实现标准卷积神经网络(CNN)

卷积神经网络(CNN)是深度学习中的重要组成部分,广泛应用于图像处理、语音识别、视频分析等任务。在这篇博客中,我们将使用 PyTorch 实现一个标准的卷积神经网络(CNN),并介绍各个部分的作用。 什…...

openGauss 3.0 数据库在线实训课程18:学习视图管理

前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见:openGauss 3.0.0数据库在线实训课程 学习目标 掌握openGauss视图的管理:创建视图、删除视图、查询视图的信息、修改视图的信息。 课程作业 1.创建表,创建普通视图…...

nginx ngx_http_module(7) 指令详解

nginx ngx_http_module(7) 指令详解 nginx 模块目录 nginx 全指令目录 一、目录 1.1 模块简介 以下是您请求的Nginx HTTP相关模块的简述: ngx_http_proxy_protocol_vendor_module:这是一个商业订阅模块,允许从云平台的应用特定TLV&#…...

用DeepSeek零基础预测《哪吒之魔童闹海》票房——从数据爬取到模型实战

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 **一、为什么要预测票房?****二、准备工作****三、实战步骤详解****Step 1:数据爬取与清洗&am…...

青少年编程都有哪些比赛可以参加

Python小学生可参加的赛事: 电子学会青少年编程考级、中国计算机学会编程能力等级认证、蓝桥杯、 信奥赛CSP-J/S初赛/NOIP(推荐C)、编程设计、信息素养、科技创新赛; 升学助力(科技特长生、大学)、企业、出国留学; python比赛&am…...

如何使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈

使用 Flutter DevTools 和 PerformanceOverlay 监控性能瓶颈:详细分析与实战 在开发 Flutter 应用时,性能问题可能会导致用户体验下降,比如页面卡顿、掉帧、内存泄漏等。为了定位和解决这些问题,Flutter 提供了强大的性能监控工具…...

拯救者电脑在重装系统之后电源计划丢失Fn+Q切换不了模式怎么恢复?

参考联想知识库的一下链接: https://iknow.lenovo.com.cn/detail/196192 其中下载的解压文件后的文件需要复制粘贴到D盘的根目录下,再来运行文件。若在生成的log文件中看到导入成功以及控制面板中看到已添加的电源计划即可 如果还是无效可是试试以下的…...

自动创建spring boot应用(eclipse版本)

使用spring starter project创建项目 设置Service URL 把Service URL设置为 https://start.aliyun.com/ 如下图: 使用这个网址,创建项目更快。 选择Spring Web依赖 项目结构 mvnw和mvnw.cmd:这是maven包装器(wrapper)脚本&…...

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型(LLM)的性能。通过提供结构化的人工反馈形式的大语言模型训练数据,让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话,并依据回复的相关性、连贯性、准确…...

应急响应(linux 篇,以centos 7为例)

一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录:lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志:…...

鹰角基于 Flink + Paimon + Trino 构建湖仓一体化平台实践项目

摘要:本文整理自鹰角大数据开发工程师,Apache Hudi Contributor 朱正军老师在 Flink Forward Asia 2024 生产实践(二)专场中的分享。主要分为以下四个部分: 一、鹰角数据平台架构 二、数据湖选型 三、湖仓一体建设 四、…...

探秘Transformer系列之(3)---数据处理

探秘Transformer系列之(3)—数据处理 接下来三篇偏重于工程,内容略少,大家可以当作甜点 _。 0x00 概要 有研究人员认为,大模型的认知框架看起来十分接近卡尔弗里斯顿(Karl Friston)描绘的贝叶斯大脑。基于贝叶斯概率…...

跨平台AES/DES加密解密算法【超全】

算法说明 要实现在 WinForm、Android、iOS、Vue3 中使用 相同的算法,确保各平台加密结果互通 一、统一加密参数 算法: AES-256-CBC 密钥: 32字节(示例中使用固定字符串生成) IV: 16字节 填充模式: PKCS7 字符编码: UTF-8 输出格式: Base64二、各平台实现代码...

XML DOM 高级

XML DOM 高级 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言,DOM(文档对象模型)是用于访问和操作XML文档的编程接口。在XML DOM中,我们可以对XML文档进行读取、修改、添加和删除等操作。本…...

MySQL智障离谱问题,删了库确还存在、也不能再创建同名库

1、问题 今天跟后端朋友接毕设单子的时候,后端穿过来的【weather.sql】这个文件没弄好,导致这个【weather】数据库的数据是错的,因此我用datagrip的GUI界面直接右键删除,结果就是tmd删不掉,ok,我只能在那新…...

网工项目实践2.6 广域网需求分析及方案制定

本专栏持续更新,整一个专栏为一个大型复杂网络工程项目。阅读本文章之前务必先看《本专栏必读》。 全网拓扑展示 一.广域网互联方式 1.专线 优点 稳定 独享。绝对安全。可靠性高,带宽高,完全取决于终端接口。 缺点: 费用高。建设时间长。难…...

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件,已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …...

GITHUB的若干操作

GITHUB的若干操作 github又名代码仓库,是git的远程和线上延申,Git是一个分布式版本控制系统,用于跟踪文件的更改和协助多人合作开发。它由Linus Torvalds为更好地管理Linux内核开发而设计。git最原始是为Linux系统设计而生,不过后…...

网页制作04-html,css,javascript初认识のhtml如何使用列表

Html列表共有三种类型: 1.一种是无序列表,项目符号有几个符号组成; 2.一种是有序列表,项目符号由字母或数字进行排序; 3.一种是定义列表,它用作产生条件和描述的双重列表,可以对列表进行灵活定义 一、有序列表 1.有序列表ol 1&#xff09;一般格式&#xff1a; <ol>…...

Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

目录 1.认识进程间通信 2.管道 2.1匿名管道 2.2pipe()函数 —创建匿名管道 2.3匿名管道的四种情况 2.4管道的特征 3.基于管道的进程池设计 4.命名管道 4.1引入与性质 4.2命令行创建 4.3程序中创建命名管道 写个小项目 项目规划 PipeClient.cpp PipeServe.cpp 5.…...

深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

一、问题背景&#xff08;传统爬虫的痛点&#xff09; 数据采集是现代网络爬虫技术的核心任务之一。然而&#xff0c;传统爬虫面临多重挑战&#xff0c;主要包括&#xff1a; 反爬机制&#xff1a;许多网站通过检测请求头、IP地址、Cookie等信息识别爬虫&#xff0c;进而限制…...

Spring Boot中使用Flyway进行数据库迁移

文章目录 概要Spring Boot 集成 FlywayFlyway 其他用法bug错误Flyway版本不兼容数据库存在表了Flyway 的校验和&#xff08;Checksum&#xff09;不匹配 概要 在 Spring Boot 项目开发中&#xff0c;数据库的变更不可避免。手动执行 SQL 脚本不仅容易出错&#xff0c;也难以维…...

Conda 常用命令全解析

在 Windows 系统中&#xff0c;Conda 是一款功能强大的包管理和环境管理工具&#xff0c;尤其对于数据分析、科学计算等场景有着重要的作用。本文将详细介绍 Conda 在 Windows 系统中的常用命令&#xff0c;帮助你高效地管理虚拟环境和软件包。 一、环境管理命令 1.1 查看 Co…...

【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js

??大家好&#xff01;我是毛毛张! ??个人首页&#xff1a; ??今天毛毛张分享的是关于如何快速??♂搭建一个前端工程化的项目的环境搭建以及流程?? 文章目录 1.前端工程化环境搭建?? 1.1 什么是前端工程化1.2 nodejs的简介和安装 1.2.1 什么是Nodejs1.2.2 如何安装…...

基于51单片机的定时器实现LED闪烁控制(CT107D)

引言 在嵌入式开发中&#xff0c;定时器是一个非常重要的外设&#xff0c;它可以用于实现精确的时间控制。本文将介绍如何在CT107D单片机综合训练平台上&#xff0c;利用51单片机的定时器T0实现LED灯的定时闪烁控制。具体功能如下&#xff1a; L1指示灯&#xff1a;每隔1秒闪烁…...

一键部署开源DeepSeek并集成到钉钉

一键部署开源DeepSeek并集成到钉钉 简介&#xff1a; DeepSeek发布了两款先进AI模型V3和R1&#xff0c;分别适用于对话AI、内容生成及推理任务。由于官方API流量限制&#xff0c;阿里云推出了私有化部署方案&#xff0c;无需编写代码即可完成部署&#xff0c;并通过计算巢AppF…...

Web后端 Tomcat服务器

一 Tomcat Web 服务器 介绍&#xff1a; Tomcat是一个开源的Java Servlet容器和Web服务器&#xff0c;由Apache软件基金会开发。它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;用于运行Java Web应用程序。Tomcat轻量、易于配置&#xff0c;常作为开发和部署…...

java多线程及线程池

线程 一、什么是多线程&#xff1f;二、线程的生命周期三、简单地创建一个线程1、实现Runnable接口2、继承Thread类3、使用Callable和FutureTask4、三种实现方式的对比 四、线程同步和锁1、为什么需要线程同步&#xff1f;2、线程同步的实现方式3、synchronized和ReentrantLock…...

Unreal5从入门到精通之如何在 C++ 中创建 UserWidget

文章目录 前言UUserWidget 子类示例创建我们的 C++ 类的新蓝图子类更改现有蓝图的父类现在我们有了 C++ 基类,下一步做什么?蓝图还是 C++?结论前言 在之前的教程中,我展示了如何在编辑器中创建 UserWidget 蓝图, 在本教程中,我们将创建一个新的基于 C++ 的子类UUserWid…...

Elasticsearch:探索 CLIP 替代方案

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 分析图像到图像和文本到图像搜索的 CLIP 模型的替代方案。 在本文中&#xff0c;我们将通过一个模拟房地产网站的实际示例介绍 CLIP 多模态模型&#xff0c;探索替代方案&#xff0c;并分析它们的优缺点&#xff0c…...

天翼云910B部署DeepSeek蒸馏70B LLaMA模型实践总结

一、项目背景与目标 本文记录在天翼云昇腾910B服务器上部署DeepSeek 70B模型的全过程。该模型是基于LLaMA架构的知识蒸馏版本&#xff0c;模型大小约132GB。 1.1 硬件环境 - 服务器配置&#xff1a;天翼云910B服务器 - NPU&#xff1a;8昇腾910B (每卡64GB显存) - 系统内存&…...

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】&#xff0c;点击【个人】 3.【command shift J】显示所有文件&#xff0c;打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹&#xff1a;用于存储每个应用程序的沙盒数据&#xff0c;确保应用程序…...

bash+crontab充当半个守护进程的歪招

两个cpolar下的不同程序&#xff0c;都需要定时监测&#xff0c;以免程序没有再运行。有点类似半个守护进程吧。但是守护进程不会写&#xff0c;咋搞&#xff1f;就用这个办法临时当下守门员。这里主要为了备忘xpgrep -各类参数的用法。 #!/bin/bashif pgrep -fl "check_…...