Linux的核心将所有外部设备作为要操作的文件。文件的读取操作将调用提供的系统命令并返回一个。也将有一个相应的描述符,用于读取和编写套接字,称为它。描述符是指向内核中的结构的数字。
无论是Java的IO库还是Netty等网络框架,它最终都是调用操作系统底层的功能。
Linux网络编程提供以下功能:
插座功能
套接字功能用于创建套接字,并且执行成功返回到SocketFD。
绑定函数
套接字函数指定协议类型和服务类型,但未指定特定的套接字地址。绑定功能用于将套接字的套接字地址绑定到Scoket函数。
聆听功能
侦听功能开始收听套接字,并等待客户端连接。SockFD指定监视套接字。侦听功能将创建一个监视队列以存储要处理的客户端连接,积压的大小指定了队列。
接受功能
调用Accept函数以建立与客户的连接。接受将返回新的连接scocke。后面的 - 派对可以使用此插座进行交流。
连接功能
客户端调用套接字函数以创建套接字插座,然后使用连接函数连接服务器。
关闭功能
关闭创建的插座插座。
让我们看看网络编程中的功能如何在客户端服务器通信中起作用。
熟悉TCP的机制三次,三次握手:
队列的大小是按系统参数设置的,默认值为512.有一个网络攻击是建立大量的半连接状态请求,然后将其丢弃,这会导致Syn排队不保存实现攻击服务器目的的其他正常请求。
队列的大小是通过系统参数设置的,并获取较小的值。如果接受队列已满,则服务器将向客户端发送错误消息,表明拒绝连接。
网络编程的基本模型是客户端/服务器模型,即在两个进程之间进行通信。在它们之间,服务器提供地址信息(IP和端口)。客户通过三个握手建立与服务器的连接。该连接已成功建立,双方可以通过网络进行通信。
在传统的阻止IO模型中,负责约束IP地址,启动监视端口并启动连接操作。请查看客户端/服务器的通信过程。
在Linux操作系统系统中,该过程分为两种类型,一种是操作系统本身的内核类过程,该过程也称为操作系统过程;用户的自定义过程称为用户流程。为了保护系统免受应用程序破坏,操作系统设置和操作系统的两个状态。
工作系统是管理诸如CPU,内存,硬盘,网络设备,输入和输出之类的设备。内核状态下运行的过程可以派遣CPU,分配内存回收内存,并接受键和鼠标的中断信号。
在用户状态下运行的许多过程都无法执行硬件操作,并且某些容易出现安全问题的操作仅限于只能执行内核状态,例如I/O操作,修改基础地址寄存器的内容,等等。。应用。此过程将涉及用户模式和内核状态的切换。
根据UNIX网络编程中I/O模型的分类,UNIX提供了5个I/O模型。
阻止I/O模型
线程启动IO请求后,我始终阻止IO,直到准备好缓冲区数据,然后输入下一步。对于网络通信,这是一种响应的方式。阻止数据包的缓冲区,直到将其复制到用户过程中,在此期间,它将始终被阻止并等待。
非块I/O模型
申请过程启动系统调用。如果内核还没有准备好准备数据,它将立即返回错误代码而不会阻止。返回后,申请过程可以做其他事情。基因,申请过程需要通过系统调用连续启动。查询检查内核数据是否已准备就绪。
当数据尚未准备就绪时,非块IO不会阻塞,并且数据复制过程仍然被阻止。
I/O重用模型
提供Linux。该过程可以将一个或多个调用到系统,然后阻止,然后返回任何FD。
阻止IO和非块IO,如果您监视了多个FD,则需要在同一时间打开多个线程。通过SELECT/POURL/EPOLL,单个线程可以具有监视多个连接的能力。
信号驱动器I/O型号
通过注册Sigio信号信号的信号相关函数来聆听FD的应用程序。调用注册后,应用程序可以立即返回执行。当fd准备就绪时,通过生成Sigio信号来启动应用程序信号的呼叫相关功能。
信号驱动IO之后,在生成信号后,应用程序仍需要阻止等待数据以读取用户空间。
异步I/O
在异步IO模式下,可以在调用系统应用后立即返回应用程序。复制数据后,核心将信号发送到应用程序以触发应用程序逻辑。
CPU也执行异步IO数据副本的过程。直到副本完成后才通知该应用程序,因此整个过程是非封锁的。
当需要使用多个客户端的连接时,可以使用多线程或I/O Multi -Road Reuse技术。在性能和可扩展性方面,Multi -Threading非常有限。IO Multi -Road Reuse技术可以将多个iOS阻止到相同的封锁,因此系统可以在单个线程时同时处理多个客户端请求。
目前,可以使用支持IO多路重复使用的系统调用。Epoll已成为高性能网络服务器的必不可少的技术。原因如下:
有很多方法可以通往爪哇io。基于不同的IO抽象模型和交互方法,它们可以简单地分为生物,Nio,AIO。
Bio的全名是JDK1.4之前的传统IO模型,该模型本身就是一个模型。
生物的抽象位于袋中。它基于流模型,并提供了我们一些最著名的IO函数,例如文件抽象,输入和输出流。还分类以同步IO类库,因为网络通信也是IO行为。
生物的优点是代码相对简单,直观,简化了上层的应用程序开发,缺点是IO效率和可伸缩性受到限制,并且很容易成为大量的应用程序性能。
使用同步和阻止API在以下内容中实现简单的客户端服务器网络通信。
该程序的要点是:
在通过线程池处理客户端请求的程序中,提高并行能力,这实际上是一个伪-Weiri I/O模型。使用线程池也可以避免频繁地创建并销毁头顶上的线程。如果每个请求同时阻止一个新线程来处理该线程,则在很高的并发情况下,机器资源很快就会耗尽,并且性能也很低。
这种IO工作方法类似于下面的图。每个客户端连接都需要创建一个套接字,并将其移交给线程池中的线程以处理:
此伪-PSEUDO -Step I/O无法从根本上解决由同步I/O引起的通信阻塞问题。由于I/O操作是同步的,一旦一个方响应缓慢,另一方将被阻止很长时间。可能是成千上万的。目前,线程资源变得非常紧张,线程的上下文开销将变得显而易见,并且性能将急剧下降。这是同步阻塞的低扩展缺点。
该框架是在Java 1.4中引入的。全名是,主要目标是允许Java支持非屏蔽I/O。
Nio的抽象位于包装中,该软件包提供了新的抽象,例如频道,选择器,缓冲区,并且可以构建IO程序。同时,它提供了靠近操作系统底层的高性能数据操作方法。
Java Nio系统的核心分为三个部分:
与套接字和serversocket类相对应,NIO提供了两个不同套接字通道的实现。BELOWBELOW用Nio:Nio:Nio:Nio:
可以看出,Nio大致分为这些步骤:
可以看出,生物的代码是一种同步阻止模式,因此需要多线程多线程处理。并且NIO使用单个线程旋转事件的机制来决定通过有效定位通道做什么。仅选择阶段是阻塞性的。应用的扩展能力得到了极大的提高。
这种IO工作方法类似于以下图:
在Java 7中,Nio进一步改进了,也就是说,引入了IO方法,也称为(异步IO)。异步IO操作是基于它的,可以简要地理解,该操作直接返回而无需阻止该操作。。后台处理完成后,操作系统将通知以下工作的相应线程。
AIO是真正意义上的异步非块IO模型。Bio和Nio要求用户线程及时检查,检查IO缓冲区数据是否准备就绪,占用应用程序线程资源。在事实线程中。真正的理想异步非块IO应该允许内核系统完成。用户线程只需要告诉内核。当缓冲区准备就绪时,请通知我或执行我交给您的回调函数。
本文参考: