最新要闻
- 热消息:不愧最强AM5主板!技嘉X670E AORUS XTREME游戏测试:独门绝技降低内存延迟、提升带宽
- 每日热议!长城山海炮劲敌:国产福特中型皮卡Ranger谍照曝光
- 天天亮点!情何以堪:男性美甲风暴正席卷全球
- 今日热搜:荣耀声纹新专利公布:戴口罩依旧能让设备“听懂”
- 【世界播资讯】三星新款Flex Hybrid OLED屏幕曝光:折叠滑动二合一
- 【环球速看料】首架国产自主宽带卫星空地互联飞机试飞成功:下载200Mbps
- 全球今日报丨美国液化天然气出口量急速飙升:已与卡塔尔并列世界第一
- 新消息丨2022年中国铁路发送旅客16.1亿人次 全国1、2、3小时高铁出行圈加速形成
- 即将备战新主机!《塞尔达传说:王国之泪》或是Switch最后第一方大作
- 天天看点:一年发射61次火箭 马斯克的SpaceX公司更值钱了
- 环球快讯:大巴司机开车不踩刹车漂移下山 乘客吓坏:我要下车
- 【天天热闻】OPPO推ColorOS for Pad全新控制中心:多设备管理一站式完成
- 世界热门:超标电动自行车过渡期能否延期?一地官方回应了
- 泥潭翻身 AMD x86市场份额逼近40%:重回19年前
- 全球观速讯丨小米品牌安全“贴心”分享案例:违法翻新倒卖小米电视后果很严重
- 【全球独家】13代酷睿/Zen4都靠边!AMD神U锐龙7 5800X3D卖爆 销量冠军不买能行?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
[Computer Networks]一个http请求的完成的全过程
摘要
本文主要讲述了一个 http request 请求从发出到收到 response 的整个生命周期,希望可以通过对整个流程的一个描述来梳理清楚五层网络协议的定义以及各层之间是如何协作的。
(资料图片)
使用Golang发起一个HTTP请求
对于后端来说通过 http 请求来进行远程调用是再寻常不过的事了,以 Golang 的 resty包为例,我们通过下面这个语句来发起一个请求并获得所请求的服务器的 response,简单起见这里我们使用 GET 方法进行请求:
client := resty.New()headers := map[string]string{"Connection": "Keep-Alive",}resp1, _ := client.R().EnableTrace().SetHeaders(headers).Get("https://httpbin.org/get")fmt.Println("Request Trace Info:")ti := resp1.Request.TraceInfo()fmt.Println(" DNSLookup :", ti.DNSLookup)fmt.Println(" TCPConnTime :", ti.TCPConnTime)fmt.Println(" TLSHandshake :", ti.TLSHandshake)fmt.Println(" IsConnReused :", ti.IsConnReused)fmt.Println(" RemoteAddr :", ti.RemoteAddr.String())我们在应用层发起请求,应用层是用户的,所以 HTTP 报文的内容都是一些人类可阅读的 ASCII 码点,但计算机只懂得二进制,光纤中认识光信号,所以这个 HTTP 报文还需要经过一一些处理才能穿越那些物理链路发送到我们的目的服务器上。首先来讲讲 HTTP 报文格式
在我们这个例子里我们的请求方法是 GET,GET 和 POST 是最常见的 HTTP 方法,除此以外还包括 DELETE、HEAD、OPTIONS、PUT、TRACE。我们没有传头部字段,也就是 HEADER , HTTP 的头部可以分为两种,一种是通用头部如 Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via 等,可以通过它传递一些信息,对通用头部的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头部,一般将会作为实体头部处理。实体头域包含关于实体的原信息,实体头包括 Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header 允许客户端定义新的实体头,但是这些域可能无法为接受方识别。在这个请求里我们也没有消息体,URL为 https://httpbin.org/get, 是一个很简单的 GET 请求。http 响应报文结构和请求差不多,区别在于状态行,状态码(Status-Code)主要用于机器理解,短语(Reason-Phrase)Status-Code 提供一个简单的文本描述,主要帮助用户理解:
- 1xx : 信息响应类,表示接收到请求并且继续处理
- 2xx : 处理成功响应类,表示动作被成功接收、理解和接受
- 3xx : 重定向响应类,为了完成指定的动作,必须接受进一步处理
- 4xx : 客户端错误,客户请求包含语法错误或者是不能正确执行
- 5xx : 服务端错误,服务器不能正确执行一个正确的请求
几个常见的状态码和短语:
- 200 OK最好的情况,即处理成功
- 404 Not Found不希望看到的响应之一,即找不到所请求的资源
- 500 Internal Server Error不希望看到的响应之二,服务端发生了错误
说完了 HTTP 报文,接下来我们来实践一下,看看上面那段代码发起一个 HTTP 请求,它的运行结果如下:
可以看到我们这个请求是成功了的,对方服务器返回了 200, 短语是 OK,意味着目标服务器成功处理了我们的请求。输出的Request Trace Info信息可以帮助我们理解整个请求的过程,我们一行一行地看:
DNSLookup
HTTP 报文里包含了目的服务器的地址,也就是我们上面输入的 URL,一个 URL 由协议头(HTTP、HTTPS、SFTP 等)+ 域名 + 资源路径组成,在我们这个例子里协议头为https(HTTPS = HTTP + SSL(TLS),它和 HTTP 的区别在于加了一道身份验证所以更安全),域名是 httpbin.org ,资源路径是 /get,也就是我们以 HTTPS 协议所约定的方式去获取 httpbin.org 所映射的服务器上的 /get 路径下的资源。域名由字符串组成,机器是无法读懂的,所以我们需要一个服务去将它解析成机器能读懂的地址,也就是 IP,而这个服务就是 DNS(Domain Name System)域名系统,它是用于实现域名和IP地址相互映射的一个分布式数据库,这里输出的 DNSLookup的值就是本次请求里花费在 DNS解析上的时间。域名解析的过程大致如下:完整的DNS解析过程有以下几个步骤:(1)查看浏览器缓存(我们这里是直接通过后端来发起请求,所以没有这一步)当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的 IP地址(若曾经访问过该域名且没有清空缓存便存在)。(2)查看系统缓存当浏览器缓存中无域名对应 IP则会自动检查用户计算机系统 Hosts文件 DNS缓存是否有该域名对应 IP。(3)查看路由器缓存当浏览器及系统缓存中均无域名对应 IP则进入路由器缓存中检查,以上三步均为客服端的 DNS缓存。(4)查看ISP DNS 缓存当在用户客服端查找不到域名对应 IP地址,则将进入 ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的 DNS缓存服务器中进行查找。(5)询问根域名服务器当以上均未完成,则进入根服务器进行查询。全球仅有 13 台根域名服务器,1 个主根域名服务器,其余 12 为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com、.cn等)服务器 IP告诉本地 DNS服务器。(6)询问顶级域名服务器顶级域名服务器收到请求后查看区域文件记录,若无记录则将其管辖范围内权威域名服务器的 IP地址告诉本地 DNS服务器。(7)询问权威域名(主域名)服务器权威域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确记录。(8)保存结果至缓存本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个 IP地址即可访问目标Web服务器。至此,DNS递归查询的整个过程结束。通过域名解析服务我们获得了目标服务器的 IP,它会在网络层被用到。
TCPConnTime
建立 TCP(Transmission Control Protocol) 连接所花的时间。TCP 属于传输层协议,除了 TCP外还有 UDP也是常用的传输层协议。本文的传输层协议选择了 TCP, 我们在应用层准备好了 HTTP报文,然后选择一个 TCP server去传输这个 HTTP报文给目标服务器,TCP server通过什么方式进行与目标服务器的沟通对于应用层来说是透明的(即不可见),应用层只需要等待 TCP server返回的目标服务器的应答结果就好了。TCP 是面向连接的协议,而 UDP 是无连接的,使用 TCP 进行通信的双方在互相发送消息之前要先建立一个连接,这个连接建立的过程被称为三次握手。我们先来看看 TCP 报文格式:端口(port),主要分为物理端口和逻辑端口。我们一般说的都是逻辑端口,用于区分不同的服务。因为网络中一台主机只有一个 IP,但是一个主机可以提供多个服务,端口号就用于区分一个主机上的不同服务。一个IP地址的端口通过16bit进行编号,最多可以有65536个端口,标识是从0~65535。端口号分为系统端口(System Ports)0~ 1023、用户端口(User Ports)1024~ 49151和动态端口号(Dynamic Ports)49152~65535。我们自己的服务一般都绑定在注册端口上。系统端口(0~ 1023):也叫做公认端口(Well Known Ports),它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。任何TCP/IP实现所提供的服务都用0-1023之间的端口号。我们的私用端口号不应该使用这个区间内的端口,除非你向IANA注册了。例如:80端口实际上总是 http 通讯、443对应着 https(在本文中我们使用的就是 https 协议,在最后一行输出的 RemoteAddr 可以看到目标服务器的端口号就是443)、21对应着 ftp,25对应着 smtp,110对应着 pop3 等。
互联网号码分配局(英语:Internet Assigned Numbers Authority,缩写 IANA),是一家互联网地址指派机构,管理国际互联网中使用的 IP 地址、域名和许多其它参数的机构。 IP 地址、自治系统成员以及许多顶级和二级域名分配的日常职责由国际互联网注册中心(IR)和地区注册中心承担。IANA 是由 ICANN 管理的。
用户端口(1024~ 49151):也叫做注册端口(Registered Ports),从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。动态端口(49152~65535):也叫做私有或动态端口(Private or Ephemeral Ports),从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如 49152 端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。所以当 client准备发出网络请求的时候,client所在的进程首先要向系统申请一个端口号作为源端口号,系统会随机从49152~65535中分配一个可用的端口号给这进程,这样当目标服务器处理完请求要给我们返回数据的时候才能通过这个源端口号找到发出请求的这个端口所对应的服务并把 response 交给这个服务。可以说 HTTP报文是面向服务的,它是服务与服务之间的交流,传输层是面向进程的,两个端口号标识了两个进程,一个进程里可能会有许多个服务(路由,或者说 API)。
序列号
在一个 TCP连接中传送的字节流中的每一个字节都按顺序编号,这个编号就类似于数组的下标,数组里每个元素都有自己的下标。例如,一报文段的序号是 101,共有 100 字节的数据。这就表明:本报文段的数据的第一个字节的序号是 101,最后一个字节的序号是 200。显然,下一个报文段的数据序号应当从 201 开始,即下一个报文段的序号字段值应为 201。
确认号
期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 N,则表明:到序号 N-1为止的所有数据都已正确收到。
标志位字段
比较常见的标志位 SYN、ACK、FIN会在 TCP连接建立与释放的时候使用到,也就是我们常说的三次握手四次挥手。先讲讲三次握手建立连接:
三次握手的过程如图所示,连接的建立一般都是由客户端主动发起的,客户端发送一个报文给服务器,告诉它我想要和你建立一个连接进行数据交换,进行数据交换之前有些事情需要先同步(synchronize,也就是 SYN标志位,SYN=1 表示这是一个用于同步信息的报文),双方得约定好初始序列号(Init Sequense Number,ISN)、窗口大小等信息,连接建立好了之后交换数据的时候才好判断数据的起始与结束,通过 seq 字段来告诉对方本报文的序列号。第一次握手,SYN= 1,客户端告诉服务器自己的初始序列号是 x (seq = x),服务器收到了这个报文可以确定客户端发送正常,自己接收正常。第二次握手,服务器端发出报文 SYN= 1, ACK= 1(仅当 ACK=1 时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1),表示这是一个应答报文,并且告诉了客户端自己的初始序列号是 y (seq= y),以及确认自己收到了客户端的前 x 个字节的信息,接下来希望收到 x + 1 的信息(ack= x + 1),但是客户端刚刚的报文明明没有携带信息,为什么说收到了前 x 个字节的信息呢,因为 TCP 规定,SYN报文段(SYN= 1 的报文段)不能携带数据,但需要消耗掉一个序号。第二次握手成功之后客户端确认了自己发送正常,接收正常,服务器发送正常,接收正常。服务器端确认了客户端发送正常,自己接收正常,所以还需要第三次握手来让服务器端确认自己发送正常以及客户端接收正常。第三次握手,双方已经同步完序列号信息了,所以第三次握手不用 SYN标志位了,客户端应答(ACK= 1)服务器第二次握手时发来的报文,表示自己收到了服务器端的前 y 个字节的信息(ACK= y + 1),告诉服务器端自己这个报文的起始序号是 x + 1(seq= x + 1),当服务器收到这个报文后服务器就可以确认自己发送正常以及客户端接收正常了,连接就建立完成了可以进行信息传输了。如果第三次握手的报文因为各种各样的原因丢了,服务器端没有收到,那么服务器就会进行首次重传,若等待一段时间仍未收到客户确认包,就进行第二次重传。如果重传次数超过系统规定的最大重传次数,则系统将该连接信息从半连接队列中删除。每次重传等待的时间不一定相同,一般会是指数增长。说完了三次握手建立连接再来说说四次挥手断开连接:四次挥手的过程如图所示。第一次挥手,客户端发出一个 FIN报文,消耗一个序列号,告诉服务器端自己没有要发送的数据了,连接可以断开了。第二次挥手,服务器端服务器端发送一个 ACK报文表示收到了客户端要断开连接的报文(ACK= 1, ack= u + 1),序号 u 之前的数据都以及收到了。此时连接进入半关闭状态,但是服务器端可能还有数据没有发完,所以可以继续发送数据,直到服务器端发完了要发的数据,发送第三次挥手的报文。第三次挥手,服务器端发送 FIN报文,消耗一个序列号(seq= w),告诉客户端自己的数据也发完了,因为前面是服务器端单向发数据给客户端,所以 ack还是为 u + 1。第四次挥手,客户端收到了服务器端要断开连接的报文,回复一个 ACK报文,让服务器端知道自己收到了它的 FIN报文,服务器端收到报文后立马断开了连接。
首部长度
也叫做数据偏移,它指出 TCP报文段的数据起始处距离 TCP报文段的起始处有多远,也就是 TCP报文段的首部长度。
窗口大小
报文能不能正常被传输、接收,不止取决于通信的双方,还取决于外部环境,也就是网络环境,因为网络链路里不止当前的通信双方在传输数据,而是由很多台在发送数据的主机在共同使用。所以数据要正常被传输,有两个问题要解决,一个是发送方与接收方速率匹配,接收方能及时处理发送方发送过来的数据,使得发送双方速率匹配的策略我们称为流量控制;另一个就是需要有一个良好的网络环境,努力使整体网络环境的通畅的策略我们称为拥塞控制。流量控制与拥塞控制都是通过设置窗口大小来完成的,当然这两个概念都是针对 TCP协议来说的,它是一个无私的协议,UDP可不管网络是否拥塞,它会一直发向网络中发送数据。在介绍确认号这个首部字段的时候我们提到了 TCP采用的是累积确认的方式,下面我们来具体讲解是怎么个累积确认法。引入累积确认主要是为了提高通信效率,如果没有累积确认的话,接收方收到一个报文之后回复一个 ACK报文,发送方接到这个 ACK报文才能发送下一个报文,一包一确认的方式并不是很高明,往返时间越长,通信的效率就越低。而使用累积确认,发送方就可以连续发送一批报文,而不需要等待接收方回复了再发送下一个包。
虽然发送方可以一次性发一批报文,但是这个批大小肯定不能是无限大的,得有个规则来约束它,这个大小就是窗口大小。窗口大小以字节为单位,比如当前窗口大小为1024个字节,那么在不需要等待接收方确认的情况下发送发可以连续发送报文直到已发送的报文的长度加起来等于1024个字节。流量控制:流量控制的过程就是通过不断的调整窗口大小来给让接收方能来得及处理接收到的数据,所以窗口大小是由接收方决定的。在三次握手建立 TCP连接的时候就已经同步好了窗口大小的信息,并且如果在后续的数据传输中因为种种原因需要调整窗口大小也是允许的拥塞控制:引入拥塞控制这个概念后窗口大小就受到流量控制和拥塞控制这两个策略共同影响了,通过拥塞控制算法算出拥塞窗口cwnd的大小,实际窗口大小 = min(cwnd,rwnd)rwnd就是流量控制中的接收窗口。拥塞窗口cwnd变化的规则:
- 只要网络中没有出现拥塞,
cwnd就会增大; - 一但网络中出现了拥塞,
cwnd就减少;
只要「发送方」没有在规定时间内接收到 ACK应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。拥塞控制主要是四个算法:
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复
关于窗口大小的更多细节可以看看这篇博客
校验和
数据段
segment data,这里放着 HTTP请求报文,像这样:(图片来自这篇博客)
RemoteAddr
这个远端地址包括了目标服务器的 IP和端口号, 端口号在上文我们已经说过了,它会被写在 TCP报文里,而 IP 则会被写在网络层的 IP数据报里。应用层通过 DNS服务获得了 IP,然后通过函数调用传参的方式来把这个 IP传给实现了传输层协议的 server,当然传输层的的报文里并不需要用到 IP,但是域名是属于应用层的东西,如果没有在应用层完成解析获得 IP,后面的层因为没有域名信息就无法获得 IP无法正常工作了,所以 IP 从应用层通过参数传递的方式传给传输层,传输层再通过参数传递的方式传给真正需要用到它的网络层,让网络层写进它自己的报文里。Golang 的 net包的 net.LookupHost()函数可以完成域名解析获得 IP,对 DNS解析的过程有兴趣的朋友可以看看这篇博客。我们先来看看 IP数据报的结构:
就像 TCP报文的数据段应用层报文一样,IP数据报的数据部分指的就是传输层报文,在本文里就是 TCP报文,如下图所示:
IsConnReused
连接是否复用,说到这个话题又回到了应用层的 HTTP协议,前面我们说到 HTTP报文有各种各样的 HEADER字段,其中有一个叫做Connection的通用 header,它的的取值为Keep-Alive或close。当在 header 里加入Connection: Keep-Alive意味着开启长连接,我们把上面例子里的代码进行一些小小修改,变成这样:
client := resty.New()headers := map[string]string{"Connection": "Keep-Alive",}resp1, _ := client.R().EnableTrace().SetHeaders(headers).Get("https://httpbin.org/get")// Explore trace infofmt.Println("Request Trace Info:")ti := resp1.Request.TraceInfo()fmt.Println(" DNSLookup :", ti.DNSLookup)fmt.Println(" TCPConnTime :", ti.TCPConnTime)fmt.Println(" TLSHandshake :", ti.TLSHandshake)fmt.Println(" IsConnReused :", ti.IsConnReused)fmt.Println(" RemoteAddr :", ti.RemoteAddr.String())’resp2, _ := client.R().EnableTrace().SetHeaders(headers).Get("https://httpbin.org/get")fmt.Println()fmt.Println("******** Request with Keep-Alive *******")fmt.Println()cname, _ := net.LookupCNAME("httpbin.org")host, _ := net.LookupHost("httpbin.org")addr, _ := net.LookupAddr("httpbin.org")ip, _ := net.LookupIP("httpbin.org")fmt.Println(cname)fmt.Println(host)fmt.Println(addr)fmt.Println(ip)// Explore trace infofmt.Println("Request Trace Info:")ti2 := resp2.Request.TraceInfo()fmt.Println(" DNSLookup :", ti2.DNSLookup)fmt.Println(" TCPConnTime :", ti2.TCPConnTime)fmt.Println(" TLSHandshake :", ti2.TLSHandshake)fmt.Println(" IsConnReused :", ti2.IsConnReused)fmt.Println(" RemoteAddr :", ti2.RemoteAddr.String())这次我们主要想看看 Keep-Alive 的实际效果,所以一些没啥用的信息就不输出了,这段代码的运行效果如下:
可以看到在第二次请求的时候 DNSLookup、TCPConnTime、TLSHandshake 这三个与连接建立有关的时间花费都变成了0啦!IsConnReused 也由 false 变成了 true,说明这次的连接是复用的第一次请求的时候建立的连接,所以不需要再重新建立连接,那些与连接建立的时间花费自然也变成零了(从图上可以看出来节省了大约2.5s 的时间)。关于长连接有兴趣的朋友可以看看这篇博客
总结
实践很重要,上学的时候学计网总觉得是一知半解的,书上说分层协作各层解耦,层与层之间是透明的,也就是互相看不见,
-
[Computer Networks]一个http请求的完成的全过程
摘要本文主要讲述了一个httprequest请求从发出到收到response的整个生命周期,希望可以通过对整个流程的...
来源: -
热消息:不愧最强AM5主板!技嘉X670E AORUS XTREME游戏测试:独门绝技降低内存延迟、提升带宽
不愧最强AM5主板!技嘉X670EAORUSXTREME游戏测试:独门绝技降低内存延迟、提升带宽
来源: -
-
头条焦点:使用SIPp进行压力测试
本文更新于2022-05-14,使用SIPpv3 5 3。官网:http: sipp sourceforge net 。中文文档:http: sipp sourceforge net doc
来源: [Computer Networks]一个http请求的完成的全过程
热消息:不愧最强AM5主板!技嘉X670E AORUS XTREME游戏测试:独门绝技降低内存延迟、提升带宽
Typora-博客园
头条焦点:使用SIPp进行压力测试
观焦点:【插入排序】详细讲解
每日热议!长城山海炮劲敌:国产福特中型皮卡Ranger谍照曝光
天天亮点!情何以堪:男性美甲风暴正席卷全球
今日热搜:荣耀声纹新专利公布:戴口罩依旧能让设备“听懂”
【世界播资讯】三星新款Flex Hybrid OLED屏幕曝光:折叠滑动二合一
【环球速看料】首架国产自主宽带卫星空地互联飞机试飞成功:下载200Mbps
全球观焦点:[概率论与数理统计]笔记:
全球今日报丨美国液化天然气出口量急速飙升:已与卡塔尔并列世界第一
新消息丨2022年中国铁路发送旅客16.1亿人次 全国1、2、3小时高铁出行圈加速形成
即将备战新主机!《塞尔达传说:王国之泪》或是Switch最后第一方大作
天天看点:一年发射61次火箭 马斯克的SpaceX公司更值钱了
最新资讯:AIRIOT答疑第4期|如何使用数据分析引擎?
环球视点!喜讯 | 热烈祝贺方正璞华入选苏州工业园区总部企业服务机构库
环球快讯:大巴司机开车不踩刹车漂移下山 乘客吓坏:我要下车
【天天热闻】OPPO推ColorOS for Pad全新控制中心:多设备管理一站式完成
世界热门:超标电动自行车过渡期能否延期?一地官方回应了
泥潭翻身 AMD x86市场份额逼近40%:重回19年前
全球观速讯丨小米品牌安全“贴心”分享案例:违法翻新倒卖小米电视后果很严重
滚动:记录--短视频滑动播放在 H5 下的实现
[概率论与数理统计]笔记:1.5 事件的独立性
【全球独家】13代酷睿/Zen4都靠边!AMD神U锐龙7 5800X3D卖爆 销量冠军不买能行?
微头条丨中国空间站拍2023年第一缕阳光!如此美景 一天能看16次
当前动态:2023上班第一天:女孩开工前后5分钟“变脸” 网友直呼“这不就是我自己”
90年后归来!方正宣布推出汉文正楷电脑字库:用时6年大量优化
男子买下废弃学校翻新成住宅 每年可收368万租金
【播资讯】2. 向线程函数传递参数
浅谈研发实践的技术债与效能提升
前沿资讯!2022年全国电影总票房超300亿!《长津湖之水门桥》夺冠
接盘暴雪玩家 网易《无尽战区》下周重新开服:首发上线29位英雄
240W超级闪充要来!realme暗示新机充满电不到10分钟
为庆祝传统新年 阿根廷民众烧梅西雕像:当地习俗、已延续66年
当前时讯:Apple Watch Ultra一周上手:不适合普通用户
当前报道:Linux的串口非标准波特率设置更改
最新消息:Go语言实现包的初始化控制器与流程控制器
世界速递!如何站在开发者的角度理解框架的设计思想?
每日热门:文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
全球微资讯!python 中os和sys模块常用方法
与网易和好基无可能 魔兽关服倒计时:暴雪代理谈判进入第二阶段
120Hz自适应刷新0延迟:一加11成屏幕流畅体验天花板
环球速读:五月天版权回归网易云音乐 网友:糟糕的心情好了些
每日消息!俞敏洪给自己2022年打8分:没有欠员工一分钱工资
动态:4599元 雷军分享Redmi K60冠军版特写照:和跑车一样精致
世界视讯!什么是 A/B 实验,为什么要开 A/B 实验?
环球热文:IT 技术工作详解 -小马说工作
每日热文:SweetAlert让消息弹出窗口更加具有个性化!
Redmi K60素皮版本质感堪比手工!雷军:值得你细品
环球看热讯:健康速食!西安饭庄油泼biangbiang面大促:每盒6.66元
今日热门!罗永浩怎么看?西门子回应洗衣机10年包修为保证能修 洋品牌赤裸裸坑国人
Intel Unison正式上线:实现PC与安卓/iOS手机无缝连接
当前消息!你最想看哪个?2023春节档已官宣五部电影 《满江红》比拼《流浪地球2》
每日快看:建筑软件解决方案丨Bluebeam简介
头条:2022 倒带 - NutUI
环球简讯:面试官:为什么 wait/notify 必须与 synchronized 一起使用??
环球微头条丨销量甩Intel+Zen4全家!AMD神U锐龙7 5800X3D卖成年度处理器销冠
全球速递!等了7年!《大圣归来》导演新作《深海》定档 要做国漫里程碑、视觉突破极限
每日速看!10多万买“大路虎” 奇瑞旗舰SUV瑞虎9官图发布:霸气
全球要闻:最贵748元!苹果全系电池涨价 3月1日开始:非针对国人 成本增加所致
【焦点热闻】行驶中天窗可能会掉 奔驰再次召回超12万辆汽车
环球今日讯!诺氟沙星突然爆火!医生紧急提醒:未成年人禁用
每日速递:[概率论与数理统计]笔记:1.4 条件概率
全球消息!699元Redmi 12C开卖 员工:对比友商1500元线下机 竞争力也十足
天天要闻:2023年电动车在美国会更便宜 更多人买得起了!有4点原因
我国最大的固体运载火箭!力箭一号遥二开启总装测试:拟5月发射
故事老套且拖沓?不妨对《阿凡达2》宽容一点
《阿凡达2》票房达到回本线了:全球票房已突破14亿美元
商业网络安全解决方案丨Avast产品简介
时讯:Kubernetes监控手册05-监控Kubelet
袋鼠云产品功能更新报告03期丨产品体验全面优化,请查收!
对标苹果!三星推出27寸ViewFinity S9显示器:5K屏、全金属机身
当前报道:免费十年突然改版!游侠对战平台宣布每天只能免费一小时
焦点日报:价格下来了:东方基因快速检测试剂盒4.9元/份
天天微头条丨每5辆新车就有4辆电动车 挪威电动车市占率近80%全球第一高
灭菌独立装 袋鼠医生N95医用口罩30片45元大促
世界视点!从源代码构建TensorFlow流程记录
全球百事通!最大尺寸iPad被砍!曝苹果不打算在今年发14.1英寸iPad Pro
环球即时:比亚迪百万级越野车 仰望R1最新预告:首搭最具辨识度的尾灯
Firefox遭意外“误伤”:新版本被错误识别为IE 11
特斯拉全年销量破130万辆 还是全球纯电动车销冠
【全球快播报】如何不动声色的让身边的人知道你买RTX 4090了?
天天快讯:github上传本地代码到仓库教程
世界速看:联合三个国家尖端技术!38年后Intel重回老本行 让存储性能爆炸性提高
全球实时:西安高铁站私家车上站台接送乘客引争议:VIP贵宾服务 存在多年
2023年第一涨 国内油价今晚迎来调整 每升或上调0.2元
当前观点:你想成特斯拉车主吗?分析称Model 2快要来了 售价17万
世界热议:苹果中国工厂都要搬走?印度产iPhone加大 还要拿下iPad、Mac等
速看:AMD Zen4锐龙狂降价作用不大:德国电商销量不及Zen3五分之一
环球观察:抖音推出桌面端聊天软件抖音聊天:神似微信电脑版
天天百事通!微信支付之支付码支付
关注:学习Python第一个程序“Hello,World”
【新要闻】1.2 今天和对象吵架 但依旧学了代码
热文:谁说的不流畅?Steam玩家调查:Win11成香饽饽 NV四年前神卡1650领跑
新年暴击!超10家车企宣布涨价 特斯拉公开“唱反调”
三星将在CES 2023展示新款显示屏:折叠、滑动都支持
赚翻的节奏:美国超级百万彩票头奖升至54亿元 竟多次没人中奖
全球热门:女司机等红灯陌生男突然上车搭讪:拉车门坐到后排 被当场吓哭
环球关注:保研经历分享