网络与 IO
Siona
网络与 IO
select()、poll()、epoll()
Java 的 IO 模型及区别
BIO、NIO、AIO
BIO、NIO、AIO 都是 Java 的 IO 模型。
✅ BIO (Blocking IO,同步阻塞I/O) 是传统的 IO 模型,它的特点是模式简单使用方便,并发处理能力低。
它在读写数据时会阻塞线程,直到数据读写完成,适用于并发不高的场景。
✅ NIO (Non-blocking IO,同步非阻塞I/O) 是 传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
它在读写数据时不会阻塞线程,而是通过轮询的方式检查是否有数据可读写,适用于并发量较高的场景。
✅ AIO (Asynchronous IO,异步非阻塞I/O) 是 NIO 的升级,也叫 NIO2 ,异步 IO 的操作基于事件和回调机制。
它在读写数据时,不需要自己手动轮询是否有数据可读写,而是交由系统完成,适用于高并发且处理较大数据量的场景。
总的来说,BIO 的并发处理能力较差,NIO 的并发处理能力较好,但使用起来较为复杂,AIO 的并发处理能力最好,但也是最为复杂的一种 IO 模型。选择适合自己场景的 IO 模型是非常重要的。
⚠️ 拓展
✅ 同步:指的是用户进程触发IO操作需要等待或者轮询的去查看IO操作执行完成才能执行其他操作.这种方式性能比较差,只有一些对数据安全性要求比较高的场景中才会使用。
✅ 异步:异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)
✅ 阻塞:所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止。
✅ 非阻塞:非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待。
Java NIO 的核心组件及作用
认证、授权
TCP、UDP
TCP 三次握手、四次挥手
OAuth2.0
SSO
嵌入式服务器
如何设计一个开放授权平台?
CSRF 攻击
HTTP、HTTPS 区别
HTTPS 如何保证安全传输
HTTP 中 GET、POST
区别 | GET | POST |
---|---|---|
请求方式 | 发送请求获取资源,请求参数在 URL 中,请求数据以查询字符串形式发送 | 发送请求提交数据,请求参数在请求体中,请求数据以消息体形式发送 |
安全性 | 不安全,参数暴露在 URL 中,容易被窥探和篡改 | 相对安全,因为请求参数在请求体中传输 |
幂等性 | 幂等,多次请求返回相同的结果,不会对服务端产生影响 | 非幂等,多次请求会对服务端造成副作用(如重复插入数据) |
缓存性 | 支持浏览器缓存,可被缓存 | 不能被浏览器缓存 |
参数长度 | 有长度限制,一般不超过2048字符 | 无限制 |
适用场景 | 用于请求数据,请求数据量较小,获取资源,查询操作,请求参数不敏感,需要缓存时使用 | 用于提交、更新数据,数据量较大或包含敏感数据时使用,或需要保证数据一定提交成功时使用 |
GET和POST是HTTP协议中最常见的两种请求方法,用于客户端向服务器发送请求并获取响应。
它们之间的区别主要体现在数据传输、安全性和使用场景等方面,因为它能够缓存、快速响应,并且具有幂等性。GET主要用于获取资源、查询操作等无副作用操作,而POST则适合于提交数据、更新操作等有副作用操作,因为它相对安全,可以处理大量数据,并且支持更多的数据类型。
浏览器发出一个请求到收到响应经历了哪些步骤?
在浏览器中输入一个 URL 后发生了什么?
一道高频的计算机网络面试题
当我们在浏览器中输入一个 URL 后发生了什么?
第 1 步
用户在浏览器中输入 URL (www.bytebytego.com) 并回车。我们首先要做的是将 URL 转换为 IP 地址。
这个从 URL 到 IP 地址的映射通常存储在缓存中,
因此浏览器会在多层缓存中查找 IP 地址:浏览器缓存、操作系统缓存、本地缓存和 ISP 缓存。
如果浏览器在缓存中找不到映射,就会请求 DNS(Domain Name System)解析器进行解析。
第 2 步
如果在任何缓存中都找不到 IP 地址,浏览器就会转到 DNS 服务器进行递归 DNS 查找,直到找到 IP 地址为止。
第 3 步
有了服务器的 IP 地址,浏览器就会向服务器发送 HTTP 请求。为了安全访问服务器资源,我们应始终使用 HTTPS。
浏览器首先通过 TCP 三次握手与服务器建立 TCP 连接。
然后向客户端发送公钥(Public Key)。
客户端使用公钥加密会话密钥(Session Key)并发送给服务器。服务器使用私钥(Private Key)解密会话密钥。
然后,客户端和服务器就可以使用会话密钥来交换加密数据。
第 4 步
服务器处理请求并发回响应。响应成功时,状态代码为 200。
响应包含 3 个部分:HTML、CSS 和 Javascript。
浏览器会解析 HTML 并生成 DOM 树。
浏览器还会解析 CSS 并生成 CSSOM 树。
然后,浏览器将 DOM 树和 CSSOM 树合并为渲染树。
浏览器渲染内容并显示给用户。

Tomcat 中为什么要使用自定义类加载器
零拷贝


零拷贝(Zero-Copy)是一种高效的数据传输技术,它可以将数据从内核空间直接传输到应用程序的内存空间中,避免了不必要的数据拷贝,从而提高了数据传输的效率和性能。
在传统的数据传输方式中,当应用程序需要从磁盘、网络等外部设备中读取数据时,操作系统需要先将数据从外部设备拷贝到内核空间的缓冲区,然后再将数据从内核空间拷贝到应用程序的内存空间中,这个过程中需要进行两次数据拷贝,浪费了大量的 CPU 时间和内存带宽。
而使用零拷贝技术,数据可以直接从外部设备复制到应用程序的内存空间中,避免了中间的内核空间缓冲区,减少了不必要的数据拷贝,提高了数据传输的效率和性能。
在网络编程中,零拷贝技术可以用于大文件的传输、网络文件系统的读写、数据库查询等场景中,提高数据传输的效率和响应速度。同时,零拷贝技术也可以减少系统内存的开销,提高系统的稳定性和可靠性。
零拷贝字面上的意思包括两个,“零”和“拷贝”:
▪ “拷贝”:就是指数据从一个存储区域转移到另一个存储区域。
▪ “零” :表示次数为0,它表示拷贝数据的次数为0。
合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域咯。
零拷贝是指计算机执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间。它是一种I/O操作优化技术。