网络编程:1. 理论基础

一、网络IO

1. IO是什么

IO是Input/Output的缩写,即输入/输出。

在计算机领域中,IO通常指计算机与外部设备进行数据交互的过程,例如从硬盘读取文件或将数据输出到打印机等。IO操作通常是比较耗时的,因为需要和外部设备进行交互。

2. 网络IO是什么

网络IO指的是网络输入/输出,即计算机通过网络和其他计算机或设备进行数据交互的过程。在网络IO中,数据被封装成数据包,并通过网络协议传输到目标地址。

3. 网络IO与IO的区别

IO(Input/Output)是指程序与外部设备(如磁盘、网络等)进行数据交互的过程。可以将IO分为两类:磁盘IO和网络IO。

网络IO与磁盘IO的主要区别在于,磁盘IO是对物理设备的读写操作,而网络IO则是通过网络协议栈的传输层和网络层来进行网络数据的收发。换句话说,磁盘IO是对本地硬件资源的访问,而网络IO则是对远程计算机的访问。

4. 五种网络IO模型

  1. 阻塞IO(blocking IO)

    1. 在Linux中,默认情况下所有的socket都是blocking
  2. 非阻塞IO(non-blocking IO)

    1. 在Linux中,可以通过设置socket使其变为non-blocking
    2. 使用如下的函数可以将某句柄 fd 设为非阻塞状态
    fcntl( fd, F_SETFL, O_NONBLOCK );
    
  3. 多路复用IO(IO multiplexing)

    1. 有些地方也称这种 IO 方式为事件驱动 IO(event driven IO),作用是检测IO是否有事件
    2. select/epoll的好处就在于单个进程就可以同时处理多个网络连接的IO
    3. 它的基本原理就是 select/epoll这个function会不断的轮询所负责的所有 socket,当某个 socket 有数据到达了就通知用户进程
  4. 异步IO(Asynchronous IO)

  5. 信号驱动IO(signal driven IO,SIGIO)

二、网络编程

1. socket是什么

socket是一种计算机网络通信的标准API,它提供了一种针对不同网络协议进行编程的方法,使得应用程序能够在不同主机之间传输数据。Socket通常包含一个IP地址和一个端口号,适用于TCP/IP、UDP等协议的通信,是实现网络通信的基础。

假设我们有一台服务器A和一台客户端B,我们想要在客户端B上发送一条消息给服务器A,然后服务器A回复一个确认消息给客户端B。这个过程可以通过以下步骤实现:

  1. 在服务器A上创建一个socket,并指定该socket的IP地址为192.168.1.100,端口号为8080
  2. 在客户端B上创建一个socket,并指定目标服务器A的IP地址为192.168.1.100,端口号为8080
  3. 客户端B通过socket连接到服务器A
  4. 客户端B向服务器A发送一条消息:“Hello, Server A!”
  5. 服务器A接收到消息后,对消息进行处理并回复一条确认消息给客户端B:“Hi, Client B! I received your message.”
  6. 客户端B接收到确认消息后关闭socket连接

2. FD是什么

FD(File descriptor),文件描述符是一个非负整数,用于标识一个打开的文件或套接字,本质上是一个索引值。

  • FD的取值范围:0~OPEN_MAX - 1
  • 在POSIX的语义中0,1,2这三个fd值被分别赋予为标准输入(STDIN_FILENO),标准输出(STDOUT_FILENO),标准错误(STDERR_FILENO)
  • 最大打开文件数通过ulimit命令查看,例如:ulimit -n

在操作系统中,每个进程都会维护一个文件描述符表,用于跟踪它所打开的文件和套接字,文件描述符可以用于读、写、关闭等操作。

在Linux系统中,标准输入、标准输出和标准错误输出分别对应文件描述符0、1和2。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

猜你喜欢

转载自blog.csdn.net/weixin_44839362/article/details/130119796