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

探索,java,通信,面试,奥秘,揭秘,io,模型,选择器,网络协议,了解,必备,知识点 · 浏览次数 : 261

小编点评

**TCP的三次握手和四次挥手** **三次握手** * 客户端发送三个连接请求包,每个包包含一个数据包和一个标志字段。 * 服务端在收到第一个请求包后,发送一个确认包,并将标志字段设置为接收数据的标志。 * 客户端再次发送一个请求包,验证服务端的响应。 * 如果服务端再次响应,连接成功。 **四次挥手** * 客户端发送一个连接请求包,包含一个数据包和一个标志字段。 * 服务端在收到第一个请求包后,发送一个确认包,并将标志字段设置为接收数据的标志。 * 服务端再次发送一个请求包,验证客户端的响应。 * 如果客户端再次响应,连接成功。 * 客户端发送一个最后确认包,关闭连接。 **为什么采用三次握手而不是两次握手呢?** 三次握手比两次握手更加可靠,因为它确保了服务端在收到第一个请求包后发送确认包。如果服务端在发送确认包之前收到其他数据包,客户端就会认为连接失败。

正文

了解常见的TCP/UDP

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

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

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

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

了解BIO、NIO、AIO

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

image

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

image

以下是使用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的基础上,通过另外的线程来处理业务的返回值,从而实现异步操作。

image


JAVA NIO的核心组件

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

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

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

image

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模型、选择器和网络协议,了解面试中的必备知识点!相似的内容:

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

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

Function源码解析与实践

作者:陈昌浩 1 导读 if…else…在代码中经常使用,听说可以通过Java 8的Function接口来消灭if…else…!Function接口是什么?如果通过Function接口接口消灭if…else…呢?让我们一起来探索一下吧。 2 Function接口 Function接口就是一个有且仅有

Java 集合中的排序算法浅析

排序是一个Java开发者,在日常开发过程中随处可见的开发内容,Java中有丰富的API可以调用使用。在Java语言中,作为集合工具类的排序方法,必定要做到通用、高效、实用这几点特征。主要探讨java中排序方法所使用的算法,以及那些是值得我们学习和借鉴的内容。文中如有理解和介绍的错误,一起学习,一起探讨,一起进步。

【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用

前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入。在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念。本文将详细介绍 SqlSessionTemplate 和 SqlSessionDaoSupport,并

JVM调优篇:探索Java性能优化的必备种子面试题

本文将带你深入了解JVM调优的重要性、常见问题以及一些实用的调优工具和方法,助你在面试的过程中轻松应对

买彩票能中大奖?用Java盘点常见的概率悖论 | 京东云技术团队

引言 《双色球头奖概率与被雷劈中的概率哪个高?》 《3人轮流射击,枪法最差的反而更容易活下来?》 让我们用Java来探索ta们! 悖论1:著名的三门问题 规则描述:你正在参加一个游戏节目,你被要求在三扇门中选择一扇:其中一扇后面有一辆车;其余两扇后面则是山羊。你选择了一道门,假设是一号门,然后知道门

初步探索GraalVM——云原生时代JVM黑科技

1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但是想要享受这些功能带来的提升都需要一段时间的运行来达到最佳性能,总的来说Java是面向大规模、长时间使用的服务端应用而设计的。 云原生时代,J

探索Redis与MySQL的双写问题

本文已收录至GitHub,推荐阅读 👉 Java随想录 微信公众号:Java随想录 原创不易,注重版权。转载请注明原作者和原文链接 目录双写一致问题缓存读写策略Cache-Aside Pattern(旁路缓存模式)Read/Write Through Pattern(读写穿透模式)Write Be

Java CompletableFuture 异步超时实现探索

JDK 8 是一次重大的版本升级,新增了非常多的特性,其中之一便是 CompletableFuture。自此从 JDK 层面真正意义上的支持了基于事件的异步编程范式,弥补了 Future 的缺陷。 在我们的日常优化中,最常用手段便是多线程并行执行。这时候就会涉及到 CompletableFuture 的使用。

[转帖]初步探索GraalVM——云原生时代JVM黑科技

https://baijiahao.baidu.com/s?id=1749705890892955339&wfr=spider&for=pc 1 云原生时代Java语言的困境 经过多年的演进,Java语言的功能和性能都在不断的发展和提高,诸如即时编译器、垃圾回收器等系统都能体现Java语言的优秀,但