文章目录
前言
使用微信的时候,发送文字,发送视频,发送语音,与网络io有什么关系?抖音的视频资源,如何到达你的APP?github的代码为何可以下载到本地?手机为什么可以操作家里的空调?这些场景的实现都依靠网络编程。
这里推荐一篇讲网络io的文章:3.一文读懂网络 IO 模型_网络io-优快云博客
一、网络编程是什么?
1.定义
网络编程 是指通过计算机程序与网络进行交互、进行数据传输和通信的技术。它使得不同设备(如计算机、手机、服务器等)能够通过网络互相通信,实现信息交换、资源共享和远程控制等功能。网络编程通常包括在程序中创建网络连接、发送和接收数据、处理网络协议等操作,涉及的技术和协议非常广泛,例如 TCP/IP协议、UDP协议、HTTP协议 等。
2.为什么网络编程可以使两台计算机互相传输数据?
计算机之间想实现数据传输,首先需要物理连接,如今大部分计算机都已连接到庞大的互联网,因此不用担心这点。在此基础上,只需考虑如何编写数据传输软件。而编写软件就是依靠网络编程。
3.如何进行网络编程?
操作系统提供了名为"套接字(socket)"的部件。套接字是网络数据传输用的软件设备,即便对网络数据传输原理不太熟悉,我们也能通过套接字完成数据传输。因此,网络编程又被称为套接字编程。
4.网络编程的基本要素
-
套接字(Socket): 套接字是网络编程中的基础,它提供了一种接口,让程序能够进行网络通信。程序通过套接字建立连接,发送和接收数据。常见的有:
- TCP套接字(面向连接,可靠传输)
- UDP套接字(无连接,不保证可靠性)
-
IP地址和端口:
- 每个设备在网络中都有一个唯一的IP地址,程序通过这个地址进行通信。
- 每个网络服务或应用程序通常会绑定到一个端口号(例如,HTTP通常使用80端口,HTTPS使用443端口)。
-
协议:
- TCP/IP协议:用于大多数网络通信,提供可靠的连接导向通信。
- UDP协议:用于要求低延迟、不关心数据可靠性的应用场景。
- HTTP/HTTPS协议:用于Web应用,基于TCP协议,HTTP用于网页数据传输,HTTPS是其加密版。
-
客户端和服务器:
- 客户端:发起请求的计算机或程序。
- 服务器:响应客户端请求,提供服务的计算机或程序。
5.网络编程的流程
- 创建套接字:客户端和服务器首先创建套接字,这是进行通信的基础。
- 建立连接:客户端通过套接字连接到服务器,服务器监听端口并等待客户端连接。
- 数据传输:客户端和服务器通过套接字发送和接收数据。
- 关闭连接:通信完成后,客户端和服务器关闭连接。
6.网络编程的应用场景
-
Web开发:
- 网站的前端和后端都涉及网络编程,前端通过HTTP协议向服务器发送请求,后端响应并返回数据(如HTML页面或API数据)。
-
即时通讯:
- 即时通讯软件(如微信、QQ等)使用网络编程实现实时消息的发送和接收,通常使用套接字进行通信。
-
文件传输:
- FTP(文件传输协议)和HTTP协议都涉及网络编程,用于实现文件上传和下载。
-
远程控制:
- SSH(安全外壳协议)和RDP(远程桌面协议)允许用户通过网络远程控制其他计算机,涉及网络编程实现数据交互。
-
在线游戏:
- 网络游戏需要频繁的网络编程操作,以确保多个玩家之间的数据实时同步和交互。
-
流媒体传输:
- 音频、视频的实时流媒体传输,如Netflix、YouTube等,需要基于网络编程技术来实现数据的流式传输。
二、网络io是什么?
1.定义
网络I/O(Input/Output)是指在计算机系统中,程序通过网络接口与其他计算机或设备进行数据交换的过程。它是计算机系统中输入和输出操作的一部分,特别是在涉及网络通信的场景下,数据的发送和接收都属于网络I/O操作。
-
输入(Input):程序从网络接收数据的过程。例如,客户端从服务器接收请求响应,或者从远程数据库中查询数据。
-
输出(Output):程序通过网络发送数据的过程。例如,客户端向服务器发送请求,或者应用程序向其他设备发送数据。
在计算机系统中,I/O操作涉及与外部设备(如磁盘、网络接口)进行的数据交换。网络IO需要向网卡读写数据。
三、网络io的种类
1.阻塞I/O(Blocking I/O):
- 在阻塞I/O模式下,当程序发起网络操作(如读取数据),如果数据未准备好,程序将被阻塞,直到数据可以读取或写入为止。这意味着程序会停止执行,直到I/O操作完成。
- 适用场景:简单的应用程序或低并发场景。
-
缺点:若使用单线程处理网络 IO,程序将同一时间只能服务于一个网络请求。因此,在使用阻塞 IO 时,一般会配置多线程来使用,最常见的模型是阻塞 IO+多线程,每个连接由一个单独的线程进行处理。但在 linux 中,一个程序可以开辟的线程是有限的,而且开辟线程的开销也是比较大的。
2.非阻塞I/O(Non-blocking I/O)
- 在非阻塞I/O模式下,程序发起的网络操作会立即返回,而不管数据是否准备好。如果数据不可用,程序会收到一个错误或返回状态,告知它可以稍后再尝试。这种方式使得程序可以同时处理其他任务,避免被I/O操作阻塞。NIO 主要解决了“一个线程同时处理多个连接”的问题。
- 适用场景:需要处理多个网络连接的高并发系统。
- 缺点:太多无效的系统调用,导致“用户态”和“内核态”频繁切换的系统资源浪费。
3.多路复用IO(IO multiplexing)
在阻塞IO的情况下,如果需要处理成千上万个网络IO,那么有两种方式:
- 多线程
- 使用循环去遍历多个IO
这两种方式都很低效。而非阻塞IO虽然更高效,但仍有频繁且无效的系统调用的缺点。 IO 多路复用正是为解决这个问题而产生的。
多路复用指的是什么呢?
- 多路指的是多条连接
- 复用指的是使用一条通道(比如 select 系统调用)管理多条连接
linux 操作系统支持三种 IO 多路复用的操作,分别是 select、poll、epoll ,它们都满足 IO 复用模型的基本架构,之后的系列文章会详细介绍。
总结
本文介绍了网络编程和网络io的基本概念,为后面介绍实现io多路复用的select/poll/epoll,以及reactor的原理与实现,服务器百万级并发的实现,http服务器的实现提供了基础