前言:
本文关于计算机网络基础的面试题讲解,覆盖关键知识点,致力于为求职者提供助力。
浏览器中输入网址后敲回车发生了什么?:
-
域名解析:通过DNS将域名转换为IP地址
-
建立链接:浏览器拿到IP地址则拿这个IP地址与服务器进行三次握手建立TCP链接
-
发送请求:连接成功后,浏览器根据输入的网址向服务器发送一个HTTP请求(请求方法、请求资源路径、请求头)
-
服务器处理请求:服务器收到请求进行处理,执行业务逻辑。
-
服务器响应:服务器将处理的结果封装成一个HTTP的响应消息
-
浏览器渲染页面:浏览器收到响应信息进行页面渲染
-
关闭链接:页面渲染完成之后,浏览器与服务器的连接会保持一段时间;在一段时间后没有新的请求,断开连接
浏览器刷新界面服务器如何区分两次相同的请求?:
-
通过请求头信息:
-
唯一标识:
Cookie
字段可以包含用户的身份信息和会话标识,服务器通过识别不同的会话标识来区分不同用户的请求。即使是同一个用户刷新页面,只要会话未结束,服务器就可以根据会话标识知道是同一个用户的不同请求。
-
-
通过请求参数
-
动态参数:如果请求中包含动态生成的参数,服务器可以根据这些参数来区分不同的请求。刷新页面,这些动态参数也会发生变化,从而让服务器识别出是新的请求。例如,在一些电商网站中,每次请求商品列表时可能会带上一个随机生成的
token
参数,服务器通过这个token
来区分不同的请求,防止重复操作或缓存问题。 -
表单数据:若请求中包含表单数据,即使是刷新页面,表单数据也可能不同。比如用户在搜索框中输入不同的关键词后刷新页面,服务器根据接收到的不同表单数据来区分请求,并执行相应的搜索操作。
-
-
通过服务端状态
-
请求计数器:服务器可以为每个用户或每个会话设置一个请求计数器,每次接收到请求时,计数器加一。通过比较计数器的值,服务器可以知道请求的顺序和次数,从而区分刷新操作产生的多次请求。
-
OSI 7层协议 和 五层协议,分别有哪些?:
-
七层
-
物理层:处理物理介质上的信号传输
-
数据链路层:将物理层的信号转换为数据帧
-
网络层:负责在不同的网络之间进行数据传输和寻址
-
传输层:为应用程序提供端到端的通信服务,确保数据可靠传输
-
会话层:负责建立、维护和管理会话
-
表示层:处理数据的表示和转换
-
应用层:用户与网络之间的接口,提供各种网络应用服务
-
-
五层
-
物理层
-
数据链路层
-
网络层
-
传输层
-
应用层:包含了会话层和表示层
-
TCP、UDP的区别?:
Telent、FTP、SMTP、POP3是基于TCP
HTTP、SNMP、DNS、OICQ是基于UDP
-
连接特性
-
TCP是面向连接的,在传输数据之前,需要建立连接
-
UDP是无连接,可以直接发送数据报
-
-
可靠性
-
TCP是可靠的,确保数据能够完整无误地到达目的地
-
UDP是不可靠的,不保证数据能否到达目的地和数据的完整性
-
-
传输效率
-
TCP传输效率低
-
UDP传输效率高
-
-
数据传输模式
-
TCP是流模式,数据被视为连续的字节流,没有明确的边界
-
UDP是数据报模式,每个UDP数据包都有明确的边界和长度
-
-
拥塞控制
-
TCP 具有拥塞控制机制,它会根据网络的拥塞情况自动调整发送数据的速率,以避免网络拥塞崩溃
-
UDP 没有内置的拥塞控制机制,需要应用程序自己来处理拥塞问题
-
路由器、防火墙处于哪一层?
-
路由器主要工作在网络层,路由器的核心就是根据IP转发数据包,通过目的IP并依据自身存储的路由表,决定数据往哪个方向转发
-
防火墙会在网络层、传输层和应用层进行工作
-
网络层:能够基于源IP、目的IP、端口号等信息进行过滤
-
传输层:根据TCP、UDP协议的状态信息进行过滤
-
应用层:对应用层协议的内容进行分析,例如检测HTTP协议中的恶意代码
-
DNS协议:
-
概念:将域名转换为IP地址的服务
-
原理:
-
当用户输入一个域名时,计算机先会检查本地的DNS缓存,如果缓存存在域名对应的IP就直接用该地址进行访问。缓存中没有,会向本地的DNS服务器发送查询请求,如果本地服务器不知道该域名的IP,则向根DNS发送查询请求。根DNS会告知本地应该查询哪个顶级域名服务器(.cn .com)。本地DNS向顶级域名服务器发送查询请求,顶级域名服务器告知该域名的权威DNS服务器地址。最后本地DNS向权威DNS发送查询请求,权威DNS返回域名对应的IP,本地计算机进行缓存,并返回给用户的计算机。
-
递归查询和迭代查询:递归查询是指 DNS 客户端向 DNS 服务器发送查询请求后,DNS 服务器会代替客户端继续查询,直到得到最终的结果并返回给客户端。迭代查询则是 DNS 服务器只返回它知道的相关信息,让客户端自己根据这些信息继续向其他 DNS 服务器查询,直到获取到目标 IP 地址。
-
-
作用:
-
方便用户访问网络资源:用户无需记住复杂的 IP 地址,只需要输入易于记忆的域名即可访问网站。
-
实现负载均衡:通过将同一个域名解析到多个不同的 IP 地址上,DNS 可以将用户的访问请求分配到不同的服务器上,实现负载均衡。
-
支持网络服务的灵活部署:当网络中的服务器 IP 地址发生变化时,只需要在 DNS 服务器上修改相应域名的解析记录。
-
HTTP协议了解吗?:
-
概念:客户端与服务器之间进行数据交互的标准
-
特点:
-
无连接:每次连接只处理一个请求,请求处理完后连接就会被关闭
-
无状态:服务器不会记住这个浏览器的任何信息;每个请求是独立的,服务器无法区分不同请求是否来自同一个客户端,可以通过Cookie弥补
-
基于请求-响应模型:客户端发请求,服务器接收并响应
-
-
结构:
-
请求消息:由请求行、请求头、空行和请求消息体组成。请求行包含请求方法、URL 和 HTTP 协议版本;请求头部字段包含了关于请求的各种附加信息;空行用于分隔头部字段和消息体;请求消息体则包含了要发送给服务器的数据。
-
响应消息:由状态行、响应头、空行和响应消息体组成。状态行包含 HTTP 协议版本、状态码和状态描述;响应头部字段提供了关于响应的信息,如内容类型、内容长度、服务器信息等;空行同样用于分隔头部字段和消息体;响应消息体包含了服务器返回给客户端的数据,如网页的 HTML 代码、图片、视频等。
-
HTTP协议与TCP的区别与联系:
-
区别
-
功能层次不同
-
HTTP:处于应用层,浏览器和服务器进行数据交换的标准
-
TCP:处于传输层,在不同主机的应用程序之间提供可靠的、面向连接的数据传输服务
-
-
连接特性不同
-
HTTP:无连接、无状态
-
TCP:面向连接,可靠的
-
-
数据传输特点不同
-
HTTP:主要以文本形式进行数据传输
-
TCP:字节流形式传输数据
-
-
-
联系
-
HTTP基于TCP:客户端发送HTTP请求时,通过TCP连接将请求数据发出去
-
共同完成网络通信:TCP 负责在网络中建立连接、传输数据以及保证数据的可靠性,而 HTTP 则负责规定数据的格式、语义以及客户端与服务器之间的交互逻辑
-
HTTP/1.0和HTTP/1.1的区别:
-
连接管理:
-
HTTP/1.0:短连接,每次请求都需要重新创建一次TCP连接,请求完毕之后关闭连接
-
HTTP/1.1:长连接,通过
Connection: keep-alive
头部,在一个TCP连接上发送多个请求和接受多个响应,减少关闭和创建的开销
-
-
host头部:
-
HTTP/1.0:无强制要求,一个服务器无法区分同一个 IP 地址上的多个域名
-
HTTP/1.1:强制要求,正确识别客户端请求的是哪个域名
-
-
缓存机制:
-
HTTP/1.0:缓存控制功能较弱,主要通过
Expires
头部来指定资源的过期时间。 -
HTTP/1.1:引入了更强大的缓存控制机制,如
Cache-Control
头部,支持更灵活的缓存策略
-
-
分块传输编码:
-
HTTP/1.0:不支持分块传输编码,服务器必须预先知道响应内容的长度
-
HTTP/1.1:支持分块传输编码,允许服务器在不知道内容长度的情况下逐步发送数据
-
-
管道化
-
HTTP/1.0:不支持管道化,客户端必须等待上一个请求的响应完成后才能发送下一个请求
-
HTTP/1.1:支持管道化,允许客户端在一个 TCP 连接上连续发送多个请求,而不需要等待每个请求的响应
-
GET和POST?:
-
参数传递:
-
GET:参数通常以key-value的形式拼接在url的后面
-
POST:参数放在请求体中
-
-
安全性:
-
GET:明文显示,容易被窃取,不安全
-
POST:相对安全
-
-
缓存
-
GET:可以被浏览器缓存,因为多次请求结果相同是幂等的
-
POST:一般不会被缓存
-
常见的HTTP的状态码:
-
1XX:信息状态码,表示服务器收到请求,正在处理
-
2XX:成功状态码,请求被成功处理
-
200 OK:请求成功,服务器已成功处理请求并返回了预期的响应内容。这是最常见的成功状态码。
-
201 Created:请求成功,并且服务器创建了新的资源。通常在使用 POST 或 PUT 方法创建新资源时返回。
-
204 No Content:请求成功,但服务器没有返回任何内容。常用于只需要执行服务器端操作,而不需要返回数据的情况,如 DELETE 请求成功后。
-
-
3XX:重定向状态码,客户端需要采用进一步操作
-
301 Moved Permanently:请求的资源已永久移动到新的 URL。客户端应更新其书签或缓存,使用新的 URL 进行后续请求。
-
302 Found:请求的资源临时移动到新的 URL。客户端应使用新的 URL 进行本次请求,但不应更新其书签或缓存,因为资源可能会在未来移回原 URL。
-
304 Not Modified:客户端发送了带有 If - Modified - Since 或 If - None - Match 等条件请求头的请求,服务器发现资源未被修改,因此返回此状态码,告知客户端可以使用缓存的资源,以减少数据传输。
-
-
4XX:客户端错误状态码:客户端发送的请求存在错误
-
400 Bad Request:客户端发送的请求语法错误,服务器无法理解。例如,请求体中的 JSON 数据格式不正确。
-
401 Unauthorized:客户端未提供有效的身份验证信息,或者提供的信息无效,无法访问受保护的资源。通常用于需要用户登录或提供身份令牌的场景。
-
403 Forbidden:客户端具有访问资源的权限,但服务器拒绝了请求。这可能是由于用户没有足够的权限、访问被禁止或资源存在限制等原因。
-
404 Not Found:服务器无法找到请求的资源。可能是由于 URL 输入错误、资源已被删除或移动到其他位置。
-
-
5XX:服务器错误状态码:服务器处理请求发生了错误
-
500 Internal Server Error:服务器内部发生了错误,无法完成请求。这是一个通用的错误状态码,通常表示服务器端出现了未预料到的问题,如代码错误、数据库连接问题等。
-
502 Bad Gateway:服务器作为网关或代理,从上游服务器接收到了无效的响应。通常发生在服务器与其他服务器通信时出现问题,例如上游服务器故障或无响应。
-
503 Service Unavailable:服务器暂时无法处理请求,通常是由于服务器过载、正在维护或出现故障。客户端可以稍后再尝试请求。
-
HTTP和HTTPS的区别?HTTPS中的 S是指什么?:
-
区别:
-
连接方式与安全性
-
HTTP:连接相对简单,客户端向服务器发送请求,服务器响应请求,数据以明文形式传输,这意味着在数据传输过程中,黑客可以轻易地窃取、篡改或监听传输的内容,存在较大的安全风险。
-
HTTPS:在 HTTP 的基础上加入了 SSL/TLS 协议,对数据进行加密处理,使数据在传输过程中变成密文,只有合法的接收方才能解密和读取数据,大大提高了数据的安全性,防止数据被窃取或篡改。
-
-
端口
-
HTTP:默认使用 80 端口进行数据传输。
-
HTTPS:默认使用 443 端口传输数据。
-
-
证书
-
HTTP:不需要数字证书来验证身份。
-
HTTPS:要求服务器拥有由权威证书颁发机构颁发的数字证书,客户端可以通过验证证书来确认服务器的身份是否可信,增加了对服务器真实性的验证。
-
-
-
HTTPS 中的 S 是指 “Secure”,即安全的意思,代表着该协议在 HTTP 的基础上增加了安全功能,通过 SSL/TLS 协议来实现加密传输和身份验证等安全机制,以保护数据在网络传输过程中的安全性和完整性。
HTTPS讲一下密钥怎么交换的?:
-
客户端发起请求:客户端向服务器发送一个包含客户端支持的 SSL/TLS 版本、加密算法列表等信息的 “Client Hello” 消息。
-
服务器响应:服务器收到客户端请求后,发送 “Server Hello” 消息,包含服务器选择的 SSL/TLS 版本、加密算法,以及服务器的数字证书。客户端可以通过验证证书来确认服务器的身份是否可信。
-
客户端生成密钥:客户端验证服务器证书有效后,生成一个随机的 “预主密钥”,用服务器证书中的公钥加密后发送给服务器,这就是 “Client Key Exchange” 消息。
-
双方计算主密钥:客户端和服务器根据预主密钥以及之前交换的随机数,通过特定的算法计算出相同的 “主密钥”。后续的数据加密和解密都将使用这个主密钥。
三次握手、为什么多了第三次?(🌟🌟🌟🌟🌟):
-
流程
-
第一次握手,客户端向服务器发送SYN,希望与服务器建立连接
-
第二次握手,服务器向客户端发送SYN+ACK确认连接
-
第三次握手,客户端向服务器发送ACK,完成连接
-
-
为什么多了第三次:
-
确保客户端接受能力正常:服务器不知道客户端接收是否正常,就需要客户端向服务器发送ACK表示确认
-
预防失效的连接请求误认为是新的连接请求
-
四次挥手比三次握手多了哪一次、为什么?:
-
流程
-
第一次挥手,客户端发送FIN,想要关闭连接(FIN_WAIT_1)
-
第二次挥手,服务器收到FIN,向客户端发送ACK;客户端收到后,客户端到服务器的连接半关闭,不再发送应用层数据,服务器到客户端仍连接(客户端:FIN_WAIT_2,服务器:CLOSE_WAIT)
-
第三次挥手,服务器数据发送完毕后,发送一个FIN,关闭服务器到客户端的连接(服务器:LAST_ACK)
-
第四次挥手,客户端收到FIN后,发送ACK给服务器,然后进入 TIME_WAIT 状态。服务器收到 ACK 后,连接正式关闭,进入 CLOSED 状态。客户端在 TIME_WAIT 状态停留一段时间后(2MSL时间),也会进入 CLOSED 状态,至此整个连接才完全关闭。
-
-
多在服务器发送完数据向客户端发送一个FIN,因为TCP连接是全双工,数据可以在两个方向上独立传输,当一方想要关闭连接时,只能表示它不再发送数据,但仍然可以接收数据
TCP TIME_WAIT讲一下?为啥需要这个?:
-
确保最后一个 ACK 能被服务器收到:客户端发送的最后一个
ACK
有可能在网络中丢失。如果服务器没有收到这个ACK
,它会重新发送FIN
报文段。处于TIME_WAIT
状态的客户端能够接收并处理这些重传的FIN
报文段,重新发送ACK
,从而保证服务器能够正常关闭连接 -
处理延迟的报文段:在连接关闭后,可能还有一些之前发送的报文段滞留在网络中,这些延迟到达的报文段可能会在连接关闭后才到达对方。
TIME_WAIT
状态可以确保当有这样的延迟报文段到达时,能够被正确处理,而不会对新的连接造成干扰
2MSL时间内收到了服务器的报文会怎样?:
-
收到 FIN 报文:如果收到服务器重传的 FIN 报文,说明服务器没有收到客户端发送的最后一个 ACK。客户端会重新发送 ACK 给服务器,并且重新开始 2MSL 的计时
-
收到其他数据报文:如果收到的是服务器在关闭连接前发送的未处理完的数据报文,客户端会正常接收并处理这些数据。处理完成后,客户端不会对这些数据报文进行确认,因为此时连接已经处于关闭流程中,客户端只需要等待 2MSL 时间结束后关闭连接即可
服务器出现大量CLOSE_WAIT的连接的原因以及解决方法?
-
原因:服务器没有及时处理连接关闭请求
-
方法:设置连接超时时间
什么是粘包,怎么设计避免粘包?
-
概念:发送方发送的多个数据包被接收方粘连在一起,无法准确地解析出每个数据包
-
解决方案
-
消息定长:每个消息都固定长度
-
添加消息边界标识:每个消息的开头或结尾都有特殊标识
-
TCP怎么保证可靠传输的?拥塞控制说一下(重要🌟):
-
保证可靠传输
-
校验和:客户端发送数据时,对数据进行校验和计算,并将校验和字段存到TCP首部;服务器接收到数据,再次进行校验和计算,并与TCP首部的校验和字段进行比较
-
序列号和确认应答:TCP为每一个字节都分配序列号,服务器接收到后进行排序,并向客户端发送ACK。只有客户端接收到ACK后,认为数据成功接收
-
超时重传:在规定时间内,客户端没有收到服务器的ACK,重新发送数据
-
流量控制:通过滑动窗口机制实现流量控制,客户端根据服务器的窗口大小控制数据传输速度
-
-
拥塞控制:确保网络高效、稳定运行的关键机制
-
慢开始(Slow - Start)
-
发送方开始时将拥塞窗口(cwnd)初始化为一个较小的值,通常为 1 个最大报文段长度(MSS)。
-
每收到一个对新数据的确认应答(ACK),就将拥塞窗口大小增加一个 MSS。这样,拥塞窗口会以指数级的速度增长,快速增加发送的数据量。
-
当拥塞窗口大小达到慢开始门限(ssthresh)时,进入拥塞避免阶段。
-
-
拥塞避免(Congestion Avoidance)
-
进入拥塞避免阶段后,拥塞窗口不再以指数级增长,而是每经过一个往返时间(RTT),将拥塞窗口大小增加 1 个 MSS。这样,拥塞窗口以线性速度增长,避免网络拥塞。
-
如果发送方发现网络出现拥塞(如出现超时或收到重复的 ACK),就会进入拥塞控制阶段,调整相关参数以降低发送速率。
-
-
快重传(Fast Retransmit)
-
当接收方发现某个报文段丢失时,会立即对之前接收到的报文段发送重复的 ACK。发送方只要收到三个重复的 ACK,就认为该报文段丢失,不等定时器超时就立即重传丢失的报文段。
-
快重传机制可以快速恢复丢失的数据包,减少数据传输的延迟,提高网络的吞吐量。
-
-
快恢复(Fast Recovery)
-
发送方在执行快重传后,会进入快恢复阶段。此时,慢开始门限(ssthresh)会被设置为当前拥塞窗口大小的一半。
-
拥塞窗口大小被设置为慢开始门限(ssthresh)加上 3 倍的 MSS,然后开始执行拥塞避免算法,使拥塞窗口以线性速度增长,而不是像慢开始阶段那样以指数级增长,以尽快恢复网络传输能力,同时避免再次出现拥塞。
-
-
HTTPS建立连接的过程:
-
客户端发起请求:客户端向服务器发送一个 HTTPS 请求,请求中包含客户端支持的 SSL/TLS 版本、加密算法等信息。
-
服务器响应:服务器收到客户端的请求后,返回服务器的证书,其中包含服务器的公钥、证书颁发机构(CA)等信息。
-
客户端验证证书:客户端收到服务器的证书后,会验证证书的合法性,包括检查证书是否由受信任的 CA 颁发、证书是否过期、证书中的域名是否与访问的域名一致等。如果证书验证通过,客户端会生成一个随机的预主密钥(Premaster Secret),并用服务器的公钥对其进行加密,然后发送给服务器。
-
服务器解密并生成密钥:服务器使用自己的私钥解密客户端发送的加密预主密钥,得到预主密钥。然后,服务器和客户端根据预主密钥以及之前协商好的算法,生成会话密钥(Session Key),用于后续的加密通信。
-
连接建立:客户端和服务器使用会话密钥对后续的通信数据进行加密和解密,开始进行安全的通信。