网络编程的基本概念

网络编程是编写服务器程序不可或缺的部分。 高性能的服务器程序一定都会有好的网络处理程序,下面就来谈一谈网络编程的基本概念。

凡是网络编程,几乎都离不开socket。socket分为阻塞与非阻塞两种。阻塞的socket在调用读写接口是,会一直阻塞到socket上有可读数据,或者socket可以写入数据。而非阻塞socket,则会立即返回,不管socket是否可以读写。举个简单的例子,你去咖啡店买咖啡,发现前面排了很多人,对于阻塞模型来说,就是你会排队一直等待。非阻塞模型,就是你看到要排队,你就走了去干别的事了。很明显,对于服务器来说,阻塞模型是严重影响服务器性能的。大部分情况下,都会使用非阻塞的调用

对于,阻塞与非阻塞的socket,又可以引申出两个概念,同步与异步。很多同学会混淆这两种说法,其实还是有一些区别的。在客户端编程时,当要访问网络资源,都会调用一些已经封装好的接口。同步接口就是说,调用接口时会一直等到有结果才返回;异步接口则是立即返回,等待有数据时,通过设置的回调函数通知调用者结果。同步并不等于阻塞的socket,异步也并不等于非阻塞的socket。不管是同步接口还是异步接口,都可以通过阻塞或是非阻塞的socket来实现。同样以买咖啡的例子来说明同步与异步的区别:同步就是你一直排队等你买到咖啡为止,异步就是你发现排队人很多先去干别的事了,等到前面没人了服务员会叫你过去。就是这样

对于linux来说,socket有这样几种使用方式:阻塞,非阻塞(I/O复用),信号触发,异步

服务器程序,一般不会使用阻塞方式,信号触发也用得不多。较常见的就是I/O复用(select, poll, epoll),异步i/o这两种。我们继续来聊聊i/o复用。

对于服务器来说,每个连接的客户端都对应着一个socket,但是不代表一个客户端占用一个端口,这点千万要注意。服务器能处理多少客户端,是由文件描述符的数量来说的,其实就是一个int类型的值。显然这并不是瓶颈,起决定因素的往往是 内存,多线程/进程模型,以及事件处理方式。这里重点说说事件处理方式。服务器处理成千上万的客户端连接,说到底就是处理这些socket上的读写事件。那么如何高效的处理这么多的连接呢? 还是以咖啡店的例子来说,刚开始是一个服务员处理一个顾客的需求,但是顾客越来越多,不可能有那么多服务员。于是一个服务员开始处理多个顾客。顾客付完钱,就找桌子坐下来玩手机了,没必要在那排队干等着。等你的咖啡好了,服务员通知你去取就行了。如果把顾客看作客户端,那么顾客使用的是异步接口。服务员当作服务器,使用的是I/O复用,即一个线程/进程处理好多个顾客的请求。于是又诞生了两种高效的事件处理模式:reactor与proactor。这两种模式的区别是什么,在书本看到的说法是,reactor关注的是I/O就绪事件,proactor关注的是I/O完成事件。到底是什么意思?其实大多数人接触到的可能都是I/O复用,这就是典型的reactor模式,即需要应用程序自己调用socket的读写接口来处理数据。而proactor则是直接告诉应用程序,哪个socket上来了什么数据,你直接处理就行了。怎么样,这么说明白了吗?还不明白,那我们再用买咖啡的例子来打比方。在买完咖啡后,你在那玩手机。把咖啡比作是数据,取咖啡比作是一个读写过程,喝咖啡当作是处理数据过程。reactor模型是,服务员大声喊,xxx咖啡好了,这时你就要自己去取咖啡(读过程),然后再回来喝(处理过程),喝完了你得自己再送回去(写过程)。而proactor则是,服务员直接把你的咖啡端到桌子上,你负责喝就行了。这样就很明显可以看出,proactor省略了应用程序的读写过程,一般来说proactor都要依赖于异步的I/O.

时间: 2024-08-07 19:43:41

网络编程的基本概念的相关文章

Java Socket 网络编程心跳设计概念

Java Socket 网络编程心跳设计概念 1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.一般是用来判断对方(设备,进程或其它 网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开.基本原因是服务 器端不能有效的判断客户端是否在线也就是说,服务器无法区分客户端是长时间在空闲,还是已经掉线的情况.

网络编程的基本概念,TCP/IP协议简介

8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机.而TCP层则提供面向应

17、第七周-网络编程 - 协程概念介绍、协程gevent模块并发爬网页

协程,又称微线程,纤程.什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销(注解:"原子操作(atomic operation)是不需要synchr

12.1-全栈Java笔记:网络编程的基本概念

什么是计算机网络? 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件.软件.数据信息等资源. 计算机网络的主要功能: 资源共享 信息传输与集中处理 均衡负荷与分布处理 综合信息服务 (www/综合业务数字网络 ISDN) 什么是网络通信协议? 计算机网络中实现通信必须有一些约定即通信协议,对速率.传输代码.代码结构.传 输控制步骤.出错控制等制定标准. 网络通信接口: 为了使两个结点之间能进行对话,必须在

C#网络编程(基本概念和操作) - Part.1

引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助.如果想要更加深入的内容,可以参考相关书籍. 本文是该系列第一篇,主要讲述了基于套接字(Socket)进行网络编程的基本概念,其中包括TCP协议.套接字.聊天程序的三种开发模式,以及两个基本操作:侦听端口.连接远程服务端:第二篇讲述了一个简单的范例:从客户端传输字符串到服务端,服务端接收并打印字符串,将字符串改为大写,然后再将字符串回发到客

[转]C#网络编程(基本概念和操作) - Part.1

本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part1.aspx 引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助.如果想要更加深入的内容,可以参考相关书籍. 本文是该系列第一篇,主要讲述了基于套接字(Socket)进行网络编程的基本概念,其中包括TCP协议.套接字.聊天程序的三种开发模式,以及

C#网络编程(基本概念和操作)

C#网络编程(基本概念和操作) - Part.1 引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助.如果想要更加深入的内容,可以参考相关书籍. 本文是该系列第一篇,主要讲述了基于套接字(Socket)进行网络编程的基本概念,其中包括TCP协议.套接字.聊天程序的三种开发模式,以及两个基本操作:侦听端口.连接远程服务端:第二篇讲述了一个简单的范例:从客户端传输字符串到服务端,服务端接收并打

初探网络编程

网络编程是Linux开发中的重要部分,Linux环境网络编程是基于Socket的C语言编程,Socket本意是插座,它在网络中描述不同计算机之间通信的方式.网络通信中可以使用TCP或者UDP协议,对于我们来说不会太关心协议本身的细节,而是更关注不同主机之间传输的过程,因此制定了一种用于网络传输数据的编程接口,称为套接字(Socket). Socket编程接口内容很多,我自己看了一部分之后感觉学习过程中需要分析数据通信的过程,理解网络中的基础知识才不至于混肴.下面是一些网络编程的基本操作. 1.网

Java网络编程和NIO详解3:IO模型与Java网络编程模型

Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址