了解常见的TCP/UDP

TCP(Transmission Control Protocol)是一种面向连接的可靠的传输协议。类似于打电话,它通过建立一个连接和保证数据的可靠传输来提高通信的可靠性。然而,由于要确保数据的可靠性,TCP协议会增加网络负担,效率相对较低。

UDP(User Datagram Protocol)是一种无连接、不可靠的传输协议。类似于广播,UDP协议可以实现一对多的通信,且由于没有连接的建立和数据的确认,所以传输效率相对较高。然而,由于缺乏连接和确认机制,UDP的可靠性较差。

在了解TCP和UDP之后,常见的面试题包括TCP的三次握手和四次挥手。为什么要采用三次握手而不是两次握手呢?这是因为网络传输本身具有不稳定性,例如网络超时和网络阻塞等问题。如果只进行两次握手,当服务端返回第二次握手给客户端后,无法确定客户端是否成功建立连接。因此,必须进行第三次握手,以确保客户端接收到了连接请求。否则,如果客户端由于网络原因导致丢失了此次连接请求,服务器将一直等待该连接的空闲超时才会关闭请求,这将严重消耗服务器资源。

四次挥手也是类似于三次握手的原因。由于网络传输的不稳定性,断开连接时需要确保双方都收到断开请求。在四次挥手中,首先客户端发送断开连接请求,然后服务端发送确认收到请求的消息,接着服务端发送断开连接请求,最后客户端发送确认收到请求的消息,完成连接的断开。这样可以确保双方都能正确处理断开连接的操作。

了解BIO、NIO、AIO

BIO是最简单的一种I/O模型,它采用同步阻塞方式进行通信。每个客户端连接都需要独立的线程进行处理,当有大量的并发请求时,线程数量会急剧增加,导致资源消耗增加,性能下降。

NIO是相对复杂的一种I/O模型,它使用了Channel、Selector和Buffer来实现非阻塞的通信。通过Selector的多路复用机制,可以使用一个线程处理多个客户端连接,从而提高并发能力。但是,NIO适合处理短请求,如果长时间占用I/O,可能会导致服务器资源耗尽。

以下是使用NIO实现一个简单的服务器示例:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator; public class NioServerExample {
public static void main(String[] args) throws IOException {
// 创建ServerSocketChannel,并绑定端口
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(8080));
serverSocketChannel.configureBlocking(false); // 创建Selector,并将ServerSocketChannel注册到Selector上
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) {
// 监听事件
selector.select(); // 处理事件
Iterator<SelectionKey> keyIterator = selector.selectedKeys().iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
keyIterator.remove(); if (key.isAcceptable()) {
// 接受客户端连接
ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
SocketChannel socketChannel = serverChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
// 读取客户端数据
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int bytesRead = socketChannel.read(buffer);
if (bytesRead == -1) {
// 客户端关闭连接
socketChannel.close();
} else {
buffer.flip();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
String message = new String(data);
System.out.println("Received message: " + message); // 响应客户端
ByteBuffer responseBuffer = ByteBuffer.wrap("Hello, client!".getBytes());
socketChannel.write(responseBuffer);
}
}
}
}
}
}

AIO相对于NIO来说简单一些,但是由于底层需要操作系统的支持,所以应用范围相对较小。AIO是异步非阻塞的I/O模型,在NIO的基础上,通过另外的线程来处理业务的返回值,从而实现异步操作。

JAVA NIO的核心组件

JAVA NIO的核心组件包括缓冲区(buffer)、通道(channel)和选择器(selector)。

  • 缓冲区用于存储客户端与服务器端交互的数据信息,
  • 而通道类似于流,每个客户端都会有一个独立的通道。
  • 选择器是多路复用的关键,它能够找出具有事件的通道,并将其交给服务器线程进行处理。

通过这些核心组件,JAVA NIO模型实现了高效的非阻塞I/O操作,提升了服务器的并发处理能力。

select、poll和epoll的比较与应用

select、poll和epoll是Linux系统中的三种I/O多路复用机制。它们的目的是为了实现高效的事件驱动编程,以便在多个I/O操作中选择可读、可写或异常事件。

文件描述符是维护进程打开文件的记录表。每个打开的文件都会被分配一个唯一的文件描述符。

  • select是最古老的机制之一,它可以同时监视多个文件描述符的状态变化。但是,select有一些缺点,例如每次调用时都需要将文件描述符集合从用户空间拷贝到内核空间,效率较低。此外,select支持的文件描述符数量有限。
  • poll是select的改进版本,它通过一个pollfd结构体数组来传递文件描述符信息给内核,避免了select中每次调用都需要拷贝的问题。poll也支持更多的文件描述符,但是随着文件描述符数量的增加,性能会有所下降。
  • epoll是在Linux 2.6内核中引入的新机制,它通过epoll_ctl和epoll_wait函数来注册和等待事件。epoll使用一个事件数组来存储被监视的文件描述符和事件状态,只需要在注册时将文件描述符添加到事件数组中,而不需要像select和poll一样在每次调用时传递整个文件描述符集合。这使得epoll在大规模并发情况下具有更高的性能。

HTTP vs HTTPS:理解两者之间的区别与安全性

安全性:

  • HTTP是明文协议,数据在传输过程中不加密,容易被第三方截获和窃听。
  • HTTPS通过使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议对数据进行加密和身份验证,提供更高的安全性。

端口号:

  • HTTP默认使用端口号80进行通信
  • HTTPS默认使用端口号443进行通信

证书:

  • HTTPS使用数字证书来验证服务器的身份。证书由可信的第三方机构颁发,用于确保通信双方的身份和数据的完整性。
  • HTTP不需要使用证书,无法验证服务器的身份。

HTTPS协议增加了服务器和客户端之间的计算和通信负担,使得服务器在处理大量请求时更容易受到压力。虽然HTTPS可以提供一定程度的安全保护,但也会增加服务器的负担,使得服务器更容易受到DDoS攻击。

总结

通过深入探索Java通信面试的奥秘,我们将揭秘Java中的三种I/O模型(BIO、NIO和AIO)、选择器(select、poll和epoll)以及网络协议(如HTTP和HTTPS),帮助您了解在面试中必备的知识点。这些知识点对于网络编程和系统安全方面的求职者来说至关重要,掌握它们将为您的职业发展打下坚实的基础!

探索Java通信面试的奥秘:揭秘IO模型、选择器和网络协议,了解面试中的必备知识点!的更多相关文章

  1. 网络协议相关面试问题-http协议相关面试问题

    HTTP协议简介: 一些基本概念: 协议:指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则. HTTP协议:超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML ...

  2. 网络协议相关面试问题-TLS与SSL握手

    HTTPS是什么? HTTPS并不是一个单独的协议,而是对工作在一加密连接(SSL / TLS)上的常规HTTP协议.通过在TCP和HTTP之间加入TLS(Transport Layer Securi ...

  3. 协程,事件驱动,异步io模型,异步网络框架

    协程是一种用户态的轻量级线程,内核不知道它的存在.协程运行于一个线程中,协程的切换是由用户控制的.线程的切换是由cpu来控制的,而协程的切换是由用户控制的.协程的执行时串行的. select/poll ...

  4. 网络协议相关面试问题-https加密算法相关面试问题

    密钥: 密钥是一种参数,它是在使用密码cipher算法过程中输入的参数,同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文.所以说算法既使公开了但是密钥参数不同其结果也是不同的,其中关于明文 ...

  5. 网络协议相关面试问题-DNS相关面试问题

    对于网络上的大部通讯都是基于TCP/IP协议的, 其中最重要的是IP协议,它是基于IP地址的,而计算机通讯只能识别IP地址,如192.168.0.1,而不能识别像咱们在浏览器敲得见名之义的" ...

  6. 网络协议相关面试问题-TCP与IP网络模型

    互联网应用的实现主要是通过分层来实现的,每一层有自己相应的功能,上层依赖于下层,具体层次如下图: 下面具体一层层来了解: 物理层 / 实体层: 也就是将电脑通过物理的手段连接起来,其实也就是01电子信 ...

  7. 从零探索Java网络编程01之 TCP/IP 与 Socket

    最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧?  一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...

  8. 深入理解JAVA I/O系列六:Linux中的IO模型

    IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大致描述了数据从外部磁盘向运行中程序的内存中移动的过程. 用户空间.内核空间 现在操作系统都是采用虚拟存储器, ...

  9. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)

    From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...

  10. 通过实例理解Java网络IO模型

    网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...

随机推荐

  1. 学习笔记——树形dp

    树形 dp 介绍 概念 树形 dp,顾名思义,就是在树上做 dp,将 dp 的思想建立在树状结构之上. 常见的树形 dp 有两种转移方向: 从叶节点向根节点转移,这种也是树形 dp 中较为常见的一种. ...

  2. Godot 4.0 文件系统特性的总结

    关于文件系统,官方文档犹抱琵琶半遮面,有一些很独特的特性并没有集中地摆出来,导致用的时候晕头转向. 这里总结了目前我发现的Godot文件系统的一些特性. 这是专门针对导出后的,因为一些操作在编辑器里面 ...

  3. vue页面中展示markdown以及katex公式

    场景 数据库中有markdown语法的字符串,需要展示为正常的页面,难点在于其中的katex数学公式 解决方式 使用showdown及其族系插件 npm i showdown npm i showdo ...

  4. iframe分栏拖拽伸缩例子

    这个标题有些绕口,鄙人愚笨,实在找不到一个比较准确的说法,总之就是: 一个页面内显示多个iframe,一个变宽,另一个就变窄,一个变高,另一个就变矮的这种可自由伸缩的效果.它们之间有一个可多拽的分隔条 ...

  5. Git&GitHub简介与入手(二)

    四.GitHub 1.建账号,仓库 https://github.com/  用邮箱在官网注册: 增加远程库的地址取别名为origin,push为推送,fetch为取回: 2.推送操作 将本地当前所在 ...

  6. 2020-11-01:rust中带move闭包和不带move闭包有什么区别?

    福哥答案2020-11-01: 1.是否是同一个变量:带move闭包,函数外和函数内的同名变量不是同一个变量.不带move闭包,函数外和函数内的同名变量是同一个变量.2.执行完闭包后:带move闭包, ...

  7. 2020-10-29:使用redis实现分布式限流组件,要求高并发场景同一IP一分钟内只能访问100次,超过限制返回异常,写出实现思路或伪代码均可。

    福哥答案2020-10-29: 简单回答:固定窗口:string.key存ip,value存次数.滑动窗口:list.key存ip,value=list,存每次访问的时间. 中级回答:固定窗口:用re ...

  8. Rocky 9 Linux 平台 vim 9.0 源码包编译安装踩坑记录

    目录 vim 9.0 部署准备环境 vim 9.0 源码包正式部署 vim 9.0 初体验 plug-vim 安装插件 在上一篇 <vim入门实战> 篇,我并没有介绍 Linux 平台源码 ...

  9. Python基础 - python解释器

    Python解释器是什么 Python解释器本身也是个程序, 它是解释执行 Python代码的,所以叫解释器. 没有它,我们的Python代码是没有办法运行的. 怎么下载安装Python解释器   官 ...

  10. Sublime Text Windows/Linux平台快捷键

    编辑 按键 对应命令 Ctrl + X 删除行 Ctrl + 行后插入 Ctrl + ⇧ + 行前插入 Ctrl + ⇧ + ↑ 上移文本/选择 Ctrl + ⇧ + ↓ 下移文本/选择 Ctrl + ...