Java网络编程Socket原理
用户态和内核态
用户态和内核态主要是基于操作系统来说的。
内核态:内核态其实可以直接理解为内核或者操作系统,主要是控制CPU或者磁盘、网卡等硬件设备这些资源。
用户态:用户态是权利有限的程序,我们可以理解为不能直接使用CPU或者磁盘、网卡等资源的程序,我们写的大多数程序运行在用户态,比如JVM。
为什么要有用户态和内核态?
主要为了集中管理和调配资源以及保护资源和系统。毕竟CPU和内存以及IO设备这些资源任何程序都能随便调用和访问,对于这些资源本身来说就是一种危险。
往往我们的系统的资源是固定的,例如内存2G,CPU固定,磁盘2TB,网络接口固定。所以就需要操作系统对资源进行有效的利用。假设某个应用程序过分的访问这些资源,就会导致整个系统的资源被占用,如果不对这种行为进行限制和区分,就会导致资源访问的冲突。Linux操作系统就将权限等级分为了2个等级,分别就是内核态和用户态。
这里就衍生出一个问题,就是应用程序本身需要访问网卡、硬盘等设备资源你的时候怎么访问?操作系统提供了一个叫做系统调用的接口便于我们能访问网络设备。
Linux Socket
Liunx Socket其实就是上面所说的内核提供给用户程序的一个系统调用接口。应用程序通过调用内核态的Socket函数接口来完成网络通信,这个过程也叫做用户态到内核态的切换。所以java中我们使用的网络通信实际是调用了内核提供给我们的的Socket函数接口。
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,只调用socket接口来使用下层TCP/IP提供的服务。
整体流程如下: