了解常见的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. logstash增量同步mysql数据到es

    本篇本章地址:https://www.cnblogs.com/Thehorse/p/11601013.html 今天我们来讲一下logstash同步mysql数据到es 我认为呢,logstash是众 ...

  2. awk判断整除(包含小数和负数)

    awk判断整除常用的方法是用内置的int或者求余数的算符% 被整数整除 输出0-100之间能被9整除的整数 使用 num/9==int(num/9) 的判断方法可以很好实现. awk 'BEGIN{ ...

  3. Grafana 系列-统一展示-3-Prometheus 仪表板

    系列文章 Grafana 系列文章 知识储备 Prometheus Template Variables 你可以使用变量来代替硬编码的细节,如 server.app 和 pod_name 在 metr ...

  4. 2020-10-06:java中垃圾回收器让工作线程停顿下来是怎么做的?

    福大大答案2020-10-06: 简单回答:安全点,主动式中断. 中级回答:用户线程暂停,GC 线程要开始工作,但是要确保用户线程暂停的这行字节码指令是不会导致引用关系的变化.所以 JVM 会在字节码 ...

  5. Salesforce LWC学习(四十四) Datatable 显示日期类型的有趣点思考

    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_sale ...

  6. Django4全栈进阶之路18 项目实战(用户管理):user_edit.html用户编辑画面设计

    1.模块 {% extends 'base.html' %} {% block content %} <!-- 编辑用户表单 --> <div class="card mt ...

  7. cv学习总结(11.21-11.27)

    本周彻底完成了CNN的全部内容,包括CNN的原理,代码实现等.CNN是一种神经网络的framework,跟connected_layer相比,更加侧重于能够保持原来的空间结构不变:我们输入的图片是一个 ...

  8. Linux常用磁盘管理命令详解

    du du命令用于查看文件和目录磁盘的使用空间. 命令语法:du [参数] [文件或目录名称] 参数说明: 参数 说明 -a 列出所有的文件与目录容量. -h 以G.M.K为单位,返回容量. -s 列 ...

  9. VS code 的安装

    VS code 的安装 Win10环境配置(一)--C\C++篇 Win10环境配置(二) --Java篇 安装前先 ,完成环境的配置 1.工具准备 官网下载:Visual Studio Code 2 ...

  10. 【TVM模型编译】1. onnx2relay.md

    上一篇介绍了onnx模型在tvm中优化的总体流程. 在这一篇中,介绍onnx模型到relay模型的转换流程,主要涉及了以下几个方面: onnx算子到relay算子转换 relay算子实现 这一篇介绍o ...