文章目录
- 简述 tcp 和 udp的区别?
- get 和 post 请求有哪些区别?
- 常用HTTP请求方式有哪些 ?
- 进程跟线程的区别?
- 僵尸进程?
- IO的多路复用?
- 虚拟内存
- 什么是OSI模型
- 说一说HTTP协议
- 说一说HTTPS协议
- HTTPS协议和HTTP协议有什么区别 ? 👍
- 常用HTTP状态码有哪些 ? 代表什么意思 👍👍👍
- 常用HTTP请求方式有哪些 ? 👍👍👍
- 说一说一个请求的完整过程 👍👍
- 什么是TCP的三次握手👍👍👍
- 什么是TCP的四次挥手👍👍👍
- 有没有了解过XSS攻击 , 如何预防
- 有没有了解过CSRF攻击, 如何预防
- 有没有了解过SQL注入攻击, 如何预防👍
- 简单介绍一下Java的IO流
- 什么是AIO、BIO和NIO
- 什么是网站跨域, 如何解决跨域 👍
更多相关内容可查看
简述 tcp 和 udp的区别?
- 连接性:TCP是面向连接的协议,通信双方在数据传输前要先建立连接,然后再传输数据,确保数据的可靠性和顺序性。而UDP是无连接的协议,通信双方直接发送数据包,不需要建立连接,因此传输速度更快,但不保证数据的可靠性和顺序性。
- 可靠性:TCP保证数据的可靠传输,会通过序列号、确认应答、重传等机制来确保数据不丢失、不重复、按顺序到达。UDP不保证数据的可靠传输,数据包可能会丢失或者乱序。
- 传输方式:TCP是面向字节流的传输方式,数据在传输时会被拆分成以字节为单位的数据包进行传输,保证数据的完整性。UDP是面向数据包的传输方式,每个数据包都是独立的,没有顺序要求。
- 适用场景:TCP适用于对数据完整性要求较高的场景,如文件传输、网页浏览等。UDP适用于对实时性要求较高、可以容忍少量数据丢失的场景,如音视频传输、在线游戏等
get 和 post 请求有哪些区别?
• GET请求只能进⾏url编码,⽽POST⽀持多种编码⽅式。
• 对参数的数据类型,GET只接受ASCII字符,⽽POST没有限制。
- 数据传输方式:
- GET:通过URL的查询字符串传输数据,数据会附加在URL的末尾,以键值对的形式出现,例如http://example.com/page?name=value。
- POST:通过请求体传输数据,数据不会显示在URL中,而是作为请求的一部分发送给服务器。
- 安全性:
- GET:数据以明文形式出现在URL中,因此不适合传输敏感信息,如密码等。
- POST:数据被包含在请求体中,不会显示在URL中,相对于GET更安全,适合传输敏感信息。
- 数据长度限制:
- GET:由于数据是附加在URL中的,URL的长度有限制,因此GET请求传输的数据量较小,一般限制在几千个字符以内。
- POST:由于数据是作为请求体发送的,因此POST请求传输的数据量较大,一般没有特定的限制。
- 缓存机制:
- GET:可以被浏览器缓存cache,
- POST:通常不会被浏览器缓存
- 幂等性:
- GET:幂等,多次请求相同的URL会得到相同的结果,不会产生副作用。
- POST:不幂等,多次请求相同的URL可能会产生不同的结果,会产生副作用,比如向数据库中添加数据。
常用HTTP请求方式有哪些 ?
HTTP/1.1协议中共定义了八种请求方式来以不同方式操作指定的资源分别是
GET
,POST
,PUT
,DELETE
,TRACE
,OPTIONS
,HEAD
,CONNECT
其中前四种会用的比较多一些 , 在RestFull风格中一般
GET
用于查询请求POST
用于新增请求PUT
用于修改请求DELETE
用于删除请求
进程跟线程的区别?
- 定义:
- 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位。每个进程都有独立的内存空间
- 线程:线程是进程中的一个执行单元,一个进程可以包含多个线程,线程共享进程的资源,如内存空间
- 资源占用:
- 进程:每个进程都有独立的内存空间和系统资源,因此进程之间的切换开销较大。
- 线程:线程共享进程的内存空间和资源,线程之间的切换开销相对较小。
- 创建和销毁:
- 进程:创建和销毁进程的开销较大,需要分配和释放独立的内存空间和系统资源。
- 线程:创建和销毁线程的开销相对较小,因为线程共享进程的资源,只需分配和释放少量的线程相关资源。
- 并发性:
- 进程:进程之间相互独立,通信需要通过进程间通信(IPC)机制来实现。
- 线程:线程之间可以共享同一进程的资源,可以直接访问进程的全局变量等共享数据,通信更加方便。
- 执行性质:
- 进程:进程可以看作是程序的一次执行,拥有独立的执行序列。
- 线程:线程是进程的执行单元,多个线程可以同时执行不同的任务,提高了程序的并发性和响应速度。
僵尸进程?
僵尸进程(Zombie Process)是指一个已经完成执行任务但其父进程尚未调用wait()或waitpid()函数来获取其状态信息的子进程。在这种情况下,子进程虽然已经终止,但是其在系统进程表中的表项依然存在,称为僵尸进程。
当一个进程结束时,操作系统会向其父进程发送一个 SIGCHLD 信号,通知父进程子进程已经终止。父进程可以通过调用wait()或waitpid()等系统调用来获取子进程的状态信息,并释放其在进程表中的资源。如果父进程没有及时处理这个信号,或者忽略了这个信号,子进程就会成为僵尸进程。
僵尸进程占用系统资源,尤其是进程表中的条目,如果系统中有大量的僵尸进程,就会影响系统的性能和稳定性。因此,及时处理僵尸进程是很重要的。
通常,父进程可以通过以下方式处理僵尸进程:
- 使用wait()或waitpid()函数等待子进程结束,并获取其状态信息,然后释放资源。
- 使用信号处理程序捕获 SIGCHLD 信号,并在信号处理程序中处理僵尸进程。
- 父进程退出时,操作系统会自动将其子进程的所有资源释放,包括僵尸进程。
IO的多路复用?
IO的多路复用(IO Multiplexing)是一种IO模型,通过在一个线程内同时监听多个IO事件,实现对多个IO操作的管理和调度,从而提高系统的IO效率。
在传统的阻塞IO模型中,每个IO操作都需要一个线程来处理,如果有大量的IO操作,就需要大量的线程,这样会导致系统资源的浪费和线程管理的复杂性。而多路复用IO模型通过一个线程同时监听多个IO事件,只有当有IO事件就绪时才会被唤醒,从而减少了线程的数量,提高了系统的性能和效率。
在Unix/Linux系统中,常用的多路复用IO函数包括select、poll和epoll。这些函数允许程序同时监视多个文件描述符(socket、文件等),并在其中任何一个文件描述符就绪时通知程序,从而实现了IO的多路复用。
虚拟内存
根据内存跟磁盘,给应用程序提供一个看似连续比实际可用物理内存大的空间
- 分页机制(Paging):
- 将物理内存和硬盘空间划分成固定大小的页面(Page)或帧(Frame),通常大小为4KB或更大。
- 操作系统将进程的地址空间划分为相同大小的页面,使得每个进程都可以看到一个连续的地址空间,称为虚拟地址空间。
- 页表(Page Table):
- 为了跟踪虚拟内存中的页面到物理内存中的位置的映射关系,操作系统维护了一个页表。
- 页表记录了每个虚拟页面对应的物理页面的位置信息,以及页面的状态(如是否在内存中)等信息。
- 页面置换算法(Page Replacement Algorithm):
- 当物理内存不足以容纳所有进程所需的页面时,操作系统需要选择哪些页面从内存中换出到硬盘上,以便为新的页面腾出空间。
- 常见的页面置换算法包括最近最少使用(LRU)、先进先出(FIFO)、最不常用(LFU)等。
- 页面访问机制:
- 当应用程序访问虚拟内存中的某个页面时,操作系统会根据页表将虚拟地址转换为物理地址。
- 如果所需的页面当前不在物理内存中,操作系统将触发页面调度(Page Fault),将页面从硬盘加载到内存中,并更新页表。
- 写回与写通过(Write-back vs Write-through):
- 虚拟内存系统通常采用写回(Write-back)策略,即当数据被修改时,首先修改的是缓存中的数据,而不是直接写入主存。
- 这样可以减少对主存的写操作,提高性能,但需要定期将被修改的页面写回到硬盘中,以保持一致性。
什么是OSI模型
应⽤层:⽹络服务与最终⽤⼾的⼀个接⼝。包括电子邮件、网页浏览、文件传输
表⽰层:数据的格式转换、加密解密和压缩解压
会话层:建⽴、管理、终⽌会话。
传输层:定义传输数据的协议端⼝号,负责端到端的数据传输。
⽹络层:转发数据包
数据链路层:比特流组织成数据帧
物理层:传输原始比特流
其中
HTTP协议
和HTTPS协议
属于应用层 ,TCP协议
和UDP协议
属于传输层协议
说一说HTTP协议
HTTP协议又称为超文本传输协议 , 是一种用于分布式、协作式和超媒体信息系统的应用层协议。底层基于TCP协议实现 !
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息
HTTP协议格式
HTTP协议分为请求和响应 , HTTP协议规定了在网络传输中的基本标和格式
请求(Request)格式
响应(Response)格式
简单总结一下 :
- 请求 : 请求分请求行, 请求头 , 请求体
- 响应 : 响应分响应行, 响应头 , 响应体
说一说HTTPS协议
HTTPS(超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性
HTTPS 默认使用 TCP 协议443端口,它的工作流程一般如以下方式:
- TCP 三次同步握手
- 客户端验证服务器数字证书
- 协商对称加密算法的密钥、hash 算法的密钥
- SSL 安全加密隧道协商完成
- 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性
- 服务端用协商的hash算法进行解密 , 保证数据完整性,保证数据不被篡改
HTTPS协议和HTTP协议有什么区别 ? 👍
- HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好
- 使用 HTTPS 协议需要到 CA(数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等
- HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包
- http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
- HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源
总结一下 : HTTPS协议比HTTP协议更加安全 , 但是传输效率和通信效率更低, 消耗服务器资源更多
常用HTTP状态码有哪些 ? 代表什么意思 👍👍👍
HTTP协议响应状态代码的第一个数字代表当前响应的类型 , 一共3位数字组成的状态代码 , 例如:
- 1xx : 消息——请求已被服务器接收,继续处理
- 2xx : 成功——请求已成功被服务器接收、理解、并接受
200 (OK): 请求处理成功
201 (Created) : 请求已被接受, 并处理成功
202 (Accepted) : 服务器已接受请求,但尚未处理
- 3xx : 重定向——需要后续操作才能完成这一请求
302 (Move Temporarily) : 重定向
304 (Not Modified) : 资源未改变 , 浏览器会从缓存获取
305 (Use Proxy) : 需要使用代理
- 4xx : 请求错误——请求含有词法错误或者无法被执行
400 (Bad Request) : 一般是请求参数错误
401 (Unauthorized) : 请求未认证
403 (Forbidden) : 请求已经被接受但是决绝执行, 一般是权限不足
404 (Not Found) : 请求资源不存在, 一般是请求路径错误
405 (Method Not Allowed) : 请求方式不被允许 , 请求方式错误
- 5xx : 服务器错误——服务器在处理某个正确请求时发生错误
500 (Internal Server Error) : 服务器内部错误, 一般是后端程序出现异常
503 (Service Unavailable) : 服务不可用, 一般出现在微服务项目, 服务调用过程中
504 (Gateway Timeout) : 网关操作, 一般网关出现问题
常用HTTP请求方式有哪些 ? 👍👍👍
HTTP/1.1协议中共定义了八种请求方式来以不同方式操作指定的资源分别是
GET
,POST
,PUT
,DELETE
,TRACE
,OPTIONS
,HEAD
,CONNECT
其中前四种会用的比较多一些 , 在RestFull风格中一般
GET
用于查询请求POST
用于新增请求PUT
用于修改请求DELETE
用于删除请求
说一说一个请求的完整过程 👍👍
http://www.baidu.com
- 浏览器查询 DNS,获取域名对应的IP地址
查询搜索浏览器自身的DNS缓存
查询搜索操作系统的DNS缓存
读取本地的Host文件
向本地DNS服务器进行查询
- 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
- TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求
- 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器(SpringMVC执行流程)
- 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源
- 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面
什么是TCP的三次握手👍👍👍
TCP协议位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采用三次握手策略
第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端
第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了(服务器端是OK的)
第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束(客户端是OK的)
什么是TCP的四次挥手👍👍👍
TCP协议在断开连接的时候, 客户端和服务端都必需单独进行关闭
当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接
收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭
有没有了解过XSS攻击 , 如何预防
XSS
全称Cross-Site Scripting(跨站脚本攻击)
,是一种代码注入攻击。
攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行
预防手段 :
- 利用模板引擎 开启模板引擎自带的 HTML 转义功能
- 避免内联事件 尽量不要使用 onLoad=“onload(‘{{data}}’)”、onClick=“go(‘{{action}}’)” 这种拼接内联事件的写法。
- 在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
- 避免拼接 HTML 前端采用拼接 HTML 的方法比较危险,采用比较成熟的渲染框架,如 Vue/React 等
- 时刻保持警惕 在插入位置为 DOM 属性、链接等位置时,要打起精神,严加防范
- 增加攻击难度,降低攻击后果 通过输入长度配置、接口安全措施等方法,增加攻击的难度,降低攻击的后果
- 主动检测和发现 可使用 XSS 攻击字符串和自动扫描工具寻找潜在的 XSS 漏洞
有没有了解过CSRF攻击, 如何预防
CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性
你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作 , 如下所示 :
- 用户已经登录了站点 A,并在本地记录了 cookie
- 在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B
- 网站B接收到用户请求后,返回一些攻击性代码 , 并发出一个请求要求访问第三方站点A
- 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行
CSRF的防御方法
- CSRF漏洞检测 , 使用一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等
- 验证 HTTP Referer(请求来源) 字段
- 增加 token并验证 ,服务器为用户的浏览器提供唯一的,随机生成的令牌,并在执行请求之前检查每个请求以查看浏览器是否将其发回
有没有了解过SQL注入攻击, 如何预防👍
SQL注入攻击是指攻击者通过构造恶意的SQL语句,利用应用程序的SQL查询功能,在数据库中执行恶意操作的一种攻击方式
例如 :
我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:
SELECT * FROM users WHERE user_id = ${user_id}
其中,user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”,那么最终的查询语句会变为:
SELECT * FROM users WHERE user_id = 1234; DELETE FROM users
如果以上语句执行,则会删除 users 表中的所有数据
避免SQL注入:
- 过滤输入内容,校验字符串
过滤输入内容就是在数据提交到数据库之前,就把用户输入中的不合法字符剔除掉。可以使用编程语言提供的处理函数或自己的处理函数来进行过滤,还可以使用正则表达式匹配安全的字符串。
- 使用预编译 , 使用jdbc中的
PreparedStatement
对SQL语句进行预编译, 参数使用?
替代 , 之后设置参数执行
在预编译的情况下,数据库服务器不会将参数的内容视为 SQL 语句的一部分来进行处理,而是在数据库完成 SQL 语句的编译之后,才套用参数运行。因此就算参数中含有破坏性的指令,也不会被数据库所运行
- 安全测试、安全审计
在开发过程中应对代码进行审查,在测试环节使用工具进行扫描,上线后定期扫描安全漏洞 , 例如 :
Havij
,Domain SQL Injector
等工具
简单介绍一下Java的IO流
IO流从流向上看,分为输入流和输出流;从操作的数据单元来看,分为字节流和字符流
**字节流的组成如下所示 : **
字符流的组成如下所示 :
思考 : 字节流如何转字符流 ? InputStreamReader OutputStreamWriter
什么是AIO、BIO和NIO
- BIO(Blocking I/O):
- BIO 是最传统的 I/O 模型,在执行 I/O 操作时会阻塞当前线程,直到操作完成或者超时。这意味着当一个线程执行 I/O 操作时,其他线程无法使用 CPU。
- 在 BIO 中,通常是通过 InputStream 和 OutputStream 来进行数据的读取和写入。
- NIO(Non-blocking I/O):
- NIO 是 Java 1.4 引入的一种更为灵活和高效的 I/O 模型。它提供了 Channel 和 Buffer 的概念,使得可以使用单个线程处理多个连接,提高了系统的并发性能。
- NIO 中引入了 Selector(选择器)的概念,通过它可以实现单线程监听多个 Channel 上的事件,从而实现非阻塞的 I/O 操作。
- NIO 主要由 java.nio 包中的类和接口实现,如 ByteBuffer、Channel、Selector 等。
- AIO(Asynchronous I/O):
- AIO 是 Java 1.7 引入的一种异步非阻塞的 I/O 模型,也称为 NIO.2。它相比于 NIO 提供了更为简洁的异步操作方式,使得可以在 I/O 操作完成后通过回调函数获取结果,而不需要手动检查状态或者轮询。
- AIO 中主要使用了 java.nio.channels.AsynchronousChannel 和 java.nio.channels.CompletionHandler 等类和接口。
什么是网站跨域, 如何解决跨域 👍
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、IP任意一个不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。
同源策略:是指协议,IP/域名,端口都要相同,其中有一个不同都会产生跨域;
如何解决跨域问题?
- 使用nginx作为代理服务器 , 对客户端请求进行统一处理, 转发到服务器
- 使用跨域资源共享CORS方案
它的总体思路是:如果浏览器要跨域访问服务器的资源,需要获得服务器的允许
- 使用
@CrossOrigin
注解配置
@RestController
@CrossOrigin
public class TestController {
@GetMapping("test")
public String test() {
return "success";
}
}
- 在配置类中配置CORS跨域
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("*")
.allowCredentials(true);
}
}
- 在Gateway网关中配置CORS跨域
spring:
application:
name: gateway #服务名称
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true
cors-configurations:
'[/**]': #拦截的请求
allowedOrigins: #允许跨域的请求
- "http://localhost:8080"
allowedMethods: #运行跨域的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许请求中携带的头信息
allowedCredentials: true #是否允许携带cookie
maxAge: 36000 #跨域检测的有效期,单位s