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

《TCP/IP协议卷1》TCP协议TCP连接建立和释放

第17章 TCP:传输控制协议

TCP的服务

面向连接且可靠的字节流服务

  • 面向连接:两个使用TCP的应用(客户和服务器 )在交换数据前需先建立TCP连接,类似打电话先拨号振铃等对方接听,连接建立后仅两方通信,广播和多播不能用于TCP 。
  • 可靠性实现方式
    • 数据分割与长度适配:应用程序产生的数据报长度可变,TCP根据情况分割成最适合发送的数据块(报文段或段 ) 。
    • 超时重传:发送段后启动定时器,未及时收到确认则重发。
    • 确认机制:收到数据后发送确认,且确认不立即发送,常推迟。
    • 检验和:计算端到端检验和,检测数据传输变化,若检验和出错则丢弃报文段且不确认,期望发送端重发。
    • 报文段顺序处理:因IP数据报可能失序,TCP对收到的数据进行重新排序,按正确顺序交给应用层;对重复数据则丢弃。
    • 流量控制:通过固定大小的缓冲空间实现,接收端仅允许发送端发送接收缓冲区能接纳的数据,防止缓冲区溢出 。
  • 字节流服务:两个应用程序通过TCP连接交换由8 bit字节构成的字节流,TCP不在字节流中插入记录标识符,不解释字节流内容,传输的字节流是二进制数据还是其他类型数据由应用层解释,类似于Unix操作系统对文件的处理方式,内核不对文件内容作解释,交给应用程序处理。

17.3 TCP的首部

封装结构:TCP数据封装在IP数据报中,IP首部20字节,若不计任选字段,TCP首部通常也是20字节 。

首部字段

  • 源端口号和目的端口号:各16位,用于寻找发端和收端应用进程,与IP首部的源端IP地址和目的IP地址一起唯一确定一个TCP连接,一个IP地址和一个端口号也称为一个插口,插口(socket pair )可唯一确定网络中每个TCP连接。
  • 序号:32位无符号数,标识从TCP发端向收端发送的字节流中,本报文段的第一个字节序号。若将字节流看作单向流动,TCP用序号对每个字节计数,序号是32 bit ,序号到达后又从0开始 。建立连接时,SYN标志段含主机选择的初始序号ISN ,主机要发送数据的第一个字节序号为ISN加1 ,SYN标志消耗一个序号,FIN标志同理 。
  • 确认序号:32位,包含发送确认一端期望收到的下一个序号,应是上次已成功收到数据字节序号加1 。只有ACK标志为1时确认序号才有效,发送ACK无需代价,连接建立后,该字段和ACK标志总是被设置为1 。
  • 首部长度:4位,表明首部中32 bit字的数目,因任选字段长度可变,该字段用于确定首部长度,TCP最多有60字节首部,无任选字段时正常长度是20字节 。
  • 标志位
    • URG:紧急指针有效。
    • ACK:确认序号有效。
    • PSH:接收方应尽快将报文段交给应用层。
    • RST:重建连接。
    • SYN:同步序号用于发起连接。
    • FIN:发端完成发送任务。
  • 窗口大小:16位,以字节为单位,起始于确认序号字段指明的值,是接收端期望接收的字节数,最大值为65535字节,用于TCP流量控制 。
  • 检验和:16位,覆盖整个TCP报文段(首部和数据 ) ,由发端计算和存储,收端验证,计算方法与UDP检验和类似,所有16 bit字按二进制反码求和 。
  • 紧急指针:16位,只有URG标志置1时有效,是正的偏移量,与序号字段值相加表示紧急数据最后一个字节的序号,是发送端向另一端发送紧急数据的方式 。
  • 选项:长度可变,常见选项如最大报文段长度MSS,每个连接通常在通信用的第一个报文段(含SYN标志的段 )中指明该选项,指明本端所能接收的最大长度报文段,其他选项将在第24章介绍 。
  • 数据:从TCP首部之后开始,在连接建立和终止时,双方交换的报文段可能仅有TCP首部,无数据部分,处理超时等情况时也会发送不带任何数据的报文段 。

第18章 TCP连接的建立与终止

连接的建立与终止

  • tcpdump输出解读
    • 报文段格式:输出行格式为“源 > 目的: 标志” ,标志代表TCP首部6个标志比特中的4个(S - SYN、F - FIN、R - RST、P - PSH ) ,ACK和URG标志特殊显示 。
    • 字段含义:如1415531521:1415531521(0)表示分组序号是1415531521 ,报文中数据字节数为0 ;ack 1415531522表示确认序号;win 4096表示通告窗口大小;<mss 1024>表示最大报文段长度 。
    • 连接建立过程(三次握手)
      • 客户发送SYN段(报文段1 ) ,指明要连接的服务器端口及初始序号(ISN ) 。
      • 服务器发回含服务器初始序号的SYN报文段(报文段2 )作为应答,并确认客户的SYN,此SYN占用一个序号 。
      • 客户将确认序号设置为服务器的ISN加1 ,对服务器的SYN报文段进行确认(报文段3 ) 。
      • 发送第一个SYN的一端执行主动打开,接收SYN并回复SYN的一端执行被动打开。ISN随时间变化,每4ms加1 ,防止网络中延迟分组导致序号错误。
    • 连接终止过程(四次握手)
      • 主动关闭方(如发送第一个FIN的客户 )执行主动关闭,发送FIN报文段(报文段4 ) ,告知应用层已无数据发送 。
      • 被动关闭方(服务器 )收到FIN后,发回确认(报文段5 ) ,此时应用层仍可继续发送数据 。
      • 被动关闭方数据发送完毕,发送FIN报文段(报文段6 ) ,告知应用层已无数据发送 。
      • 主动关闭方收到FIN后,发回确认(报文段7 ) ,连接终止 。
    • 正常的tcpdump输出:默认情况下tcpdump在显示SYN报文段时只显示序号的相对偏移值,若要显示完整序号需加上 - S选项 。

18.3 连接建立的超时

  1. 模拟情况及现象:断开服务器主机电缆线模拟服务器未处于正常状态,使用telnet命令尝试建立连接,tcpdump输出显示客户多次发送SYN报文段试图建立连接,第1个与第2个SYN报文段间隔5.8秒,第2个与第3个间隔24秒 。运行38分钟后客户重新启动,对应初始序号变化。
  2. 超时时间分析
    • 第一次超时时间:BSD版TCP软件采用500 ms定时器确定超时。键入telnet命令建立6秒定时器(12个时钟滴答 ) ,但初始化为5.5秒 - 6秒内任意时刻,定时器初始值在设置后的第一个0 - 500 ms内的任意时刻减1 ,此后每隔约500 ms减1 ,滴答计数器为0时6秒定时器超时,之后24秒(48个滴答 )重新复位,所以第一次超时时间在5.59秒 - 5.93秒之间变化,第二次超时时间总是24.00秒 。
    • 服务类型字段:输出中出现[tos 0x10] ,这是IP数据报内的服务类型(TOS )字段,BSD/386中的Telnet客户进程将其设置为最小时延 。

18.4 最大报文段长度

  1. 定义与作用:最大报文段长度(MSS)指TCP传往另一端的最大数据块长度。建立连接时,双方需通告各自MSS,影响IP数据报长度,如常见MSS为1024,对应IP数据报通常40字节长(20字节TCP首部 + 20字节IP首部 ) 。
  2. 协商规则:MSS选项在含SYN标志报文段中出现,并非任何条件都可协商。若一方未通告MSS,接收方将默认MSS值设为536字节(适用于IPv4报文 ) 。当IP首部和TCP首部总长度为40字节且无选项,IP数据报最大长度65535字节时,可承载的TCP数据最大为65495字节,但实际因MTU等因素会更小。
  3. 影响因素与取值策略
    • MTU限制:MSS值与网络接口的MTU相关,如以太网MTU为1500字节,使用PPP协议的SLIP链路MTU可能较小。为避免IP分片,MSS值应根据出口MTU调整,如通过MTU为296的SLIP链路连接时,MSS设为256字节(考虑TCP和IP首部 ) 。
    • 取值示例:文中涉及的BSD/386和SVR4默认MSS为1024,其他系统如SunOS 4.1.3、Solaris 2.2和AIX 3.2.2在以太网上默认MSS为1460 。非本地网络(nonlocal )MSS默认值常为536 ,而区分本地和非本地网络的依据包括IP地址、子网号、网络号等,若地址相关信息不匹配或未明确设置,可能采用默认值。
    • 协商案例:以系统sun、slip和noao.edu之间建立TCP连接为例,sun通告MSS为1460,slip通告MSS为256,最终slip按自己的MSS值256发送数据,避免了因出口MTU为296可能导致的分片问题。若两端主机都连以太网,中间网络MTU为296,也会出现类似根据MTU协商MSS的情况 。

18.5 TCP的半关闭

  1. 概念:TCP允许连接的一端在结束自身发送后,仍能接收来自另一端的数据,此为半关闭特性,实际应用程序中较少使用 。
  2. 实现方式:编程接口方面,若应用程序不用close而调用shutdown且第2个参数为1 ,则插口API支持半关闭。多数应用程序通过调用close终止两个方向的连接 。
  3. 典型例子:以图18 - 10为例,客户端调用shutdown发送FIN报文段开始半关闭,服务器接收FIN并回复ACK,之后服务器仍能发送数据报文段,客户端接收并回复ACK 。当服务器发送完数据,也发送FIN报文段,客户端确认后连接彻底关闭 。
  4. 应用场景 - rsh命令
    • 原理:Unix中的rsh(1)命令用于在另一系统上执行命令,如sun % rsh bsdi sort < datafilersh将在主机sun和bsdi间建立TCP连接,把标准输入(datafile )复制给TCP连接,再从连接复制给标准输出 。
    • 半关闭作用:在远端主机bsdi上,rshd服务器执行sort程序,其标准输入和输出都是TCP连接。sort程序需读取所有输入数据才能产生输出,原始数据从rsh客户端传至sort服务器。当输入文件结束,rsh客户端执行TCP连接的半关闭。sort服务器收到文件结束标志后对数据排序并输出,rsh客户端继续接收数据。若无半关闭,rsh客户端发送完数据关闭连接,sort服务器可能无法完成输出 。

18.6 TCP的状态变迁图

  1. 状态变迁图概述:图18 - 12展示了TCP连接建立与终止的状态变迁规则。粗实线箭头表示客户端正常状态变迁,粗虚线箭头表示服务器正常状态变迁。从CLOSED状态开始和结束,LISTENSYN_SENT的变迁在伯克利版TCP软件中存在问题。只有在SYN_RCVD状态(正常情况 )进入,从SYN_RCVD回到LISTEN的状态变迁才有效,若收到RST而非ACK ,则回到LISTEN状态等待新连接请求 。图18 - 13呈现了正常TCP连接建立与终止过程中,客户与服务器所经历的不同状态 。
  2. 2MSL等待状态(TIME_WAIT状态)
    • 定义与作用:每个TCP实现需选定报文段最大生存时间MSL,RFC 793指出MSL为2分钟,实际常用值为30秒、1分钟或2分钟 。当TCP执行主动关闭并发送最后一个ACK后,需在TIME_WAIT状态停留2倍的MSL时间,一是可重发丢失的ACK以应对另一端超时重发的FIN;二是在2MSL等待期间,定义该连接的插口(IP地址和端口号 )不能被再使用,2MSL后才可复用 。
    • 实际影响与解决方法:多数TCP实现(如伯克利版 )在2MSL等待期间严格限制插口使用。一些API提供SO_REUSEADDR选项,可对处于2MSL等待的本地端口赋值,但在2MSL等待期间建立基于原连接的新连接仍会被弃用 。以sock程序实验为例,展示了服务器程序在2MSL等待期间无法绑定熟知端口,以及客户端申请处于2MSL等待端口时出现的错误情况 。不过,伯克利版实现支持在TIME_WAIT状态下建立新连接,但新序号需大于前连接最后序号加128000 ,但这种技术存在缺陷 。
  1. 平静时间:2MSL等待可防止将较早替身的迟到报文段解释为新连接的一部分。若处于2MSL等待端口的主机出现故障,重启后立即使用故障前处于2MSL的插口建立新连接,迟到报文段可能干扰新连接。为防止此情况,RFC 793规定TCP在重启后的MSL秒内不能建立任何连接,即平静时间 。多数主机重启时间比MSL长,所以很少违反这一原则 。
  2. FIN_WAIT_2状态:在FIN_WAIT_2状态下,已发送FIN且另一端已确认。若未执行半关闭,需等待另一端应用层发送FIN来关闭另一方向连接,之后进入TIME_WAIT状态 。许多伯克利实现设置10分钟定时器,若超时则进入CLOSED状态,防止在FIN_WAIT_2状态无限等待 。

服务器典型状态转移过程

  1. 进入 LISTEN 状态:服务器通过 listen 系统调用进入 LISTEN 状态,被动等待客户端连接,执行监听操作。
  2. 从 LISTEN 到 SYN_RCVD:服务器监听到客户端连接请求(收到同步报文段),将连接放入等待队列,同时向客户端发送 SYN 标志的确认报文段,此时连接处于 SYN_RCVD 状态。
  3. 从 SYN_RCVD 到 ESTABLISHED:服务器收到客户端发送的确认报文段,连接转移到 ESTABLISHED 状态,双方可进行数据传输 。
  4. 从 ESTABLISHED 到 CLOSE_WAIT:客户端主动关闭连接(通过 closeshutdown 系统调用发送结束报文段),服务器返回确认报文段,连接进入 CLOSE_WAIT 状态,等待服务器应用程序关闭连接。
  5. 从 CLOSE_WAIT 到 LAST_ACK:服务器检测到客户端关闭连接后,向客户端发送结束报文段,连接转移到 LAST_ACK 状态,等待客户端对结束报文段的最后一次确认,确认完成后连接彻底关闭。

客户端典型状态转移过程

从初始到 SYN_SENT:客户端通过 connect 系统调用主动与服务器建立连接,首先发送同步报文段,连接转移到 SYN_SENT 状态。

connect 调用失败情况

  • 端口问题:若目标端口不存在或被 TIME_WAIT 状态的连接占用,服务器发送复位报文段,连接返回初始的 CLOSED 状态。
  • 超时问题:目标端口存在但 connect 在超时时间内未收到服务器确认报文段,connect 调用失败,连接返回 CLOSED 状态。

从 SYN_SENT 到 ESTABLISHEDconnect 调用成功收到服务器确认报文段,连接转移到 ESTABLISHED 状态。

从 ESTABLISHED 到 FIN_WAIT_1:客户端主动关闭连接,发送结束报文段,连接进入 FIN_WAIT_1 状态,等待服务器确认。

从 FIN_WAIT_1 到 FIN_WAIT_2:客户端收到服务器确认报文段,转移到 FIN_WAIT_2 状态。

从 FIN_WAIT_2 到 TIME_WAIT:若服务器关闭连接(发送结束报文段),客户端进入 TIME_WAIT 状态。若处于 FIN_WAIT_1 状态的服务器直接收到带确认信息的结束报文段,可直接进入 TIME_WAIT 状态(不经过 FIN_WAIT_2 )。TIME_WAIT 状态下客户端持续等待一段时间后连接彻底关闭。

孤儿连接:Linux 为防止孤儿连接长时间停留在内核中,定义了两个内核变量 /proc/sys/net/ipv4/tcp_max_orphans/proc/sys/net/ipv4/tcp_fin_timeout ,前者指定内核能管的孤儿连接数目,后者指定孤儿连接在内核中生存的时间。

18.7 复位报文段

  1. 基本概念:TCP首部中的RST比特用于“复位” ,当发往基准连接(由IP地址和端口号指明 )的报文段出现错误时,TCP会发送复位报文段 。
  2. 到不存在的端口的连接请求:当连接请求到达时,若目的端口没有进程在监听,对于UDP会产生ICMP端口不可达信息,而TCP使用复位。以telnet连接未使用端口为例,如bsdi % telnet svr4 20000telnet客户端会立即显示连接被拒绝的错误信息。tcpdump输出显示,请求方发送SYN报文段,目的方回复RST报文段,复位报文中序号字段被置为0,确认序号被置为进入的ISN加上数据字节数(此例中数据字节数为0 ) 。
  3. 异常终止一个连接
    • 特点与优势:异常终止一个连接(发送RST报文段而非FIN )对应用程序有两个优点,一是丢弃任何待发数据并立即发送复位报文段;二是RST的接收方可以区分另一端执行的是异常关闭还是正常关闭 。
    • 实现方式:Socket API通过“linger on close”选项(SO_LINGER )提供这种能力。如使用sock程序,加上-L选项并将停留时间设为0,会导致连接关闭时进行复位而不是正常的FIN 。tcpdump输出显示,建立连接后发送数据,客户端使用异常关闭(-L选项 ) ,主机bsdi端的TCP发送RST报文段,RST报文中包含序号和确认序号,接收方收到RST会产生错误信息,提示连接被对方复位 。
  1. 检测半打开的连接
    • 半打开连接定义:一方已经关闭或异常终止连接而另一方却还不知道的TCP连接称为半打开连接 。
    • 产生场景及示例:如在使用PC作为Telnet客户主机时,用户工作结束关闭PC电源,未向服务器发送FIN,服务器将永远不知道客户程序已关闭。当第二天再启动PC并启动Telnet客户端时,会在服务器主机中产生半打开的TCP连接 。通过telnet连接到discard服务进行实验,先正常建立连接并发送数据,然后断开服务器主机的以太网电缆,重新启动服务器主机,再从客户端输入数据,服务器主机重启后会发送RST报文段,客户端收到RST报文段后显示连接已被另一端的主机终止 。TCP处理原则是将收方复位前接收的所有信息,当作数据报文中提到的连接数据段的应答 。

18.8 同时打开

  1. 概念:两个应用程序同时彼此执行主动打开的情况为同时打开。此时每一方都要发送一个SYN,且需传递给对方,每一方都使用对方熟知的端口作为本地端口 。
  2. 示例:如主机A使用本地端口7777与主机B的端口8888执行主动打开,主机B使用本地端口8888与主机A的端口7777执行主动打开。这与一个应用程序使用本地端口7777和主机B中Telnet服务器程序建立连接,同时主机B中Telnet客户程序与主机A中Telnet服务器程序建立连接的情况不同,在该Telnet例子中,两个Telnet服务器是被动打开,Telnet客户选择的本地端口不是另一端主机进程所熟知的端口 。
  3. TCP处理方式:TCP协议设计为可处理同时打开情况,能建立一条连接而非两条。出现同时打开时,两端几乎同时发送SYN并进入SYN_SENT状态,收到SYN时状态变为SYN_RCVD ,同时发送SYN并对收到的SYN进行确认,双方都收到SYN及相应ACK时,状态变迁为ESTABLISHED 。相比正常三次握手,同时打开的连接需要交换4个报文段 ,且此时每一端既是客户又是服务器 。
  4. 实验例子:在主机bsdi和vangogh.cs.Berkeley.edu上进行实验,两端几乎同时启动,设置本地端口并对另一端主机端口执行主动打开。通过sock程序验证连接两端的IP地址和端口号,观察到连接建立过程中的报文段交换,包括两端发送SYN、对收到SYN的确认等过程 。同时注意到实验中使用了一些新的TCP选项,且如果双方不能正确地同步接收SYN,会经历极多的报文段交换过程才能关闭连接,每个报文段交换过程包括每个方向上的一个SYN和一个ACK 。

18.9 同时关闭

  1. 概念:在TCP连接中,通常一方发送第一个FIN执行主动关闭,但双方也可同时执行主动关闭,此为同时关闭 。
  2. 状态变迁过程:当应用层发出关闭命令时,连接两端均从ESTABLISHED状态变为FIN_WAIT_1状态。随后,双方各自发送一个FIN报文段,当一端收到对方的FIN后,状态由FIN_WAIT_1变迁到CLOSING ,并发送最后的ACK 。当收到对方的ACK时,状态变为TIME_WAIT
  3. 报文段交换:同时关闭与正常关闭使用的报文段交换数目相同 。图18 - 19总结了同时关闭期间的报文段交换情况,包括双方发送FIN、回复ACK等过程 。

18.10 TCP选项

  1. 选项概述:TCP首部可包含选项部分,最初TCP规范定义的选项有选项表结束、无操作和最大报文段长度 。新的RFC(如RFC 1323 )定义了新的TCP选项,多数新选项在最新的TCP实现中才能见到,将在第24章详细介绍 。
  2. 选项格式:每个选项以1字节的kind字段开始,说明选项类型。kind字段为0和1的选项仅占1个字节,其他选项在kind字节后还有len字节,len字节说明的长度包括kind字节和len字节本身 。
  3. 具体选项
    • 选项表结束(kind = 0):占1字节,用于标记选项列表结束 。
    • 无操作(kind = 1):占1字节,用于在选项字段中填充字节,使选项长度为4字节的倍数 。
    • 最大报文段长度(kind = 2):共4字节,其中len = 4 ,后面2字节表示最大报文段长度值,在建立连接时用于通告MSS 。
    • 窗口扩大因子(kind = 3):共3字节,len = 3 ,后面1字节表示移位值,用于扩大窗口大小 。
    • 时间戳(kind = 8):共10字节,len = 10 ,含4字节时间戳值和4字节时间戳回应值,用于计算往返时间等 。
  1. 选项设置规则:使用4.4BSD系统初始化TCP连接时,tcpdump会在初始SYN上显示相关TCP选项,如MSS设置为512 ,使用NOP(无操作选项 )将窗口扩大选项填充为4字节边界,10字节的时间戳选项放在两个NOP后占12字节,使两个4字节的时间戳值满足4字节边界 。
  2. 其他选项kind值为4、5、6和7的四个选项称为选择ACK及回显选项,回显选项已被时间戳选项取代,选择ACK选项仍未定论,未包含在RFC 1323中,图18 - 20未列出,同时T/TCP建议也指明了其他未列出的选项 。

18.11 TCP服务器的设计

  1. 并发服务器原理:多数TCP服务器进程是并发的,当新连接请求到达,服务器接受请求并调用新进程(Unix系统常用fork函数创建 ,也可用线程 )处理新客户请求 。
  2. TCP服务器端口号
    • 通过netstat -a -n -f inet命令观察Telnet服务器,无连接时服务器处于LISTEN状态,本地地址*.23*为通配符 )表示传入连接请求可被任一本地接口接收,本地端口23是Telnet熟知端口,远端地址*.*表示等待连接请求 。
    • 建立连接后,处于ESTABLISHED状态的连接端口仍为23,系统内核中TCP模块为新连接创建进程 。多个从相同主机到相同服务器的连接,因远端端口号不同不会冲突,TCP通过本地地址和远端地址组成的4元组(目的IP地址、目的端口号、源IP地址和源端口号 )处理连接请求,仅目的端口号无法确定接收进程 ,且处于ESTABLISHED的进程不能接收SYN报文段,只有LISTEN进程能接收新连接请求 。
  1. 限定的本地IP地址:若为sock程序指定IP地址(或主机名 )作为服务器,该IP地址成为LISTEN服务器的本地IP地址,连接仅局限于来自指定接口的请求 ,其他接口的连接请求会被TCP模块拒绝并回复RST 。
  2. 限定的远端IP地址:UDP服务器可指定远端IP地址和端口号,多数API不支持TCP服务器指定远端插口,但服务器可等待连接请求后检查客户端IP地址和端口号 。TCP服务器有三种地址绑定类型,最常用的优先尝试,最不常用的最后尝试 。
  3. 呼入连接请求队列
    • 并发服务器需处理多个连接请求,伯克利的TCP实现中:
      • 等待连接请求的服务器有固定长度的连接队列,已完成三次握手的连接在此队列 。
      • 应用层指明队列最大长度(积压值,取值0 - 5 ) 。
      • TCP使用队列确定是否接收连接,期望应用层说明积压值,但实际情况复杂 ,积压值影响TCP监听端点的最大连接数 。
      • 若队列有空间,TCP确认SYN并完成连接,应用层在三次握手中第三个报文段收到后才知晓新连接 。
      • 若队列为满,TCP不理会SYN,不发RST ,客户端主动打开最终会超时 。
    • 通过sock程序的-q选项可调整服务器端积压值 。传统BSD系统存在连接传递顺序错误(按后进先出 ) ,部分厂商已修正 。Solaris 2.2提供选项使TCP仅在应用层允许时才接受连接请求 ,这种行为下,若应用层不处理,客户端主动打开虽完成但可能被服务器关闭连接 。

相关文章:

  • 一[2]、ubuntu18.04环境 yolov8 + realsenseD435i 实时效果测试
  • docker compose搭建elk 8.6.2
  • 爱普特APT-LINK PROG带电烧录器!STM32/SPI Flash高性能在线编程器详细解析
  • element 跨页选中,回显el-table选中数据
  • DEVICENET转MODBUS TCP网关连接ABB机器人配置案例
  • Vue 生命周期
  • 使用argocd部署nginx
  • 大厂Java技术面试实录:从基础到架构,谢飞机的面试之旅
  • 测试:AWS SDK for JavaScript v2 迁移到 v3
  • 【开发常用命令】:服务器与本地之间的数据传输
  • 新疆大学具身导航新范式!DOPE:基于双重对象感知增强网络的视觉语言导航
  • Python打卡第52天
  • 破解关键领域软件测试“三重难题”:安全、复杂性、保密性
  • 第三章支线七 ·路由边境 · 多页世界的穿梭之术
  • 考研复试C语言基础
  • 常见的UDS服务标识符与UDS刷写流程
  • 指针01 day13
  • mapstruct中的@Mapper注解详解
  • Linux检验库是否安装成功
  • 【Linux手册】从「程序」到「进程」:计算机世界的运行机制
  • 淮北市做网站最好的公司/新十条优化措施
  • 东莞最新网站建设软件/百度网盘官方
  • 烟台建设联合会网站/双11销售数据
  • 中国建设银行信用卡旅游卡服务网站/seo外链怎么做能看到效果
  • wordpress目录在哪里/网站优化包括哪些
  • 网站制作公司合肥/seo长沙