计算机网络面试知识点总结

计算机网络面试知识点总结

一.网络分层结构

image-20220223212349744

目前用的一般是5层网络模型来教学理解,实际应用中是TCP/IP的四层网络体系结构。

1.物理层

物理层考虑的是如何将比特流数据在连接计算机的传输媒体上进行传输,而不是指具体的传输媒体。

具体来说:

  • 确定与传输媒体的接口的一些特性,比如指定接口的形状,尺寸,引线数目,电压范围等等

2.数据链路层

将网络层传下来的IP数据报加上帧头帧尾封装成帧,在两个相邻节点的链路上传送帧。

数据链路层所使用的信道有两种:

  • 点对点信道
  • 广播信道:使用一对多的广播通信方式

3.网络层

选择合适的路由和交换节点,将标有目的地地址的IP数据报尽最大努力传输到目的主机。

需要注意的是:网络层不保证可靠传输,也就是说中间有丢失的IP数据报(分组)该层不做相应的处理。

4.运输层

负责向两台主机进程之间的通信提供数据传输服务,传输层的协议主要有传输控制协议(面向连接的)TCP和用户数据协议(无连接的)UDP。

image-20220223223611926

  • 运输层和前面介绍的3层最大的不同是,前面三层从每一层的传输角度来看,在源地址和目的地址之间可能有很多个节点,而在运输层的角度来看,它的眼里只有源地址和目的地址主机上对应的进程,它看不到数据所经历了哪些节点。

  • 从IP层来看,通信的两端是两台主机,从运输层来看,通信的两端是主机中的进程。

  • 在一台主机中很可能有多个应用进程同时分别与另一台主机中的多个应用进程进行通信,这就表明运输层需要有一个重要功能——复用和分用。

  • image-20220224100947597

  • 运输层的端口

    ​ 运行在计算机中的进程是用进程标识符来标志的,但是不同的操作系统有不同的规定,因此必须采用统一的方法对TCP/IP体系的应用进程进行标志,标志的方法是端口

    端口用一个16位端口号进行标志,端口号只具有本地意义,也就是说不同计算机之间相同端口号没有联系。由此可见,两个计算机中的进程要互相通信,不仅必须知道对方的IP地址(为了找到对方的计算机),而且还要知道对方的端口号(为了找到对方计算机中的应用进程)。

  • 端口分类

    ​ 主要分为:

    服务端使用的端口号

    ​ 熟记端口0-1023、登记端口号。

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

    image-20220224103305220

5.应用层

为应用程序提供交互服务。在互联网中的应用层协议很多,如域名系统DNS、HTTP协议、SMTP协议等

二.TCP连接的建立与断开

TCP连接的建立采用客户-服务器方式

客户:主动发起连接建立的应用进程

服务器:被动等待连接建立的应用进程叫做服务器

1.三次握手

TCP建立连接的过程称为握手,整个过程需要传输三个TCP报文

image-20220223231107386

  • 第一次握手:TCP数据报首部中的同步位SYN=1,并且选择序号位seq=x(表示一个随机数)。同步 SYN = 1 表示这是一个连接请求连接接受报文
  • 第二次握手:客户端的TCP在接受到连接请求后,如果同意应该发送确认建立连接的数据报,SYN=1,ACK=1,ack=x+1,选择序号seq为y。只有当 ACK = 1 时确认号字段ack字段才有效。当 ACK = 0 时,确认号无效。
  • 第三次握手:客户接收到第二次握手报文后,向服务器给出确认,ACK=1,seq=x+1,ack=y+1。客户端并通知上层应用进程连接已经建立。B的TCP收到A的确认后也通知其应用进程连接已经建立。

2.四次挥手

数据传输结束后,双方都可以随时释放连接。

image-20220223234327199

  • A没有想要跟B发送的数据了,需要和B断开连接,A的应用进程先向其TCP发出连接释放报文段(FIN=1,seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1(终止等待1)状态,等待B的确认
  • B发出确认,ack=u+1,设序号seq=v,B进入CLOSE-WAIT(关闭等待)状态。并且B主机的TCP进程通知高层应用进程,A向B的单向连接断开了。不过此时B向A的连接没断开,B向A发数据,A要接受。然后A收到B的确认后,进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
  • B发送完数据后,就会发出连接释放报文段(FIN=1,ACK=1,seq=w,ack=u+1),B进入LAST-ACK(最后确认)状态,等待A的确认。
  • A收到B的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL最大报文段生存时间)后,A才进入CLOSED状态。B收到A发出的确认报文段后关闭连接,若没收到A发出的确认报文段,B就会重传连接释放报文段。

3.第四次挥手为什么要等2MSL

保证A发送的最后一个ACK报文段能够到达B。这个ACK报文段有可能丢失,B收不到这个确认报文,就会超时重传连接释放报文段,然后A可以在2MSL时间内收到这个重传的连接释放报文段,接着A重传一次确认,重新启动2MSL计时器,最后A和B都进入到CLOSED状态,若A在TIME-WAIT状态不等待一段时间,而是发送完ACK报文段后立即释放连接,则无法收到B重传的连接释放报文段,所以不会再发送一次确认报文段,B就无法正常进入到CLOSED状态。

防止已失效的连接请求报文段出现在本连接中。A在发送完最后一个ACK报文段后,再经过2MSL,就可以使这个连接所产生的所有报文段都从网络中消失,使下一个新的连接中不会出现旧的连接请求报文段。如果A的最后ACK报文丢失了,且没有等待直接开始下一次连接,B重发的断开连接请求报文就会出现在下一个新的连接中。

4.为什么连接是三次,断开是四次呢

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。但是在关闭连接时,当Server端收到Client端发出的连接释放报文时,很可能并不会立即关闭SOCKET,所以Server端先回复一个ACK报文,告诉Client端我收到你的连接释放报文了。只有等到Server端所有的报文都发送完了,这时Server端才能发送连接释放报文,之后两边才会真正的断开连接。故需要四次挥手。

5.为什么连接是三次而不是两次

因为如果是两次,此时B还不能确认,B向A发送的数据A能够接收到。就不能正常地进行全双工通信。

三.TCP和UDP

1.TCP的特点以及与UDP区别

  • TCP是面向连接的,即发送数据之前要建立一条连接,UDP是无连接的。
  • TCP提供可靠服务
  • TCP提供全双工通信
  • 每一条TCP连接只能是点对点的(一对一),而UDP支持一对多,一对一,多对多,多对一的通信
  • TCP是面向字节流的,虽然应用程序和TCP的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。UDP是面向报文的,不会对应用进程交下来的报文进行划分。
    • image-20220224105129367
  • TCP有拥塞控制,UDP没有,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如实时视频会议等)。
  • TCP首部开销20字节;UDP的首部开销小,只有8个字节

2.什么是套接字

TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP连接的端点叫做 套接字(socket)

image-20220224111117282

同一个IP地址可以有很多不同的TCP连接,同一个端口号也可以出现在不同的TCP连接中。

3.滑动窗口进行流量控制

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 TCP会话的双方都各自维护一个发送窗口和一个接收窗口。接收窗口大小取决于应用、系统、硬件的限制。发送窗口则取决于对端通告的接收窗口。接收方发送的确认报文中的rwnd字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将接收方的确认报文rwnd字段(窗口字段)设置为 0,则发送方不能发送数据。

image-20220224114923903

image-20220224114830349

TCP头包含rwnd字段,16bit位,它代表的是窗口的字节容量,最大为65535。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。从上图可以看出接收端发送的报文中rwnd字段是可以根据自己的接受能力变化的。

4.TCP的拥塞控制

拥塞控制是为了避免过多的数据注入到网络中,TCP采取基于拥塞窗口(cwnd)的方法进行拥塞控制。TCP发送方维持一个拥塞窗口cwnd(Congestion Window)。

  • 拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。

  • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。

  • 所以,发送窗口大小不仅取决于接收方窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:MIN(rwnd,cwnd)

具体的拥塞控制算法:

  • 慢开始:

    在刚刚开始发送报文段时,先把初始拥塞窗口cwnd设置为 1 2 个发送方的最大报文段 SMSS。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。每经过一个传输轮次,拥塞窗口 cwnd 就加倍。 为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量

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

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

    当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法。

  • 拥塞避免

    ​ 让拥塞窗口cwnd缓慢地增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口cwnd按线性规律缓慢增长。无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是重传定时器超时),就要把慢开始门限ssthresh设置为出现拥塞时的发送 方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

    image-20220224141719954

  • 快重传

    ​ 有时个别报文段会在网络中丢失,但实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞。这就导致发送方错误地启动慢开始,把拥塞窗口cwnd又设置为1,因而降低了传输效率。快重传算法可以避免这个问题。快重传算法首先要求接收方每收到一个失序的报文段后就立即发出三次重复确认,使发送方及早知道有报文段没有到达对方。

    image-20220224142623075

    发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待重传计时器到期。由于发送方尽早重传未被确认的报文段,因此采用快重传后可以使整个网络吞吐量提高约20%

  • 快恢复

    ​ 当发送方连续收到三个重复确认,就会把慢开始门限ssthresh减半,接着把cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

    在采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用。 采用这样的拥塞控制方法使得TCP的性能有明显的改进。

四.网络层的重要协议

image-20220224144456258

1.IP地址和硬件地址

从网络层次的角度来看,硬件地址是在数据链路层和物理层用的地址,IP地址是在网络层及其上层所用的地址。IP地址是一种逻辑地址,可以用软件进行划分实现。

image-20220224145518343

image-20220224151317864

2.地址解析协议ARP

ARP主要用于解决同一个局域网上的主机或路由器IP和MAC地址的解析,已知IP地址如何解析出MAC地址。

image-20220224151645275

  • 一个主机都设有一个ARP高速缓存,里面有所有的局域网上的主机和路由器的IP地址到硬件地址的映射表

  • 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址,如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段(所在的局域网)发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。

    image-20220224152944984

  • 局域网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个 ARP响应数据包,告诉对方自己是它需要查找的MAC地址。

  • 源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

  • 需要注意的是如果要找的主机和源主机不在一个局域网中,就要用ARP找到一个位于本局域网中某个路由器的硬件地址,然后把ARP请求分组发给该路由器,剩下的工作就由其他网络来做。

3.路由器分组转发算法

image-20220224155532892

4.路由信息协议RIP

RIP 是一种分布式的基于距离向量的路由选择协议。RIP 协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。(从一个路由器到直接相连的网络的距离为1,距离也称为跳数,每经过一个路由器跳数就加一)

RIP协议的三个特点:

  • 仅和相邻路由器交换信息,所交换的信息是是各自的路由表
  • 按固定时间间隔交换信息,例如每隔30s,当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息

五.应用层的重要协议

1.域名的解析过程

  • 浏览器搜索自己的DNS缓存

  • 若没有,则搜索操作系统中的DNS缓存和hosts文件

  • 若没有,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功则返回结果,否则依次向根域名服务器、顶级域名服务器、权限域名服务器发起查询请求,最终返回IP地址给本地域名服务器

  • 本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来

  • 操作系统将 IP 地址返回给浏览器,同时自己也将IP地址缓存起来

  • 浏览器得到域名对应的IP地址

2.浏览器中输入URL地址得到页面的过程

  • 解析域名,找到主机 IP。

  • 浏览器利用 IP 直接与网站主机通信,三次握手,建立 TCP 连接。(浏览器会以一个随机端口服务端的 web 程序 80 端口发起 TCP 的连接。 )

  • 建立 TCP 连接后,浏览器向主机发起一个HTTP请求。

  • 服务器响应请求,返回响应数据。

  • 浏览器解析响应内容,进行渲染,呈现给用户。

3.什么是cookie

由于HTTP协议是无状态的协议,它把每一次http请求看做是独立的,因此需要用某种机制来识具体的请求者的身份,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session

cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。说得更具体一些:当用户使用浏览器访问一个支持cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体中的,而是存放于HTTP响应头;当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置。 自此,客户端再向服务器发送请求的时候,都会把相应的cookie存放在HTTP请求头再次发回至服务器。服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。网站的登录界面中“请记住我”这样的选项,就是通过cookie实现的。

简单的总结一下就是:

  • 某个用户通过浏览器访问某个网络服务器时,服务器在回复这个请求时,将cookie信息存放于响应头中
  • 浏览器得到该响应获取其中的cookie数据,并保存在浏览器中
  • 下次该用户再次通过这个浏览器访问这个服务器时,浏览器将自动携带cookie数据发送给服务器

4.什么是session

首先浏览器请求服务器访问web站点时,服务器首先会检查这个客户端请求是否已经包含了一个session标识、称为SESSIONID,如果已经包含了一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用,如果客户端请求不包含session id,则服务器为此客户端创建一个session,并且生成一个与此session相关联的独一无二的sessionid存放到cookie中,这个sessionid将在本次响应中返回到客户端保存,这样在交互的过程中,浏览器端每次请求时,都会带着这个sessionid,服务器根据这个sessionid就可以找得到对应的session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。

5.对称加密和非对称加密

对称加密:通信双方使用相同的密钥进行加密。特点是加密速度快,但是缺点是密钥泄露会导致密文数据被破解。常见的对称加密有AESDES算法

非对称加密:它需要生成两个密钥,公钥和私钥。公钥是公开的,任何人都可以获得,而私钥是私人保管的。公钥负责加密,私钥负责解密;或者私钥负责加密,公钥负责解密。这种加密算法安全性更高,但是计算量相比对称加密大很多,加密和解密都很慢。常见的非对称算法RSADSA

  • 对称加密加密与解密使用的是同样的密钥,所以速度快,但由于需要将密钥在网络传输,所以安全性不高。

  • 非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢。

  • 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

6.HTTP协议特点

  • HTTP允许传输任意类型的数据。传输的类型由Content-Type加以标记。

  • HTTP1.0是无状态。对于客户端每次发送的请求,服务器都认为是一个新的请求,上一次会话和下一次会话之间没有联系。

  • 支持客户端/服务器模式

  • 协议本身是无连接的,虽然在传输层使用了面向连接的TCP协议(保证了数据的可靠传输)。

7.HTTP报文

  • 请求报文:由请求行,请求头,请求体组成

    • 请求行:包括请求方法,访问的资源URL,使用的HTTP版本。GETPOST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE

      image-20220224204739389

    • 请求头:格式为“属性名:属性值”,服务端根据请求头获取客户端的信息,主要有cookie、host、connection、accept-language、accept-encoding、user-agent

    • 请求体:用户的请求数据如用户名,密码等

      image-20220224203825440

  • 响应报文:响应行,响应头,响应体

    • 响应行:协议版本,状态码及状态描述

    • 响应头:响应头字段主要有connection、content-type、content-encoding、content-length、set-cookie、Last-Modified,、Cache-Control、Expires

    • 响应体,主要是返回的页面的内容

      image-20220224204438559

8.HTTP常用状态码

image-20220224204854833

9.POST和GET的区别

  • GET请求参数通过URL传递,POST的参数放在请求体中。

  • GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把请求头和请求体一并发送出去;而对于POST,浏览器先发送请求头,服务器响应100 continue,浏览器再发送请求体。

  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置。

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

10.HTTP长连接和短连接

HTTP1.0默认使用的是短连接。浏览器和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。

HTTP/1.1起,默认使用长连接。要使用长连接,客户端和服务器的HTTP首部的Connection都要设置为keep-alive,才能支持长连接。

HTTP长连接,指的是复用TCP连接。多个HTTP请求可以复用同一个TCP连接,这就节省了TCP连接建立和断开的消耗。

11.HTTP1.0和2.0的区别

  • 新的二进制格式:HTTP1.1 基于文本格式传输数据;HTTP2.0采用二进制格式传输数据,解析更高效。

  • 多路复用:在一个连接里,允许同时发送多个请求或响应,并且这些请求或响应能够并行的传输而不被阻塞,避免 HTTP1.1 出现的”队头堵塞”问题。

  • 头部压缩,HTTP1.1的header带有大量信息,而且每次都要重复发送;HTTP2.0 把header从数据中分离,并封装成头帧和数据帧,使用特定算法压缩头帧,有效减少头信息大小。并且HTTP2.0在客户端和服务器端记录了之前发送的键值对,对于相同的数据,不会重复发送。比如请求a发送了所有的头信息字段,请求b则只需要发送差异数据,这样可以减少冗余数据,降低开销。

  • 服务端推送:HTTP2.0允许服务器向客户端推送资源,无需客户端发送请求到服务器获取。

12.HTTP和HTTPS的区别

  • HTTP是超文本传输协议,信息是明文传输;HTTPS则是具有安全性的ssl加密传输协议。

  • HTTP和HTTPS用的端口不一样,HTTP端口是80,HTTPS是443。

  • HTTPS协议需要到CA机构申请数字证书,一般需要一定的费用。

  • HTTP运行在TCP协议之上;HTTPS运行在SSL协议之上,SSL运行在TCP协议之上

13.什么是HTTPS所用到的数字证书

服务端可以向证书颁发机构CA申请证书,以避免中间人攻击(防止证书被篡改)。证书包含三部分内容:证书内容、证书签名算法和签名,签名是为了验证身份。服务端把证书传输给浏览器,浏览器从证书里取公钥。证书可以证明该公钥对应本网站

14.数字签名的制作过程

  • CA机构使用证书签名算法对证书内容进行hash运算

  • 对hash后的值用CA的私钥加密,得到数字签名。

15.浏览器验证数字证书有效的过程

  • 获取证书,得到证书内容、证书签名算法和数字签名。

  • 用CA机构的公钥对数字签名解密(由于是浏览器信任的机构,所以浏览器会保存它的公钥)。

  • 用证书里的签名算法对证书内容进行hash运算

  • 比较解密后的数字签名和对证书内容做hash运算后得到的哈希值,相等则表明证书可信。

16.HTTPS的原理

整体流程:首先是TCP三次握手,然后客户端发起一个HTTPS连接建立请求(TCP先建立连接),客户端先发一个Client Hello的包,然后服务端响应Server Hello,接着再给客户端发送它的证书,然后双方经过密钥交换,最后使用交换的密钥加解密数据。

  • 客户端发送Client Hello来协商加密的算法

    Client Hello里面客户端会告知服务端自己当前的一些信息,包括客户端要使用的TLS版本,支持的加密算法要访问的域名,给服务端生成的一个随机数(Nonce)等。需要提前告知服务器想要访问的域名以便服务器发送相应的域名的证书过来。TLS(安全传输层协议):为两个通信应用程序之间提供保密性和数据完整性,在SSL的协议上改进来的。

    image-20220224214617255

  • 服务端响应Server Hello,告诉客户端服务端选中的加密算法

    image-20220224214805698

  • 接着服务端给客户端发来了2个证书。第二个证书是第一个证书的签发机构(CA)的证书

    image-20220224214850400

  • 客户端使用证书的认证机构CA公开发布的RSA公钥对该证书进行验证

  • 验证通过之后,浏览器和服务器通过密钥交换算法产生共享的对称密钥

    注意这里服务端将对称秘钥传给客户端是先进行非对称加密的,结合了对称加密和非对称加密两种方式。

    image-20220224220705714

    image-20220224215140989

  • 开始传输数据,使用同一个对称密钥来加解密

    image-20220224215437879

六.参考链接

  1. 计算机网络面试题总结_笔经面经_牛客网 (nowcoder.com)
posted @   rain-1227  阅读(371)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示