网络IO-概述

发布于:2023-03-11 ⋅ 阅读:(539) ⋅ 点赞:(0)

IO是什么

IO,也就是input/output,输入和输出。
我们开发各种程序,本质上都是为了数据。数据需要存储和传输,就需要IO。
平时涉及的IO主要是磁盘IO和网络IO,本系列主要记录网络IO。

基础概念-用户空间和内核空间

首先我们先来看内核态和用户态。

我们知道软件功能的实现是需要硬件支持的,软件的底层就是对硬件的操作,比如读取内存、读取文件等。但是,如果每个软件都可以直接任意操作硬件,那么势必会造成混乱。那么就需要根据软件的使用场景,来划分不同的硬件操作权限。内核态和用户态就是这么一种状态用来划分不同的资源操作权限。
image.png

在具体实现上,使用了分层和封装的方式。内核态可以调用一切系统资源,而用户态只能通过内核态封装的系统调用来操作资源。这些系统调用根据权限设计,开放一定范围的权限用于操作资源。

内核态和用户态对应的内存空间,就是内核空间和用户空间。两个内存空间之间相互隔离不影响。

我们来看断代码

int money = 100 * 30;  //我在用户空间
String text = String.format("我这个月赚了%s", money); //我是在用户空间
OutputStream outputStream = new FileOutputStream("bookKeep.txt"); 
outputStream.write(text.getBytes(StandardCharsets.UTF_8));  //我在内核空间

上面的代码中,逻辑计算时在用户空间,当进行文件操作时,转入内核空间。可以查看到outputStream.write最终调用的是native方法。
image.png

总之,我们要知道的是,内核空间和用户空间是相互独立的,我们的应用程序是在用户空间执行的。

网络IO的流程

image.png
上面这张图是从数据传输的角度,描述了读取和写入数据时的流程。
读取数据时:数据从网卡缓冲区->内核缓冲区->用户缓冲区。
写入数据时:数据从用户缓冲区->内存缓冲区->网卡缓冲区。

Socket

那么在具体代码层面,我们怎么进行操作呢?
从前面的内核空间和用户空间的描述中可以知道,我们的的应用程序是在用户空间内工作的,如果需要操作资源,就需要通过系统调用来进入内核空间,而这个系统调用调用就是Socket。Socket是操作系统提供给应用程序的一组操作网络资源的接口。

用一张图表示:
Socket

Socket的流程:
image.png

总结

本篇文章是网络IO的第一篇,主要讲述了网路IO的一些基础概念,包括内核空间-用户空间、网络IO的流程以及Socket。重点是TCP/IP网络体系、内核空间-用户空间以及Socket的关系。后面我们将开始讲述各种网络IO模型。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到