计算机网络【java面试题】

2023-11-16

1、计算机网络中的七层模型以及每一层的作用?

在这里插入图片描述
在这里插入图片描述

OSI七层模型 功能 对应的网络协议
应用层 应用层是网络体系中最高的一层,也是唯一面向用户的一层,也可视为为用户提供常用的应用程序,每个网络应用都对应着不同的协议 HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层 主要负责数据格式的转换,确保一个系统的应用层发送的消息可以被另一个系统的应用层读取,编码转换,数据解析,管理数据的解密和加密,同时也对应用层的协议进行翻译 Telnet, Rlogin, SNMP, Gopher
会话层 负责网络中两节点的建立,在数据传输中维护计算机网络中两台计算机之间的通信连接,并决定何时终止通信 SMTP, DNS
传输层 是整个网络关键的部分,是实现两个用户进程间端到端的可靠通信,处理数据包的错误等传输问题。是向下通信服务最高层,向上用户功能最底层。即向网络层提供服务,向会话层提供独立于网络层的传送服务和可靠的透明数据传输。 TCP, UDP
网络层 进行逻辑地址寻址,实现不同网络之间的路径选择,IP就在网络层 IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层 物理地址(MAC地址),网络设备的唯一身份标识。建立逻辑连接、进行硬件地址寻址,相邻的两个设备间的互相通信 FDDI, Ethernet, Arpanet, PDN, SLIP, PPP,STP。HDLC,SDLC,帧中继
物理层 七层模型中的最底层,主要是物理介质传输媒介(网线或者是无线),在不同设备中传输比特,将0/1信号与电信号或者光信号互相转化 IEEE 802.1A, IEEE 802.2到IEEE 802

2、TCP、UDP、HTTP首部包括哪些字段

TCP首部包括固定的20个字节以及可变长的部分
UDP首部只有8个字节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、TCP三次握手

在这里插入图片描述

(1)第一次握手: Client 将标志位 SYN 置为 1, 随机产生一个值 seq=x, 并将该数据包发送给 Server,Client 进入 SYN_SENT 状态, 等待 Server 确认
(2)第二次握手: Server 收到数据包后由标志位 SYN=1 知道 Client 请求建立连接, Server 将标志位 SYN 和 ACK 都置为 1,ack=x+1, 随机产生一个值 seq=y, 并将该数据包发送给 Client 以确认连接请求, Server 进入 SYN_RCVD 状态
(3)第三次握手: Client 收到确认后, 检查 ack 是否为 x+1,ACK 是否为 1, 如果正确则将标志位 ACK 置为 1,ack=y+1, 并将该数据包发送给 Server,Server 检查 ack 是否为 y+1,ACK 是否为 1, 如果正确则连接建立成功, Client 和 Server 进入 ESTABLISHED 状态, 完成三次握手, 随后 Client 与 Server 之间可以开始传输数据了。

seq是序列号,这是为了连接以后传送数据用的,ack是对收到的数据包的确认,值是等待接收的数据包的序列号。在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。seq是数据包本身的序列号;ack是期望对方继续发送的那个数据包的序列号。

4、第三次握手的作用,为什么不是两次握手?(为了解决网络信道不可靠的问题)

最后一次握手是为了防止已失效的请求报文突然又传到服务器引起错误。
假设采用两次握手建立连接,客户端向服务器发送一个SYN包请求建立连接,因为某些未知的原因没有到达服务器,在某个网络节点产生了滞留,为了建立连接客户端会重发SYN包,这次的数据包正常送达,服务器回复SYN+ACK后建立了连接。但是第一包数据阻塞的网络节点突然恢复,第一包SYN包又送达到服务端,这次服务端会误认为客户端又发起了新的连接,从而在两次握手后进入了等待数据状态。这种情况多了,就可能会导致服务器瘫痪。【此时进入了死锁状态】服务器认为是两个连接,而客户端认为只有一个连接,造成了状态不一致。
如果是三次握手,服务端收不到最后的ACK包,自然就不会认为连接建立成功,所以三次握手本质上来说,就是为了解决网络信道不可靠的问题。

5、TCP四次挥手

在这里插入图片描述
理解版本:

建立一个 TCP 连接需要三次握手,而终止一个 TCP 连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这是由于 TCP 的半关闭(half-close)特性造成的,TCP 提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。TCP 连接的释放需要发送四个包(执行四个步骤),因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。

1)第一次挥手:客户端发送一个 FIN 报文(请求连接终止:FIN = 1),报文中会指定一个序列号 seq = u。并停止再发送数据,主动关闭 TCP 连接。此时客户端处于 FIN_WAIT1 状态,等待服务端的确认。

FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

2)第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。

CLOSE-WAIT - 等待从本地用户发来的连接中断请求;
此时的 TCP 处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待 2)状态,
等待服务端发出的连接释放报文段。
FIN-WAIT-2 - 从远程TCP等待连接中断请求;

3)第三次挥手:如果服务端也想断开连接了(没有要向客户端发出的数据),和客户端的第一次挥手一样,发送 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态,等待客户端的确认。

LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;

4)第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答(ack = w+1),且把服务端的序列值 +1 作为自己
ACK 报文的序号值(seq=u+1),此时客户端处于 TIME_WAIT(时间等待)状态。

TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;

记忆版本:

1)客户端向服务器发送FIN报文,TCP首部中的FIN比特被置位
2) 服务器收到FIN报文,回复ACK,进入close-wait状态。服务端同样发送FIN报文
3)客户端收到FIN,回复ACK,客户端进入time-wait状态,确保服务器能够收到自己发出的ACK
4)服务端收到ACK,连接关闭。

6、第四次挥手的TIME_WAIT需要等待一段时间才能关闭?(重发可能丢失的ACK报文)

回答1:注意 !!!这个时候由服务端到客户端的 TCP 连接并未释放掉,需要经过时间等待计时器设置的时间 2MSL(一个报文的来回时间)才会进入 CLOSED状态(这样做的目的是确保服务端收到自己的 ACK 报文。如果服务端在规定时间内没有收到客户端发来的 ACK报文的话,服务端会重新发送 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK报文给服端)。服务端收到 ACK 报文之后,就关闭连接了,处于 CLOSED 状态。可以看出,服务器结束连接要比客户端早。

回答2:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。

7、为什么需要四次挥手?

简单地说,是因为TCP是全双工模式,前两次挥手只是关闭了一个方向的数据通道,后两次挥手用于关闭另一个方向的数据通道。

8、TCP协议如何保证传输的可靠性?

什么是TCP

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议

校验和

发送方:发送数据之前计算校验和,并填充至TCP报文首部;接收方:收到数据后,计算检验和,与发送方的校验和比较是否一致,若不一致,则一定传输有误,若校验和一致,也不能说明传输一定成功。若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

序列号

1)根据序列号对失序数据包重排序;
2)丢弃重复数据:去掉重复序列号的数据;

应答机制

TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答,也就是发送ACK报文。这个确认不是立即发送,通常将推迟几分之一秒;

超时重传

当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

首先,发送方没有收到响应的ACK报文的原因有两点:
1、接收方没有收到数据;
2、接受方成功收到数据,但是发送的ACK报文丢失;

超时重传机制可以解决上述问题,简单理解就是发送数据后等待一段时间,到达预计时间后没有收到ACK报文就会对刚才发送的数据进行重新发送。如果是case1:那么接收方收到第二次重发的数据后,边进行ACK应答;如果是case2,接收方收到数据后发现数据已存在(根据序列号判断),那么直接丢弃,依然发送ACK确认报文;

连接管理

连接管理就是三次握手和四次挥手的过程,这是保证可靠性的前提;

流量控制:滑动窗口

TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP报文首部有一个窗口,实际上就是接收端接收数据缓冲区的大小。数字越大,证明接收端接收缓冲区的剩余空间越大;接收方收到数据后发送ACK时,会将窗口大小一并发送,发送方根据窗口大小改变发送数据的速度。如果窗口大小为0,那么久停止发送数据。并定期想接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。

拥塞控制:

在这里插入图片描述

慢启动

开始发送数据时,先发送少量数据探路,观察网络状态,在决定以多打的速度进行传输。这时引入一个拥塞窗口的概念,拥塞窗口初始值为1,每当接收到一个ACK,拥塞窗口就会翻倍,呈现指数级增长。
慢启动机制只是在开始的时候发送少量数据,但是增长速度很快,为了控制拥塞窗口的增长,不能使拥塞窗口单纯的翻倍,要设置一个拥塞窗口的阈值,将慢启动阈值设置为窗口的最大值。

拥塞避免

当拥塞窗口等于慢启动阈值时,就会启用拥塞避免算法。
乘法减小:当出现拥塞时,将慢启动阈值设置为原来的一半,然后将拥塞窗口初始化为1,执行慢启动算法。
加法增大:每经过一个往返时间RTT,拥塞窗口+1,让拥塞窗口缓慢增大,按照线性规律增长。

快重传【对超时重传的改进】

快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。
接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。

快恢复

1、当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。
2、此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。

9、如何使用UDP实现可靠传输?

UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

传输层无法保证数据的可靠传输,只能通过应用层来实现了。实现的方式可以参照tcp可靠性传输的方式,只是实现不在传输层,实现转移到了应用层。
实现确认机制、重传机制、窗口确认机制。
如果你不利用linux协议栈以及上层socket机制,自己通过抓包和发包的方式去实现可靠性传输,那么必须实现如下功能:
发送方:包的分片、包确认、包的重发
接收方:包的排序、包的序号确认
目前有如下开源程序利用udp实现了可靠的数据传输。分别为RUDP、RTP、UDT。

10、TCP和UDP的区别

在这里插入图片描述

11、HTTP的发展历程【HTTP0.9-HTTP3.0】

1、HTTP0.9 、HTTP1.0、HTTP1.1采用TCP协议,HTTP3.0采用UDP协议。
2、HTTP0.9、HTTP1.0在每次请求/响应都会创建一个TCP连接。
3、HTTP1.1采用持久连接方式,多个HTTP请求同时使用一个TCP连接。
4、HTTP2.0采用多路复用,客户端和服务器之间只建立一个TCP连接,多个HTTP帧混合在一起在一个TCP上面传送
5、HTTP3.0采用UDP协议,解决了队头阻塞问题。

12、HTTP的长连接和短连接

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议。底层使用TCP/UDP协议

短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
长连接:持久连接方式,多个HTTP请求同时使用一个TCP连接。当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
在这里插入图片描述

13、常见的HTTP请求状态码

HTTP状态码表示客户端HTTP请求的返回结果、标记服务器端的处理是否正常或者是出现的错误,能够根据返回的状态码判断请求是否得到正确的处理很重要。数字中的第一位指定了响应类别,后两位无分类,响应类别有一下5种:
在这里插入图片描述

2xx (3种)

200 OK:表示从客户端发送给服务器的请求被正常处理并返回;

204 No Content:表示客户端发送给客户端的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回);

206 Patial Content:表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容。

3xx (5种)

301 Moved Permanently:永久性重定向,表示请求的资源被分配了新的URL,之后应使用更改的URL;

302 Found:临时性重定向,表示请求的资源被分配了新的URL,希望本次访问使用新的URL;

   301与302的区别:前者是永久移动,后者是临时移动(之后可能还会更改URL)

303 See Other:表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源;

  302与303的区别:后者明确表示客户端应当采用GET方式获取资源

304 Not
Modified:表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是请求为满足条件的情况下返回改状态码;

307 Temporary
Redirect:临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况);

4xx (4种)

400 Bad Request:表示请求报文中存在语法错误;

401 Unauthorized:未经许可,需要通过HTTP认证;

403 Forbidden:服务器拒绝该次访问(访问权限出现问题)

404 Not Found:表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用;

5xx (2种)

500 Inter Server Error:表示服务器在执行请求时发生了错误,也有可能是web应用存在的bug或某些临时的错误时;

503 Server Unavailable:表示服务器暂时处于超负载或正在进行停机维护,无法处理请求;

14、列举几种常见的协议,并简述他们的作用。

1、DNS:域名解析协议:通过域名解析获得域名所对应的IP。端口号:53
2、FTP:文件传输协议:用户可通过客户机程序向远程主机上传文件;或从远程主机上下载文件。端口号:21;
3、HTTP:超文本传输协议:最初设计HTTP是为了提供一种发布和接受HTML页面的方法。所有WWW文件都必须遵守这个标准。端口号:80;
4、DHCP:动态主机配置协议:自动分配和管理IP
5、BGP:边界网关协议
6、SMTP:简单邮件传输协议,提供可靠且有效的电子邮件传输的协议。
7、HTTPS:基于安全套接字层的超文本传输协议。SSL/TSL+HTTP

15、HTTP和HTTPS的区别?

工作层:在OSI网络模型中,HTTP工作于应用层,而HTTPS工作在传输层。
连接端口:HTTP标准端口为80,而HTTPS标准端口为443。
传输方式:HTTP是超文本传输协议,信息是明文传输,而HTTPS是SSL加密传输协议。
工作耗时:HTTP耗时=TCP握手,而HTTPS耗时=TCP握手+SSL握手。
显示形式:HTTP的URL以http://开头,而HTTPS的URL以https://开头。
费用:HTTP无需费用,而HTTPS需要到CA申请证书,一般免费证书较少,需要一定费用。
安全性:HTTP的连接简单,是无状态的;而HTTPS是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

16、HTTPS的工作原理

前导知识:

1、SSL/TLS

SSL 是洋文“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的基础设施——比如“CSS 样式表”和“JS 脚本”)为啥要发明 SSL 这个协议捏?因为原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。

工作原理

HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。
1.客户端向服务器发起HTTPS请求,连接到服务器的443端口
2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
3.服务器将自己的公钥发送给客户端。
4.客户端收到服务器端的证书之后,会对证书进行检查,验证其合法性,如果发现发现证书有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性,下文会进行说明。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
7.然后服务器将加密后的密文发送给客户端。
8.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
在这里插入图片描述

17、cookie 和session 有什么区别?

在这里插入图片描述
在这里插入图片描述

18、ARP的工作原理

网络层的ARP协议完成了IP地址与物理地址的映射。首先,每台主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址:如果有,就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

19、POST与GET请求的区别

在这里插入图片描述

20、在浏览器中输入http://www.baidu.com后执行的全部过程

(1).整个流程步骤:
在这里插入图片描述
(2)域名解析过程:
在这里插入图片描述

应用层

浏览器对输入的url进行分析(协议、是IP还是域名、端口、参数);
然后应用DNS对域名进行解析,获取对应的IP地址【通过DNS域名服务器】;
浏览器构造一个HTTP报文,然后向服务器发送请求;

补充:应用层写入数据,表示层进行格式化编码,会话层标记发送顺序。

传输层

将应用层数据作为Tcp报文段的数据部分,为了保证数据传输的可靠性,要对索要传输的数据添加TCP首部;通过TCP协议进行传输;
通过三次握手建立TCP连接;

网络层

TCP报文段被封装为IP数据报进行传输;
IP地址通过ARP协议解析出MAC地址,再去访问目的主机的MAC地址。

数据链路层

找到对方的MAC地址后,就将数据封装成帧,然后交付给物理层,物理层通过实际的电路进行传输。

服务器端

接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在传输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文。
查找客户端请求的资源,并返回响应报文。

客户端

拿到响应报文,浏览器进行解析,将页面显示给用户

21、域名解析DNS服务器

  • 客户机提出域名解析请求,并将该请求发送给本地域名服务器。

  • 当本地域名服务器收到请求后,就先查询本地缓存,如果该纪录项,则本地域名服务器就直接把查询结果返回。 【查询本地缓存】

  • 如果本地缓存中没该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根子域)主域名服务器地址。【请求根域名服务器】

  • 本地服务器再向一步返回域名服务器发送请求,然后接受请求服务器查询自己缓存,如果没该纪录,则返回相关下级域名服务器地址。【查询根域名服务器的下级域名服务器】

  • 重复第四步,直到找到正确纪录。

  • 本地域名服务器把返回结果保存到缓存,以备下一次使用,同时还将结果返回给客户。

22、HTTP的头部阻塞和解决

队头阻塞

  • 由于HTTP1.0规定下一个请求必须在前一个请求响应到达之后才能发送。假设前一个请求响应一直不到达(网络原因导致迟到或者丢失、服务器崩盘等原因),那么下一个请求就不发送,同样的后面的请求也给阻塞了。

  • 于是http1.1提出了管线化(pipelining)技术,就是一次性发送多个request请求。然而pipelining在接收response返回时,也必须依顺序接收,如果前一个请求遇到了阻塞,后面的请求即使已经处理完毕了,仍然需要等待阻塞的请求处理完毕。这种情况队头阻塞,第一个请求阻塞后,后面的请求都需要等待。

  • 为了解决上述阻塞问题,http2中提出了多路复用(Multiplexing)技术,就是将多个请求复用同一个tcp链接中,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。也就是将每个request-response拆分为了细小的二进制帧Frame,这样即使一个请求被阻塞了,也不会影响其他请求。

23、URL、URI、URN

  • (1)URI:Uniform Resource Identifier,统一资源标识符;

由三部分组成:
①访问资源的命名机制;
②存放资源的主机名;
③资源自身的名称,由路径表示。

  • URL:Uniform Resource Locator,统一资源定位符;

由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。

URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作用就是解析。相反的是,URL类可以打开一个到达资源的流。

  • (2)URN:Uniform Resource Name,统一资源名称,URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
  • (3)三者关系
    在这里插入图片描述
    举例

URI:http://bitpoetry.io/posts/hello.html#intro http:// 是定义如何访问资源的方式。
bitpoetry.io/posts/hello.html 是资源存放的位置
#intro 是资源。 URL是URI的一个子集,告诉我们访问网络位置的方式。
URL应该如下所示: http://bitpoetry.io/posts/hello.html
URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式,如下所示:
bitpoetry.io/posts/hello.html#intro

URI身份证号 URL 住址协议://地球/中国/浙江省/杭州市/西湖区/525号/张三.
不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络【java面试题】 的相关文章

  • Math.random() 解释

    这是一个非常简单的 Java 尽管可能适用于所有编程 问题 Math random 返回 0 到 1 之间的数字 如果我想返回零到百之间的整数 我会这样做 int Math floor Math random 101 在一到一百之间 我会这
  • 如何使用 Java 以独立于平台的方式读取 Windows 共享驱动器?

    如何使用 Java 从 Windows 共享驱动器中读取数据 以便执行读取的 Java 代码可以在任何平台上同样正确地运行 您可以使用JCIFS http jcifs samba org 使用纯 Java 代码访问 SMB CIFS 共享
  • 我们可以在java中放弃已经签名的jar吗?

    I ve a jar文件具有旧签名 并希望使用新签名重新签名 是否可以 如果可能的话 怎么做 如果签名不是您拥有的 您需要先解压 jar 像这样 假设是unix 否则翻译成dos jar xvf JarName jar rm rf META
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • 枚举内的枚举

    这不是我被卡住的问题 而是我正在寻找一种简洁的方式来编写我的代码 本质上 我正在编写一个事件驱动的应用程序 用户触发事件 事件被发送到适当的对象 然后对象处理事件 现在我正在编写偶数处理程序方法 我希望使用 switch 语句来确定如何处理
  • Logback 配置在单行上有异常吗?

    我的日志被提取 传输并合并到 elasticsearch 中 多行事件很难跟踪和诊断 有没有办法使用收集器和正则表达式将异常行分组到单个记录中登录配置 https logback qos ch manual layouts html xTh
  • 在Java中读取制表符分隔的文件

    我有以下代码来读取 Java 中的制表符分隔文件 while str in readLine null if str trim length 0 continue String values str split t System out p
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • 在仔细锁定但不受信任的代码上使用 Thread.stop()

    我知道Thread stop 已被弃用 并且有充分的理由 它通常不安全 但这并不意味着它是never安全 据我所知 在我想要使用它的上下文中它是安全的 而且 据我所知 我别无选择 上下文是一个两人策略游戏的第三方插件 以国际象棋为例 第三方
  • 检查对象是否为空

    我有一个链表 其中第一个节点包含空对象 表示firstNode data等于null firstNode nextPointer null firstNode previousPointer null 我想检查firstNode 是否为空
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • 如何保存/加载 BigInteger 数组

    我想保存 加载BigInteger数组传入 传出 SharedPreferences 如何做呢 例如对于以下数组 private BigInteger dataCreatedTimes new BigInteger 20 Using Gso
  • Spring portlet mvc:@Valid 似乎不起作用

    我创建了一个 bean 类并在我的控制器中使用它 但它似乎不起作用 也就是说 即使我输入了无效的年龄 result hasErrors仍然是假的 豆类 public class User Min 13 private int age pri
  • 当 javadoc 未附加到依赖项时,如何将 javadoc 引用到 Maven 的 eclipse 插件中的依赖项

    我在开发中使用 Eclipse Maven 和 Java 我使用 Maven 下载依赖项 jar 文件和 javadoc 如果可用 并使用 Maven 的 eclipse 插件为 Eclipse 生成 project 和 classpath
  • jsch - 发送特殊键(CTRL-C、CTRL-D 等)

    我需要向远程终端发送特殊密钥 如何使用 JSCH 做到这一点 Thanks Walter 尝试发送两个字节 0x03 0x04 Check ASCII 表 http www bbdsoft com ascii html了解更多
  • 使用 System.out.println 显示特殊字符

    我在将带有特殊字符的文本从网络服务发送或显示到数据库时遇到问题 在我的 Eclipse 上 我已将字符编码设置为 UTF 8 但它仍然不允许我显示字符 例如 像下面的代码一样简单的打印 String test System out prin
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 如何在 logback 中启动时滚动日志文件

    我想配置 logback 来执行以下操作 记录到文件 当文件达到 50MB 时滚动文件 仅保留 7 天的日志 启动时始终生成一个新文件 滚动 除了最后一项 启动卷 外 我一切都正常 有谁知道如何实现这一目标 这是配置
  • 仅当用户开始输入时清除 JavaFX TextField 中的提示文本

    默认行为是当字段获得焦点时 字段中的提示文本将被删除 那是标记在场上的时候 是否可以配置文本字段 以便仅在用户开始输入时删除提示文本 否则 我需要在每个文本字段旁边 上方添加一个标签 以描述其中的值 我知道它有点旧 但我自己也需要它 这仍然

随机推荐

  • centos7 linux定时任务详解

    前言 工作中需要开启一个定时任务 每天晚上2点进行爬虫代码的运行 这不得不去学习一下linux 下的定时任务crontab crontab yum install crontabs 说明 sbin service crond start 启
  • idea 部署项目到tomcat

    转 http www biliyu com article 986 html 这篇文章的后半部分解决了困扰我一上午的问题 因为遇到问题不喜欢问别人 然后搜到这篇文章 我在百度输入的是 warning no artifacts marked
  • 如何解决Ubuntu 下gstm不能打开图形用户界面的问题

    gstm是一款Linux下的SSH管理工具 至于gstm的主要作用 来这里看此文的人都懂的 用此工具一段时间后 某天打开时突然出现不能打开图形界面的问题 一阵焦虑 卸载重装n遍后仍不能解决 查找半天资料 突然在一小论坛某位网友的回答中解决了
  • 如何在 Mapbox GL JS 中加载任意投影的图片?

    在 Mapbox GL JS API 中 我们可以使用 image source 和 raster layer 将图片叠加到地图上 例如 Add a raster image to a map layer 但是 因为 Mapbox 使用 网
  • Ubuntu 代理上网设置(firefox,新立得,apt-get等)

    现在公司需要代理上网 ubuntu又是那么的依懒网络 前几天在公司装了ubuntu就开始查资料设置代理上网 以下整合一下 部分是参考其他网友的 这里就不一一说明了 一 Firefox代理上网 这个最简单了 依次点击 edit gt pref
  • git 本地仓库关联到远程仓库

    将本地仓库关联到远程仓库 方式一 远程仓库没有文件 第一步 git init 初始化git仓库 第二步 git remote add 地址 设置remote地址 第三步 git add 将所有变更提交到本地仓库 第四步 git commit
  • SpringBoot激活profiles的几种方式

    多环境是最常见的配置隔离方式之一 可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景 在SpringBoot内支持了多种配置隔离的方式 可以激活单个或者多个配置文件 激活的profiles要在项目内创建对应的配置文件 格式为app
  • LearnOpenGL - 绘制三角形完整代码

    include
  • Linux下安装Python3.9(orangepi Zero2)

    1 查看当前Linux下自带的Python版本 python version 2 更新Linux源 sudo apt update 3 安装Python所需要的环境 代码如下 通用代码 树莓派 全志 Linux均适用 sudo apt in
  • Octave常用函数

    矩阵生成 eye n 生成n行n列的单位矩阵 rand n m 随机生成n行m列大小范围在0 1之间的随机数 randn n m 按高斯分布生成n行m列的随机数 ones n m 生成n行m列元素均为1的矩阵 zeros n m 生成n行m
  • kaggle:泰坦尼克生存预测( R语言机器学习分类算法)

    本文在基本的多元统计分析技术理论基础上 结合机器学习基本模型 选择Kaggle 数据建模竞赛网站 的入门赛 Titanic生存预测作为实战演练 较为完整地呈现了数据建模的基本流程和思路 采用的模型有逻辑回归 决策树 SVM支持向量机以及进阶
  • 爬虫代码(TJ)

    getip py来自https mp csdn net postedit 99288836 import getip import re import cx Oracle import urllib request from bs4 imp
  • 统计学:方差分析和相关分析的区别和联系

    区别 方差分析目的是检验因素是否对总体起作用 方法是不同的分组施加不同的因素水平 然后看组间差距是否明显大于组内差距 若明显大于则认为因素对总体起作用 具体过程中 方差分析只读取因变量数据 而不读取自变量数值 相关分析是检验变量之间是否有依
  • Redis学习(二)---常用命令、数据类型

    文章目录 常用命令 五大基本数据类型 1 String 2 List 3 Set 4 Hash 5 Zset 三种特殊数据类型 1 geospatial 2 Hyperloglog 3 Bitmaps 小结 常用命令 set key val
  • 05LinuxC线程学习之练习循环创建多个子线程和线程传参大坑(可以对比之前循环创建多个子进程)

    注 1 之前循环创建多个子进程的文章 https blog csdn net weixin 44517656 article details 109433060 2 wait回收子进程并且获取正常退出的返回值和异常退出的信号值的文章 htt
  • ESP32开发—文件系统spiffs

    文件系统有很多种 不同的操作的系统或者存储介质会选择不一样的文件系统 对于spiffs来说就是为了嵌入式设备而定制的精简版文件系统 优点是占用的内存非常小 而已不使用malloc分配内存 系统使用的内存由用户传入静态内存 缺点就是能存储的文
  • matlab傅里叶级数展开

    傅里叶级数 傅里叶级数展开 傅里叶级数展开原理 源码 方波 方波 三角波 matalb 傅里叶级数展开结果图片 傅里叶级数展开 傅里叶级数展开原理 周期函数可以通过一系列的三角函数的线性组合来逼近 傅里叶技术展开可以找到这些三角函数 首先我
  • ELK企业级日志分析系统

    ELK概述 为什么要使用 ELK 日志主要包括系统日志 应用程序日志和安全日志 系统运维和开发人员可以通过日志了解服务器软硬件信息 检查配置过程中的错误及错误发生的原因 经常分析日志可以了解服务器的负荷 性能安全性 从而及时采取措施纠正错误
  • 【Alist + Teracloud】WebDAV免费畅游互联网个人方案总结,一些支持WebDAV的应用推荐

    文章目录 1 介绍 废话 支持略过 1 1 WebDAV 是啥 1 2 支持开通 WebDAV 服务的东西 1 2 1 网盘类 公有云 1 2 2 私有云 1 2 3 本地部署 1 2 4 Alist 1 3 支持连接 WebDAV 的应用
  • 计算机网络【java面试题】

    1 计算机网络中的七层模型以及每一层的作用 OSI七层模型 功能 对应的网络协议 应用层 应用层是网络体系中最高的一层 也是唯一面向用户的一层 也可视为为用户提供常用的应用程序 每个网络应用都对应着不同的协议 HTTP TFTP FTP N