文章目录
- 计算机网络基础
- 计算机网络体系结构(网络分层模型)
- OSI 七层模型是什么?每一层的作用是什么?
- TCP/IP 四层模型是什么?每一层的作用是什么?
- 五层体系结构以及对应的协议
- 为什么网络要分层,分层的好处?
- 常见网络协议有哪些,每一层常见协议有哪些?
- 应用层有哪些常见的协议?
- 传输层有哪些常见的协议?
- 网络层有哪些常见的协议?
- HTTP
- 从输入 URL 到页面展示到底发生了什么?(非常重要)
- HTTP请求的过程与原理
- 说说HTTP常用的状态码及其含义?
- 说说HTTP的状态码,301和302的区别?
- HTTP Header 中常见的字段有哪些?
- HTTP 常用的请求方式,区别和用途?
- POST和GET有哪些区别?
- 请简单说一下你了解的端口及对应的服务?
- HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别
- HTTP/1.1 (相对于HTTP/1.0)
- HTTP/2.0 (相对于HTTP/1.1)
- HTTP/3.0 (相对于HTTP/2.0)
- HTTPS流程是怎样的?
- HTTP 与 HTTPS 的区别
- 说说什么是数字签名?什么是数字证书?
- 对称加密与非对称加密有什么区别?
- HTTP 如何实现长连接?在什么时候会超时?
- HTTP 是不保存状态(无状态)的协议, 如何理解?如何保存用户状态?
- Cookie 和 Session 有什么区别, Cookie 和 Session 是如何配合的呢?
- token和Session的区别
- JWT
- 什么是JWT?
- JWT的结构
- JWT的使用
- JWT和Session区别?
- 如何对JWT已签发的token 进行废弃处理?
- 如何实现JWT的续签?
- URI和URL的区别
- forward和redirect的区别?
- DNS
- DNS 的作用是什么?
- DNS 服务器有哪些?
- DNS 解析的过程是什么样的?
- DNS 劫持了解吗?
- TCP 与 UDP
- TCP 与 UDP 的区别(重要)
- 什么时候选择 TCP,什么时候选 UDP?
- HTTP 基于 TCP 还是 UDP?
- 使用 TCP 的协议有哪些?使用 UDP 的协议有哪些?
- 请详细介绍一下TCP 的三次握手机制
- TCP握手为什么是三次,为什么不能是两次?不能是四次?
- 说说TCP四次挥手过程
- TCP挥手为什么需要四次呢?
- 为什么不能把服务端发送的 ACK 和 FIN 合并起来,变成三次挥手?
- TCP四次挥手过程中,为什么需要等待2MSL,才进入CLOSED关闭状态?
- 谈谈TCP的粘包和拆包?
- 说说TCP是如何确保可靠性的呢?
- 说说TCP报文首部有哪些字段,其作用又分别是什么?
- 聊聊TCP的流量控制和滑动窗口?
- 为什么需要流量控制?
- 怎么实现流量控制?
- 聊聊滑动窗口
- TCP 的拥塞控制是怎么实现的?
- 慢启动算法
- 拥塞避免算法
- 拥塞发生算法
- 快速恢复算法
- 说说TCP的重传机制
- 超时重传
- 快速重传
- 带选择确认的重传(SACK)
- 重复SACK(D-SACK)
- IP
- IPv4 和 IPv6 有什么区别?
- IP地址有哪些分类?
- ARP协议
- 说下ARP 协议的工作过程?
- PING
- PING 命令的作用是什么?
- PING 命令的工作原理是什么?
- PING 命令的工作流程?
- WebSocket
- 什么是 WebSocket?
- WebSocket 和 HTTP 有什么区别?
- WebSocket 的工作过程是什么样的?
- 网络攻击相关
- 什么是CSRF 攻击,如何解决?
- 什么是XSS攻击,如何避免?
- 聊聊SQL注入?
- 说说SYN Flood攻击?
- 什么是DoS、DDoS、DRDoS攻击?
- 其他
- 什么是CDN?CDN的工作原理是怎样的?
- 如何实现跨域?
计算机网络基础
计算机网络体系结构(网络分层模型)
OSI 七层模型是什么?每一层的作用是什么?
OSI 七层模型 是国际标准化组织提出的一个网络分层模型。每层的作用如下:
- 应用层
为计算机用户提供服务 - 表示层
数据处理(编解码、加密解密、压缩解压缩) - 会话层
管理(建立、维护、重连)应用程序之间的会话 - 传输层
为两台主机进程之间的通信提供通用的数据传输服务 - 网络层
路由和寻址 - 数据链路层
帧编码和误差纠正控制 - 物理层
透明地传送比特流
TCP/IP 四层模型是什么?每一层的作用是什么?
TCP/IP 四层模型 是目前被广泛采用的一种模型,我们可以将 TCP / IP 模型看作是 OSI 七层模型的精简版本,由以下 4 层组成:
- 应用层
对应于OSI参考模型的(应用层、表示层、会话层)。 - 传输层
对应OSI的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。 - 网络层
对应于OSI参考模型的网络层,主要解决主机到主机的通信问题 - 网络接口层
与OSI参考模型的数据链路层、物理层对应。
五层体系结构以及对应的协议
- 应用层:对应于OSI参考模型的(应用层、表示层、会话层)。
- 传输层:对应OSI参考模型的的传输层
- 网络层:对应OSI参考模型的的网络层
- 数据链路层:对应OSI参考模型的的数据链路层
- 物理层:对应OSI参考模型的的物理层。
为什么网络要分层,分层的好处?
我觉得主要有 3 方面的原因:
- 各层之间相互独立:各层之间相互独立,各层之间不需要关心其他层是如何实现的,只需要知道自己如何调用下层提供好的功能就可以了(可以简单理解为接口调用)。
- 提高了灵活性和可替换性:每一层都可以使用最适合的技术来实现,并且,每一层都可以根据需要进行修改或替换,而不会影响到整个网络的结构。(高内聚、低耦合的原则)
- 大问题化小:分层可以将复杂的网络问题分解为许多比较小的、界线比较清晰简单的小问题来处理和解决。
常见网络协议有哪些,每一层常见协议有哪些?
应用层有哪些常见的协议?
- HTTP(Hypertext Transfer Protocol,超文本传输协议):基于 TCP 协议,是一种用于传输超文本和多媒体内容的协议,主要是为 Web 浏览器与 Web 服务器之间的通信而设计的。当我们使用浏览器浏览网页的时候,我们网页就是通过 HTTP 请求进行加载的。
- SMTP(Simple Mail Transfer Protocol,简单邮件发送协议):基于 TCP 协议,是一种用于发送电子邮件的协议。注意⚠️:SMTP 协议只负责邮件的发送,而不是接收。要从邮件服务器接收邮件,需要使用 POP3 或 IMAP 协议。
- POP3/IMAP(邮件接收协议):基于 TCP 协议,两者都是负责邮件接收的协议。IMAP 协议是比 POP3 更新的协议,它在功能和性能上都更加强大。IMAP 支持邮件搜索、标记、分类、归档等高级功能,而且可以在多个设备之间同步邮件状态。几乎所有现代电子邮件客户端和服务器都支持 IMAP。
- FTP(File Transfer Protocol,文件传输协议) : 基于 TCP 协议,是一种用于在计算机之间传输文件的协议,可以屏蔽操作系统和文件存储方式。注意 ⚠️:FTP 是一种不安全的协议,因为它在传输过程中不会对数据进行加密。建议在传输敏感数据时使用更安全的协议,如 SFTP。
- SSH(Secure Shell Protocol,安全的网络传输协议):基于 TCP 协议,通过加密和认证机制实现安全的访问和文件传输等业务。
- DNS(Domain Name System,域名管理系统): 基于 UDP 协议,用于解决域名和 IP 地址的映射问题。
传输层有哪些常见的协议?
- TCP(Transmission Control Protocol,传输控制协议 ):提供 面向连接 的,可靠 的数据传输服务。
- UDP(User Datagram Protocol,用户数据协议):提供 无连接 的,尽最大努力 的数据传输服务(不保证数据传输的可靠性),简单高效。
网络层有哪些常见的协议?
- IP(Internet Protocol,网际协议):主要作用是定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
- ARP(Address Resolution Protocol,地址解析协议):ARP 协议解决的是网络层地址和链路层地址之间的转换问题。ARP 协议解决了 IP 地址转 MAC 地址的一些问题。
- ICMP(Internet Control Message Protocol,互联网控制报文协议):一种用于传输网络状态和错误消息的协议,常用于网络诊断和故障排除。例如,Ping 工具就使用了 ICMP 协议来测试网络连通性。
- OSPF(Open Shortest Path First,开放式最短路径优先) ):一种内部网关协议(Interior Gateway Protocol,IGP),也是广泛使用的一种动态路由协议,基于链路状态算法,考虑了链路的带宽、延迟等因素来选择最佳路径。
- RIP(Routing Information Protocol,路由信息协议):一种内部网关协议(Interior Gateway Protocol,IGP),也是一种动态路由协议,基于距离向量算法,使用固定的跳数作为度量标准,选择跳数最少的路径作为最佳路径。
- BGP(Border Gateway Protocol,边界网关协议):一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议,具有高度的灵活性和可扩展性。
HTTP
从输入 URL 到页面展示到底发生了什么?(非常重要)
总体来说分为以下几个步骤:
- 在浏览器中输入指定网页的 URL。
- 浏览器通过 DNS 协议,获取域名对应的 IP 地址。
- 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求。
- 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容。
- 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器。
- 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示。
- 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
HTTP请求的过程与原理
跟浏览器地址栏输入url到显示主页这道题有点类似。
- 客户端进行DNS域名解析,得到对应的IP地址
- 根据这个IP,找到对应的服务器建立连接(三次握手)
- 建立TCP连接后发起HTTP请求(一个完整的http请求报文)
- 服务器响应HTTP请求,客户端得到HTML代码
- 客户端解析HTML代码,用HTML代码中的资源(如js,css,图片等等)渲染页面。
- 服务器关闭TCP连接(四次挥手)
说说HTTP常用的状态码及其含义?
不管是不是面试需要,我们都要知道,日常开发中的这几个状态码的含义哈:
说说HTTP的状态码,301和302的区别?
302和301都有重定向的含义,但是它们也是有区别的。
- 301:(永久性转移)请求的网页已被永久移动到新位置。服务器返回此响应时,会自动将请求者转到新位置。
- 302:(暂时性转移)服务器目前正从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。此代码与响应GET和HEAD请求的301代码类似,会自动将请求者转到不同的位置
HTTP Header 中常见的字段有哪些?
这里列举几个常见的:
- Accept
能够接受的回应内容类型(Content-Types) - Accept-Charset
能够接受的字符集 - Connection
该浏览器想要优先使用的连接类型 - Content-Type
请求体的多媒体类型(用于 POST 和 PUT 请求中) - Cookie
之前由服务器通过 Set-Cookie发送的一个超文本传输协议 Cookie - Host
Host 服务器的域名(用于虚拟主机),以及服务器所监听的传输控制协议端口号
HTTP 常用的请求方式,区别和用途?
POST和GET有哪些区别?
- 语义(主要区别):GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。
- 幂等:GET 请求是幂等的,即多次重复执行不会改变资源的状态,而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。
- 格式:GET 请求的参数通常放在 URL 中,形成查询字符串,而 POST 请求的参数通常放在请求体中,可以有多种编码格式。GET 请求的 URL 长度受到浏览器和服务器的限制,而 POST 请求的 body 大小则没有明确的限制。
- 缓存:由于 GET 请求是幂等的,它可以被浏览器或其他中间节点(如代理、网关)缓存起来,以提高性能和效率。而 POST 请求则不适合被缓存,因为它可能有副作用,每次执行可能需要实时的响应。
- 安全性:GET 请求和 POST 请求如果使用 HTTP 协议的话,那都不安全,因为 HTTP 协议本身是明文传输的,必须使用 HTTPS 协议来加密传输数据。另外,GET 请求相比 POST 请求更容易泄露敏感数据,因为 GET 请求的参数通常放在 URL 中。
请简单说一下你了解的端口及对应的服务?
HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP3.0的区别
HTTP/1.1 (相对于HTTP/1.0)
1、连接方式
HTTP 1.0默认使用短连接,即每个请求/响应后都会关闭连接,而HTTP 1.1默认使用长连接,在同一个连接上可以发送多个请求和响应。
2、状态响应码
HTTP/1.1 中新加入了大量的状态码
3、管道机制
HTTP 1.1支持请求管道化,即在一个持久连接上可以同时发送多个请求,而HTTP 1.0不支持请求管道化。
问题:采用管道机制虽然可以发送多个请求,但是服务器必须按照接收请求的顺序依次发送对这些管道化请求的响应,以保证客户端能够区分出每次请求的响应内容。这就导致了假如服务端在处理一个请求时耗时比较长,那么后续请求的处理都会被阻塞住,会导致客户端迟迟收不到数据,这称为「队头堵塞」–在HTTP2中解决。
4、缓存控制
HTTP/1.1 在 HTTP/1.0 基础之上,增加了一些请求响应头,以更好的实现对缓存的控制。
- 新增 Cache-Control 代替原先的 Expires;
- 新增 If-None-Match 和 Etag 代替原先的 If-Modified-Since和 Last-Modified 。
5、断点续传
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能, 而HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)
6、Host 头
HTTP/1.1 引入了Host头,允许客户端指定请求的主机名,这使得在同一台服务器上托管多个域名成为可能。HTTP/1.0没有这个头字段。
HTTP/2.0 (相对于HTTP/1.1)
1、头部压缩
HTTP/1.1 支持Body压缩,Header不支持压缩。HTTP/2.0 支持对Header压缩,使用了专门为Header压缩而设计的 HPACK 算法,减少了网络开销。
客户端和服务器同时维护一张头信息表,高频出现的字段会存入这个表,生成一个索引号。发送报文时直接使用索引号替代字段。另外,索引表中不存在的字段使用压缩。同时,多个请求中,如果请求头相同,则后续请求只需要发送差异的部分,重复的部分无需再发送。
2、二进制帧
HTTP/2.0 使用二进制帧进行数据传输,而 HTTP/1.1 则使用文本格式的报文。二进制帧更加紧凑和高效,减少了传输的数据量和带宽消耗。
3、多路复用
HTTP/2.0 在同一连接上可以同时传输多个请求和响应(可以看作是 HTTP/1.1 中长链接的升级版本),互不干扰。HTTP/1.1 则使用串行方式,每个请求和响应都需要独立的连接,而浏览器为了控制资源会有 6-8 个 TCP 连接都限制。。这使得 HTTP/2.0 在处理多个请求时更加高效,减少了网络延迟和提高了性能。
- 在 HTTP/2 中定义了流(Stream)的概念,它是二进制帧的双向传输序列,一个数据流对应着一个完整的请求-响应过程,在同一个请求响应过程中,往返的帧会分配一个唯一的流编号(Stream ID)。
- 在流的支持下,HTTP/2 可以在一个 TCP 连接中传输多个请求或响应,而不用按照顺序一一对应(即实现多路复用),因为它们属于不同的流,所发送的帧头部都会携带 Stream ID,可以通过此 Stream ID 有效区分不同的请求-响应。
- 因而 HTTP/2 解决了 HTTP/1.1 的队头阻塞问题,多个请求 - 响应之间没有了顺序关系,不需要排队等待,降低了延迟,大幅度提高了连接的利用率。
4、服务器主动推送
HTTP/2.0 支持服务器推送,可以在客户端请求一个资源时,将其他相关资源一并推送给客户端,从而减少了客户端的请求次数和延迟。而 HTTP/1.1 需要客户端自己发送请求来获取相关资源。
比如当客户端向服务器请求一个 HTML 文件后,服务器除了将此 HTML 文件响应给客户端外,还可以提前主动将此 HTML 中所依赖的 JS 和 CSS 文件推送给客户端,这样客户端在解析 HTML 时,无需耗费额外的请求去得到相应的 JS 和 CSS 文件。
HTTP/3.0 (相对于HTTP/2.0)
1、传输协议
HTTP/2.0 是基于 TCP 协议实现的,HTTP/3.0 新增了 QUIC 协议来实现可靠的传输,提供与 TLS/SSL 相当的安全性,具有较低的连接和传输延迟。你可以将 QUIC 看作是 UDP 的升级版本,在其基础上新增了很多功能比如加密、重传等等。HTTP/3.0 之前名为 HTTP-over-QUIC,从这个名字中我们也可以发现,HTTP/3 最大的改造就是使用了 QUIC。
2、连接建立
HTTP/2.0 需要经过经典的 TCP 三次握手过程(由于安全的 HTTPS 连接建立还需要 TLS 握手,共需要大约 3 个 RTT)。由于 QUIC 协议的特性(TLS 1.3,TLS 1.3 除了支持 1 个 RTT 的握手,还支持 0 个 RTT 的握手)连接建立仅需 0-RTT 或者 1-RTT。这意味着 QUIC 在最佳情况下不需要任何的额外往返时间就可以建立新连接。
3、队头阻塞
HTTP/2.0 多请求复用一个 TCP 连接,一旦发生丢包,就会阻塞住所有的 HTTP 请求。由于 QUIC 协议的特性,HTTP/3.0 在一定程度上解决了队头阻塞(Head-of-Line blocking, 简写:HOL blocking)问题,一个连接建立多个不同的数据流,这些数据流之间独立互不影响,某个数据流发生丢包了,其数据流不受影响(本质上是多路复用+轮询)。
- HTTP/2 通过多路复用解决了 HTTP1.1 的队头阻塞问题,但其只是解决了 HTTP 这一层面的队头阻塞问题,底层仍然采用的 TCP 连接,HTTP/2 并没有解决 TCP 的队头阻塞问题。
- TCP 是可靠的、面向字节流的协议。HTTP/2 的多个请求虽然可以跑在同一个 TCP 连接中,但如果出现丢包现象,TCP 就需要进行重传,这可能就会导致整个 TCP 连接上的所有流阻塞,直到丢的包重传成功,这就是 TCP 的『队头阻塞』问题。
- 为了解决此问题,HTTP/3 底层不再使用 TCP,而是采用 UDP!而 UDP 是无连接的,多个流互相独立,之间不再有依赖,因而即使某个流发生了丢包,只会对该流产生影响,并不会使得其他流阻塞!
4、错误恢复
HTTP/3.0 具有更好的错误恢复机制,当出现丢包、延迟等网络问题时,可以更快地进行恢复和重传。而 HTTP/2.0 则需要依赖于 TCP 的错误恢复机制。
5、安全性
HTTP/2.0 和 HTTP/3.0 在加密通信实现上有所不同,HTTP/2.0 使用 TLS 协议进行加密,而 HTTP/3.0 基于 QUIC 协议,包含了内置的加密和身份验证机制,可以提供更强的安全性。
HTTP/1.0、HTTP/2.0 和 HTTP/3.0 的协议栈比较:
HTTPS流程是怎样的?
- 客户端发起Https请求,连接到服务器的443端口。
- 服务器必须要有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。
- 服务器将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。
- 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称密钥,用证书的公钥加密。
- 客户端将公钥加密后的密钥发送到服务器。
- 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文啦。
服务器将加密后的密文返回到客户端。 - 客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。
HTTP 与 HTTPS 的区别
- 端口号:HTTP 默认是 80,HTTPS 默认是 443
- URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://。
- 安全性和资源消耗: HTTP是明文传输,HTTPS所有传输的内容都经过加密
HTTP 协议运行在 TCP 之上,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 TCP 之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。所以说,HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
说说什么是数字签名?什么是数字证书?
数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。它的出现,是为了避免身份被篡改冒充的。比如Https的数字证书,就是为了避免公钥被中间人冒充篡改。
数字证书构成
- 公钥和个人等信息,