
Linux/网络编程
文章平均质量分 72
Linux/网络编程
u013250861
这个作者很懒,什么都没留下…
展开
-
RPC(Remote Procedure Call Protocol)远程过程调用协议框架:gRPC
这里面的 build 其实是为了安装 protobuf 插件,里面其实有 2 个插件我们需要用到,分别为 protobuf:compile 和 protobuf:compile-javanano,当我们直接执行时,会生成左侧文件,其中 GreeterGrpc 提供调用接口,Hello 开头的文件功能主要是对数据进行序列化,然后处理入参和返回值。由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由 gRPC 框架实现的底层通信的关注。原创 2023-03-28 23:49:12 · 701 阅读 · 0 评论 -
Linux网络编程-工具:NetAssist、SocketTool
Linux网络编程-工具:NetAssist、SocketTool原创 2022-10-04 22:26:38 · 1674 阅读 · 0 评论 -
Linux网络编程(一):网络术语01【Mac地址(网卡标识,全球唯一)、ip地址(虚拟主机标识)、子网掩码/Netmask(结合ip来区分子网id和主机id)、端口(标识应用程序/进程)】
网络适配器:作用 收发数据mac地址 作用: 用来标识一块网卡 6个字节 物理地址。原创 2022-09-27 21:35:50 · 668 阅读 · 0 评论 -
Linux网络编程(一):网络术语02【路由、路由器(Router)、交换机、半双工/全双工、DNS服务器、局域网(LAN)、广域网(WAN)、端口、MTU(最大传输单元)】
从Hub的工作方式可以看出,它在网络中只起到信号放大和重发作用,其目的是扩大网络的传输范围,而不具备信号的定向传送能力,是—个标准的共享式设备。DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP地址串。逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。原创 2022-10-03 23:01:29 · 405 阅读 · 0 评论 -
Linux网络编程(一):网络术语03【C/S模式:性能好、客户端容易串改数据、对客户端有数据安全隐患、开发周期长】【B/S模式:性能差、客户端不容易串改数据、开发周期短】
因此,传统的网络应用程序及较大型的网络应用程序都首选C/S模式进行开发。3D画面,数据量庞大,使用C/S模式可以提前在本地进行大量数据的缓存处理,从而提高观感。只需在一端部署服务器,而另外一端使用每台PC都默认配置的浏览器即可完成数据的传输。例如,腾讯公司所采用的通信协议,即为ftp协议的修改剪裁版。B/S模式相比C/S模式而言,由于它没有独立的客户端,使用标准浏览器作为客户端,其工作。因此在开发过程中,模式的选择由上述各自的特点决定。另外,从用户角度出发,需要将客户端安插至用户主机上,对用户主机的。原创 2022-10-01 23:16:09 · 195 阅读 · 0 评论 -
Linux网络编程(二)-分层模型01:OSI 七层模型(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)【物数网传会表应】【实际开发中用TCP/IP四层模型】
定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。原创 2022-09-29 21:09:18 · 300 阅读 · 0 评论 -
Linux网络编程(二)-分层模型02:TCP/IP四层模型(应用层、传输层、网络层、链路层)【数据:发(应用层->传输层->网络层->链路层)、接(链路层->网络层->传输层->应用层)】
TCP/IP网络协议栈分为应用层(Application)、传输层(Transport)、网络层(Network)和链路层(Link)四层。一般在应用开发过程中,讨论最多的是TCP/IP模型。原创 2022-09-29 21:38:02 · 457 阅读 · 0 评论 -
Linux网络编程(三):网络通信过程【组包:应用层->传输层->网络层->链路层】---->【解包:链路层->网络层->传输层->应用层】
以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。TCP是一种面向连接的、可靠的协议,有点像打电话,双方拿起电话互通身份之后就建立了连接,然后说话就行了,这边说的话那边保证听得到,并且是按说话的顺序听到的,说完话挂机断开连接。UDP是无连接的传输协议,不保证可靠性,有点像寄信,信写好放到邮筒里,既不能保证信件在邮递过程中不会丢失,也不能保证信件寄送顺序。原创 2022-10-01 22:23:09 · 205 阅读 · 0 评论 -
Linux网络编程(四)-协议01:概述(数据传输、解释的规则)【应用层协议:HTTP、FTP...】【传输层协议:TCP、UDP】【网络层协议:IP】【链路层协议:ARP、RARP】
从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。由此,无论A、B之间传递何种文件,都是通过三次数据传输来完成。A、B之间形成了一个最简单的数据传输规则。双方都按此规则发送、接收数据。A、B之间达成的这个相互遵守的规则即为协议。这种仅在A、B之间被遵守的协议称之为。当此协议被更多的人采用,不断的增加、改进、维护、完善。最终形成一个稳定的、完整的文件传输协议,被广泛应用于各种文件传输过程中。该协议就成为一个。最早的ftp协议就是由此衍生而来。原创 2022-10-01 20:36:05 · 200 阅读 · 0 评论 -
Linux网络编程(四)-协议02:协议格式(数据包封装格式)【①应用层:HTTP、FTP、RPC;②传输层:TCP、UDP;③网络层:IP;④链路层:ARP(通过广播找ip对应的mac)】
TCP:一种面向连接的、可靠的、基于字节流的传输层通信协议。一般跨网关传输用TCP,有确认机制,比较安全,丢包重传。因为有确认机制,所以效率不如UDP。原创 2022-10-01 23:27:47 · 703 阅读 · 0 评论 -
Linux网络编程(四)-协议03-TCP协议01:通信时序【三次握手(建立连接)、传数据、四次挥手(断开连接)】【发送端以数据包为单位发送(数据包大小自定义),接收端按自定义大小滑动窗口提取数据】
TCP:一种面向连接的、可靠的、基于字节流的传输层通信协议。一般跨网关传输用TCP,有确认机制,比较安全,丢包重传。因为有确认机制,所以效率不如UDP。原创 2022-10-03 23:11:15 · 575 阅读 · 0 评论 -
Linux网络编程(四)-协议03-TCP协议02:TCP状态转换(11种状态)【netstat命令监控TCP/IP状态】【半关闭状态、2MSL(最大报文生存时间,谁先主动关闭谁等待)、端口复用】
这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及 关闭连接的四次握手过程。表示初始状态。该状态表示服务器端的某个SOCKET处于监听状态,可以接受连接。原创 2022-10-04 23:14:35 · 502 阅读 · 0 评论 -
Linux网络编程(四)-协议03-TCP协议03:心跳检测机制【TCP异常断开检测机制;若对方异常断开,本机检测不到,一直等待,浪费资源】【心跳包:setsockopt函数每隔一定时间发送探测分节】
在TCP网络通信中,经常会出现客户端和服务器之间的非正常断开,需要实时检测查询链接状态。常用的解决方法就是在程序中加入心跳机制。Heart-Beat线程这个是最常用的简单方法。在接收和发送数据时个人设计一个守护进程(线程),定时发送Heart-Beat包,客户端/服务器收到该小包后,立刻返回相应的包即可检测对方是否实时在线。该方法的好处是通用,但缺点就是会改变现有的通讯协议!大家一般都是使用业务层心跳来处理,主要是灵活可控。原创 2022-10-07 20:20:55 · 1128 阅读 · 0 评论 -
Linux网络编程(四)-协议04:数据包封装【不同层数据包称谓:①传输层(TCP/UDP):段(segment);②网络层(IP):数据报(datagram);③链路层(Mac):帧(frame)】
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。原创 2022-10-01 23:30:48 · 741 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程01:概述(不同主机进程通讯)【通用socket结构体:sockaddr】【网络字节序:报头部分大于2字节的数据需大小端转换】【一套接字包含发送、接收缓冲区】
Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是:管道主要应用于本地进程间通信;套接字多应用于网络进程间数据的传递;套接字的内核实现较为复杂,不宜在学习初期深入学习。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个原创 2022-10-04 14:40:44 · 1009 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程02:函数【socket、connect、bind、listen、accept、read/recv/recvfrom、write/send/sendto】
典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。原创 2022-10-14 23:38:21 · 573 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程03:TCP客户端流程【创“流式”套接字/socket()、连服务器/connect()、读read()/recv()、写write()/send()、关闭】
socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。只需要组应用层的数据包,底层(网络层、传输层、链路层)的包不需要人工来组,会自动组包只需要组应用层的数据包,底层(网络层、传输层、链路层)的包不需要人工来组,会自动组包不仅需要组应用层的数据包,底层(网络层、传输层、链路层)的包也需要人工来组。原创 2022-10-07 19:13:04 · 535 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程04:TCP服务端流程【创建套接字/socket()、绑固定IP和端口/bind()、监听/listen()、创建通信套接字/accept()、读写、关闭】
典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。原创 2022-10-04 22:52:40 · 2027 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程05:UDP客户端、服务端通信流程【①创建“报式”套接字/socket()、②绑定自己的IP与端口、③读/recvfrom()&写/sendto()、④关闭】
socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。只需要组应用层的数据包,底层(网络层、传输层、链路层)的包不需要人工来组,会自动组包。不仅需要组应用层的数据包,底层(网络层、传输层、链路层)的包也需要人工来组。,底层(网络层、传输层、链路层)的包不需要人工来组,会自动组包。只需要组应用层的数据包。原创 2022-10-14 22:24:39 · 650 阅读 · 0 评论 -
Linux网络编程(五)-Socket编程06:本地套接字(UNIX Domain Socket)【同一台主机的进程间通讯】【不需经网络协议栈,不需打包拆包;只是将应用层数据从一个进程拷贝到另一进程】
一、本地套接字()socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种,就是。虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。原创 2022-10-12 00:08:26 · 344 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器01:“多进程”【父进程只负责监听,子进程负责与客户端沟通】【实际开发中,不会用“多进程”实现多并发】【阻塞等待(消耗资源)】
父进程只负责监听,每来一个客户端请求就创建一个子进程来负责服务客户端。原创 2022-10-07 18:36:24 · 232 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器02:“多线程”【实际开发中,有可能使用“多线程”实现几十数量级多并发服务器】【非阻塞忙轮询(消耗CPU)】
【代码】Linux网络编程(五)-Socket编程05:“多线程”实现并发服务器【实际开发中,有可能使用“多线程”实现几十数量级多并发服务器】原创 2022-10-07 19:19:03 · 509 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器03-I/O多路复用01:select(Win、Linux)【由内核监听多个“文件描述符”的读写缓冲区变化】【受限于宏FD_SETSIZE大小(1024)】
功能:监听多个文件描述符的属性变化(读、写、异常);select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数。解决1024个以下客户端时使用select是很合适的,但如果链接客户端过多,select采用的是轮询模型,会大大降低服务器响应效率,不应在select上投入更多精力。nfds : 最大文件描述符+1readfds : 需要监听的读的文件描述符存放集合。原创 2022-10-07 22:09:36 · 358 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器03-I/O多路复用02:poll【优:没有宏FD_SETSIZE限制】【缺:每次都得将需监听的文件描述符从应用层拷到内核;每次都需要遍历数组元素才知道哪个变化】
poll功能: 监听多个文件描述符的属性变化。原创 2022-10-07 22:46:11 · 210 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll【红黑树;根节点为监听节点】【无宏FD_SETSIZE限制;不需每次都将要监听的文件描述符从应用层拷贝到内核;不需遍历树】
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。可以使用cat命令查看一个进程可以打开的socket描述符上限。如有需要,可以通过修改配置文件的方式修改该上限值。原创 2022-10-07 23:02:08 · 223 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll工作方式【①水平触发LT(默认;系统开销大;实际开发中不常用)】【②边缘触发ET+非阻塞=高速模式】
【代码】Linux网络编程(六)-高并发服务器03-多路IO复用-epoll:epoll监听socket实现高并发服务器。原创 2022-10-10 23:48:17 · 387 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器03-I/O多路复用03:epoll反应堆【对epoll的封装】【epoll使用C++封装回调函数】
是一个泛型指针,指针可以指向一块内存区域,这块区域可以代表一个结构体,既然是结构体,那么我们就可以自定义了,将我们非常需要的文件描述符,事件类型,回调函数都封装在结构体上(我们在信号一章就见识过struct sigaction上有掩码和回调函数等信息),这样当我们要监控的文件描述符对应的事件发生之后,我们去调用回调函数就可以了,这样就可以将文件描述符对应事件的处理代码梳理的非常清晰。epoll还有一种更高级的使用方法,那就是借鉴封装的思想,简单的说就是当某个事情发生了,自动的去处理这个事情。原创 2022-10-11 22:08:05 · 176 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器04:线程池【1个锁(用于锁住队列)、2个条件变量(一个用于阻塞“取任务线程”,一个用于阻塞“任务添加者线程(主线程)”)、1个任务循环队列(用于存放任务)】
线程池是一个抽象概念,可以简单的认为若干线程在一起运行,线程不退出,等待有任务处理。原创 2022-10-11 22:50:06 · 162 阅读 · 0 评论 -
Linux网络编程(六)-高并发服务器04:epoll + 线程池
【代码】Linux网络编程(六)-高并发服务器04:epoll + 线程池。原创 2022-10-12 00:02:16 · 1677 阅读 · 1 评论 -
Linux网络编程(七)-第三方库-Libevent01:安装Libevent【Ubuntu20.04】
验证是否已经安装Libevent。原创 2022-10-24 23:23:02 · 2257 阅读 · 0 评论 -
Linux网络编程(七)-第三方库-Libevent02:专注网络开发的事件库【封装了多种I/O 多路复用】【用于开发TCP服务端】【事件的底层处理框架;精简;性能高】【核心:事件驱动(触发),回调】
Libevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动(),高性能;轻量级,专注于网络,不如ACE那么臃肿庞大;源代码相当精炼、易读;跨平台,支持Windows、Linux、*BSD和Mac Os;支持多种I/O多路复用技术,epoll、poll、dev/poll、select和kqueue等;支持I/O,定时器和信号等事件;注册事件优先级。原创 2022-10-07 23:10:04 · 1019 阅读 · 0 评论 -
libevent、libev、libuv、libhv、boost.asio、poco、muduo七种echo-server实现对比
libhv是一个跨平台的类似libevent、libev、libuv的异步事件驱动库,但提供了更加接近原生的API接口和更加丰富的协议。libhv已被awesome-c收录。libhv已广泛实用在公司的IOT平台、http API服务之中,正确性、稳定性、可扩展性、性能都有保证,完全开源,请放心使用。739352073注:libhv每日一学博文为QQ群里的libhv每日一学技术分享整理所得,方便新老朋友查阅学习,该博文每隔几日会同步更新一次。原创 2022-10-07 23:45:18 · 2030 阅读 · 0 评论