镇江网站建设一般多少钱怎样在网上做网站

web/2025/9/25 12:45:23/文章来源:
镇江网站建设一般多少钱,怎样在网上做网站,沈阳seo推广公司,网站空间怎么做在分布式架构中#xff0c;网络通信是底层基础#xff0c;没有网络#xff0c;也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作#xff0c;共同完成一件事情。 同样#xff0c;在大规模的系统架构中#xff0c;应用吞吐量上不去、网络存在通信延迟、我…    在分布式架构中网络通信是底层基础没有网络也就没有所谓的分布式架构。只有通过网络才能使得一大片机器互相协作共同完成一件事情。 同样在大规模的系统架构中应用吞吐量上不去、网络存在通信延迟、我们首先考虑的都是网络问题因此网络的重要性不言而喻。 作为现代化应用型程序员要开发一个网络通信的应用是非常简单的。不仅仅有成熟的api还有非常方便的通信框架。 可能大家已经忘记了网络通信的重要性本篇文章会详细分析网络通信的底层原理 1.1 理解通信的本质 如图1-1所示当我们通过浏览器访问一个网址时一段时间后该网址会渲染出访问的内容这个过程是怎么实现的呢 center图1-1/center 我想站在今天在做的同学都知道它是基于http协议来实现数据通信的这里有两个字很重要就是“协议”。 两个计算机之间要实现数据通信必须遵循同一种协议否则就像一个中国人和一个外国人交流时一个讲英语另一个讲解中文肯定是无法正常交流。在计算机中协议非常常见。 1.1.1 协议的组成 我们写的Java代码计算机能够理解并且执行原因是人和计算机之间遵循了同一种语言那就是Java如图1-2所示.java文件最终编译成.class文件这个过程也同样涉及到协议。 center图1-2 java编译过程/center 所以在计算机中协议是指大家需要共同遵循的规则只有实现统一规则之后才能实现不同节点之间的数据通信从而让计算机的应用更加强大。 组成一个协议需要具备三个要素 语法就是这一段内容要符合一定的规则和格式。例如括号要成对结束要使用分号等。语义就是这一段内容要代表某种意义。例如数字减去数字是有意义的数字减去文本一般来说就没有意义。时序就是先干啥后干啥。例如可以先加上某个数值然后再减去某个数值。 1.1.2 http协议 理解了协议的作用那协议是长什么样的呢 那么再来看图1-3的场景人们通过浏览器访问网站用到了http协议。 center图1-3 http协议/center http协议包含包含几个部分 http请求组成 状态行请求头消息主体http响应组成 状态行响应头响应正文 Http响应报文如图1-4所示那么这个协议的三要素分别是 语法 http协议的消息体由状态、头部、内容组成。语义 比如状态200表示成功404表示请求路径不存在等通信双方必须遵循该语义。时序 组成消息体的三部分的排列顺序必须要有request才会产生response。 而浏览器按照http协议做好了相关的处理后才能让大家通过网址访问网络上的各种信息。 center图1-4/center 1.1.3 常用的网络协议 DNS协议、Http协议、SSH协议、TCP协议、FTP协议等这些都是大家比较常用的协议类型。无论哪种协议本质上仍然是由协议的三要素组成只是应用场景不同。 DNS、HTTP、HTTPS 所在的层我们称为应用层。经过应用层封装后浏览器会将应用层的包交给下一层去完成通过 socket 编程来实现。下一层是传输层。传输层有两种协议一种是无连接的协议 UDP一种是面向连接的协议 TCP。对于通信可靠性要求的场景来说往往使用 TCP 协议。所谓的面向连接就是TCP 会保证这个包能够到达目的地。如果不能到达就会重新发送直至到达。 1.3 TCP/IP通信原理分析 一次网络通信到底是怎么完成的呢 涉及到网络通信那我们一定会提到一个网络模型的概念如图1-5所示。表示TCP/IP的四层概念模型和OSI七层网络模型它是一种概念模型由国际标准化组织提出来的试图让全世界范围内的计算机能基于该网络标准实现互联。 center图1-5/center 网络模型为什么要分层呢其实从我们现在的业务分层架构中就不难发现任何系统一旦变得复杂就都会采用分层设计。它的主要好处是 实现高内聚低耦合每一层有自己单一的职责提高可复用性和降低维护成本 1.2.1 http通信过程的发送数据包 由于我们的课程并不是专门来讲网络所以只是提及一下网络分层模型为了让大家更简单的理解网络分层模型的工作原理我们仍然以一次网络通信的数据包传输为例进行分析如图1-6所示。 center图1-6/center 图1-6的工作流程描述如下 假设我们要登录某一个网站此时基于Http协议会构建一个http协议报文这个报文中按照http协议的规范组装其中包括要传输的用户名和密码。这个是属于应用层协议。 经过应用层封装后浏览器会把应用层的包交给TCP/IP四层模型中的下一层也就是传输层来完成传输层有两种协议 TCP协议可靠的通信协议该协议会确保数据包能达到目的地UDP协议不可靠通信协议可能会存在数据丢失在http通信中使用了TCP协议TCP协议会有两个端口一个是浏览器监听的端口一个是目标服务器进程的端口。操作系统会根据端口来判断这个数据包应该分发给那个进程。 传输层封装完成后该数据包会技术交给网络层来处理网络层协议是IP协议IP协议中会包含源IP地址也就是客户端及其的IP和目标服务器的IP地址。 操作系统知道了目标IP地址后就开始根据这个IP来寻找目标机器而目标服务器一定是部署在不同的地方这种跨网络节点的访问需要经过网关所谓网关就是一个网络到另外一个网络的关口。 所以数据包首先需要先通过自己当前所在网络的网关出去然后访问到目标服务器但是在数据包传输到目标服务器之前需要再组装MAC头信息。 Mac头包含本地的Mac地址和目标服务器的Mac地址这个MAC地址怎么获得的呢 获取本机MAC地址的方法是操作系统会发送一个广播消息询问网关地址192.168.1.1是谁收到该广播消息的网关会回应一个MAC地址。这个广播消息是基于ARP协议实现的这个协议简单来说就是已知目标机器的ip需要获得目标机器的mac地址。(发送一个广播消息这个ip是谁的请来认领。认领ip的机器会发送一个mac地址的响应)。 为了避免每次都用 ARP 请求机器本地也会进行 ARP 缓存。当然机器会不断地上线下线IP 也可能会变所以 ARP 的 MAC 地址缓存过一段时间就会过期。 获取远程机器的MAC地址的方法也同样是基于ARP协议实现的。 完成MAC地址组装后一个完整的数据包就构成了。这个时候会把这个数据包给到网卡网卡再把这个数据包发出去由于这个数据包中包含MAC地址因此它能够到达网关进行传输。网关收到包之后会根据路由信息判断下一步应该怎么走。网关往往是一个路由器到某个 IP 地址应该怎么走这个叫作路由表。 1.2.2 http通信过程中的接收数据包 当数据包发送到网关后会根据网关的路由信息判断该数据包要传输到那个网段上。数据从客户端发送到目标服务器可能会经过多个网关所以数据包根据网关路由进入到下一个网关后继续根据下一个网关的MAC地址寻找下下一个网关直到到达目标网络服务器上。 这个时候服务器收到包之后最后一个网关知道这个网络包就是要去当前局域网的于是拿着目标IP通过ARP协议大喊一声这是谁 目标服务器就会给网关回复一个MAC地址。 然后网络包在最后那个网关修改目标的MAC地址通过这个MAC地址网络包找到了目标服务器。 当目标服务器和MAC地址对上后开始取出MAC头信息接着把数据包发送给操作系统的网络层。网络层会取出IP头信息IP头里面会写上一层封装的是TCP协议于是交给传输层来处理实现过程如图1-7所示。 在这一层中对于收到的每个数据包都会有一个回复表示服务器端已经收到了该数据包。如果过一段时间客户端没有收到该确认包发送端的 TCP 层会重新发送这个包还是上面的过程直到最终收到回复。 这个重试是TCP协议层来实现的不需要我们应用来主动发起。 center图1-7/center 为什么有了MAC层还要走IP层呢 之前我们提到mac地址是唯一的那理论上在任何两个设备之间我应该都可以通过mac地址发送数据为什么还需要ip地址 mac地址就好像个人的身份证号人的身份证号和人户口所在的城市出生的日期有关但是和人所在的位置没有关系人是会移动的知道一个人的身份证号并不能找到它这个人mac地址类似它是和设备的生产者批次日期之类的关联起来知道一个设备的mac并不能在网络中将数据发送给它除非它和发送方的在同一个网络内。 所以要实现机器之间的通信我们还需要有ip地址的概念ip地址表达的是当前机器在网络中的位置类似于城市名道路号门牌号的概念。通过ip层的寻址我们能知道按何种路径在全世界任意两台Internet上的的机器间传输数据。 1.4 详解TCP可靠性通信特性 我们知道TCP协议是属于可靠性通信协议它能够确保数据包不被丢失。首先我们先了解一下TCP的三次握手和四次挥手。 1.4.1 TCP的三次握手 两个节点需要进行数据通信首先得先建立连接。而在建立连接时TCP采用了三次握手来实现连接建立。如图1-8所示。 center图1-8/center 第一次握手(SYN1, seqx) 客户端发送一个 TCP的 SYN 标志位置1的包指明客户端打算连接的服务器的端口以及初始序号 X,**保存在包头的序列号(Sequence Number)**字段里。发送完毕后客户端进入 SYN_SEND 状态。 第二次握手(SYN1, ACK1, seqy, ACK numx1): 服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号放到Seq 域里同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1即X1。 发送完毕后服务器端进入 SYN_RCVD 状态。 第三次握手(ACK1ACK numy1) 客户端再次发送确认包(ACK)SYN标志位为0ACK标志位为1并且把服务器发来 ACK的序号字段1放在确定字段中发送给对方并且在数据段放写ISN发完毕后客户端进入 ESTABLISHED 状态当服务器端接收到这个包时也进入 ESTABLISHED 状态TCP握手结束。 1.4.2 TCP为什么是三次握手 TCP是全双工如果没有第三次的握手服务端不能确认客户端是否ready不知道什么时候可以往客户端发数据包。三次的握手刚好两边都互相确认对方已经ready。 我们假设网络的不可靠性 A发起一个连接当发起一个请求没有得到反馈的时候会有很多可能性比如请求包丢失或者超时或者B没有响应 由于A不能确认结果于是再发当有一个请求包到了B之后A并不知道这个数据包已经到了B所以可能还会重试。 所以B收到请求之后知道了A的存在并且要和我建立连接这个时候B会发送ack给到A告诉A我收到了请求包。 对于B来说这个应答包也是一个网络通信我怎么知道能不能到达A呢所以这个时候B不能很主观的认为连接已经建立好了还需要等到A再次发送应答包来确认。 1.4.3 TCP的四次挥手 如图1-9所示TCP的连接断开会通过所谓的四次挥手完成。 四次挥手表示TCP断开连接的时候,需要客户端和服务端总共发送4个包以确认连接的断开客户端或服务器均可主动发起挥手动作(因为TCP是一个全双工协议)在 socket 编程中任何一方执行 close() 操作即可产生挥手操作。 center图1-9/center 上述交互过程如下 断开的时候我们可以看到当A客户端说说“我要断开连接”就进入 FIN_WAIT_1 的状态。 B 服务端收到“我要断开连接”的消息后发送知道了给到A客户端就进入 CLOSE_WAIT 的状态。 A 收到“B 说知道了”就进入 FIN_WAIT_2 的状态如果这个时候 B 服务器挂掉了则 A 将永远在这个状态。TCP 协议里面并没有对这个状态的处理但是 Linux 有可以调整 tcp_fin_timeout 这个参数设置一个超时时间。 如果 B 服务器正常则发送了“B 要关闭连接”的请求到达 A 时A 发送“知道 B 也要关闭连接”的 ACK 后从 FIN_WAIT_2 状态结束。 按说这个时候 A 可以退出了但是最后的这个 ACK 万一 B 收不到呢则 B 会重新发一个“B 要关闭连接”这个时候 A 已经跑路了的话B 就再也收不到 ACK 了因而 TCP 协议要求 A 最后等待一段时间 TIME_WAIT这个时间要足够长长到如果 B 没收到 ACK 的话“B 说不玩了”会重发的A 会重新发一个 ACK 并且足够时间到达 B。 这个等待实现是2MSLMSL 是 Maximum Segment Lifetime报文最大生存时间它是任何报文在网络上存在的最长时间超过这个时间报文将被丢弃此时A直接进入CLOSE状态。协议规定 MSL 为 2 分钟实际应用中常用的是 30 秒1 分钟和 2 分钟等。 第一次挥手(FIN1seqx) 假设客户端想要关闭连接客户端发送一个 FIN 标志位置为1的包表示自己已经没有数据可以发送了但是仍然可以接受数据。发送完毕后客户端进入 FIN_WAIT_1 状态。 第二次挥手(ACK1ACKnumx1) 服务器端确认客户端的 FIN包发送一个确认包表明自己接受到了客户端关闭连接的请求但还没有准备好关闭连接。发送完毕后服务器端进入 CLOSE_WAIT 状态客户端接收到这个确认包之后进入 FIN_WAIT_2 状态等待服务器端关闭连接。 第三次挥手(FIN1seqw) 服务器端准备好关闭连接时向客户端发送结束连接请求FIN置为1。发送完毕后服务器端进入 LAST_ACK 状态等待来自客户端的最后一个ACK。 第四次挥手(ACK1ACKnumw1) 客户端接收到来自服务器端的关闭请求发送一个确认包并进入 TIME_WAIT状态等待可能出现的要求重传的 ACK包。服务器端接收到这个确认包之后关闭连接进入 CLOSED 状态。 【问题1】为什么连接的时候是三次握手关闭的时候却是四次握手 答三次握手是因为因为当Server端收到Client端的SYN连接请求报文后可以直接发送SYNACK报文。其中ACK报文是用来应答的SYN报文是用来同步的。但是关闭连接时当Server端收到FIN报文时很可能并不会立即关闭SOCKET因为可能还有消息没处理完所以只能先回复一个ACK报文告诉Client端你发的FIN报文我收到了。只有等到我Server端所有的报文都发送完了我才能发送FIN报文因此不能一起发送。故需要四步握手。 【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态 答虽然按道理四个报文都发送完毕我们可以直接进入CLOSE状态了但是我们必须假象网络是不可靠的有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。 1.4.4 TCP协议的报文传输 连接建立好之后就开始进行数据包的传输了。那TCP作为一个可靠的通信协议如何保证消息传输的可靠性呢 TCP采用了消息确认的方式来保证数据报文传输的安全性也就是说客户端发送了数据包到服务端后服务端会返回一个确认消息给到客户端如果客户端没有收到确认包则会重新再发送。 为了保证顺序性每一个包都有一个 ID。在建立连接的时候会商定起始的 ID 是什么然后按照 ID 一个个发送。为了保证不丢包对于发送的包都要进行应答但是这个应答也不是一个一个来的而是会应答某个之前的 ID表示都收到了这种模式称为累计确认或者累计应答cumulative acknowledgment 如图1-10所示为了记录所有发送的包和接收的包TCP协议在发送端和接收端分别拿会有发送缓冲区和接收缓冲区TCP的全双工的工作模式及TCP的滑动窗口就是依赖于这两个独立的Buffer和该Buffer的填充状态。 接收缓冲区把数据缓存到内核若应用进程一直没有调用Socket的read方法进行读取那么该数据会一直被缓存在接收缓冲区内。不管进程是否读取Socket对端发来的数据都会经过内核接收并缓存到Socket的内核接收缓冲区。 read所要做的工作就是把内核接收缓冲区中的数据复制到应用层用户的Buffer里。进程调用Socket的send发送数据的时候一般情况下是将数据从应用层用户的Buffer里复制到Socket的内核发送缓冲区然后send就会在上层返回。换句话说send返回时数据不一定会被发送到对端。 center图1-10/center 发送端/接收端的缓冲区中是按照包的 ID 一个个排列根据处理的情况分成四个部分。 第一部分发送了并且已经确认的。第二部分发送了并且尚未确认的。需要等待确认后才能移除。第三部分没有发送但是已经等待发送的。第四部分没有发送并且暂时还不会发送的。 这里的第三部分和第四部分之所以做一个区分其实是因为TCP采用做了流量控制这里采用了滑动窗口的方式来实现流量整形避免出现数据拥堵的情况。 center图1-11/center 1.4.5 滑动窗口协议 上述地址中动画演示的部分其实就是数据包发送和确认机制同时还涉及到互动窗口协议。 滑动窗口Sliding window是一种流量控制技术。早期的网络通信中通信双方不会考虑网络的拥挤情况直接发送数据。由于大家不知道网络拥塞状况同时发送数据导致中间节点阻塞掉包谁也发不了数据所以就有了滑动窗口机制来解决此问题发送和接受方都会维护一个数据帧的序列这个序列被称作窗口 发送窗口 就是发送端允许连续发送的幀的序号表。 发送端可以不等待应答而连续发送的最大幀数称为发送窗口的尺寸。 接收窗口 接收方允许接收的幀的序号表凡落在 接收窗口内的幀接收方都必须处理落在接收窗口外的幀被丢弃。 接收方每次允许接收的幀数称为接收窗口的尺寸。 1.5 理解阻塞通信的本质 理解了TCP通信的原理后在Java中我们会采用Socket套接字来实现网络通信下面这段代码演示了Socket通信的案例。 public class ServerSocketExample {public static void main(String[] args) throws IOException {final int DEFAULT_PORT 8080;ServerSocket serverSocket null;serverSocket new ServerSocket(DEFAULT_PORT);System.out.println(启动服务监听端口 DEFAULT_PORT);while (true) {Socket socket serverSocket.accept();System.out.println(客户端 socket.getPort() 已连接);new Thread(new Runnable() {Socket socket;public Runnable setSocket(Socket s){this.sockets;return this;}Overridepublic void run() {try {BufferedReader bufferedReader new BufferedReader(new InputStreamReader(socket.getInputStream()));String clientStr null; //读取一行信息clientStr bufferedReader.readLine();System.out.println(客户端发了一段消息 clientStr);BufferedWriter bufferedWriter new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bufferedWriter.write(我已经收到你的消息了);bufferedWriter.flush(); //清空缓冲区触发消息发送} catch (IOException e) {e.printStackTrace();}}}.setSocket(socket)).start();}} }在我们讲Redis的专题中详细讲到过上述通信是BIO模型也就是阻塞通信模型阻塞主要体现的点是 accept阻塞等待客户端连接io阻塞阻塞等待客户端的数据传输。 相信大家和我一样有一些以后这个阻塞和唤醒到底是怎么回事下面我们简单来了解一下。 1.5.1 阻塞操作的本质 阻塞是指进程在等待某个事件发生之前的等待状态它是属于操作系统层面的调度我们通过下面操作来追踪Java程序中有多少程序每一个线程对内核产生了哪些操作。 straceLinux操作系统中的指令 把ServerSocketExample.java去掉package导入头拷贝到linux服务器的 /data/app目录下。 使用javac ServerSocketExample.java进行编译得到.class文件 使用下面这个命令来追踪打开一个新窗口 按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互比如系统调用、信号传递、进程状态变更等。 strace -ff -o out java ServerSocketExample-f 跟踪目标进程以及目标进程创建的所有子进程-o 把strace的输出单独写到指定的文件 上述指令执行完成后会在/data/app目录下得到很多out.*的文件每个文件代表一个线程。因为Java本身是多线程的。 [rootlocalhost app]# ll total 748 -rw-r--r--. 1 root root 14808 Aug 23 12:51 out.33320 //最小的表示主线程 -rw-r--r--. 1 root root 186893 Aug 23 12:51 out.33321 -rw-r--r--. 1 root root 961 Aug 23 12:51 out.33322 -rw-r--r--. 1 root root 917 Aug 23 12:51 out.33323 -rw-r--r--. 1 root root 833 Aug 23 12:51 out.33324 -rw-r--r--. 1 root root 819 Aug 23 12:51 out.33325 -rw-r--r--. 1 root root 23627 Aug 23 12:53 out.33326 -rw-r--r--. 1 root root 1326 Aug 23 12:51 out.33327 -rw-r--r--. 1 root root 1144 Aug 23 12:51 out.33328 -rw-r--r--. 1 root root 1270 Aug 23 12:51 out.33329 -rw-r--r--. 1 root root 8136 Aug 23 12:53 out.33330 -rw-r--r--. 1 root root 8158 Aug 23 12:53 out.33331 -rw-r--r--. 1 root root 6966 Aug 23 12:53 out.33332 -rw-r--r--. 1 root root 1040 Aug 23 12:51 out.33333 -rw-r--r--. 1 root root 445489 Aug 23 12:53 out.33334打开out.33321这个文件主线程后面的一个文件shiftg到该文件的尾部可以看到如下内容。 下面这些方法都是属于系统调用也就是调用操作系统提供的内核指令触发相关的操作。 # 创建socket fd socket(AF_INET6, SOCK_STREAM, IPPROTO_IP) 5 .... # 绑定8888端口 bind(5, {sa_familyAF_INET6, sin6_porthtons(8888), inet_pton(AF_INET6, ::, sin6_addr), sin6_flowinfo0, sin6_scope_id0}, 28) 0 # 创建一个socket并监听申请的连接, 5表示sockfd50表示等待队列的最大长度 listen(5, 50) 0 mprotect(0x7f21d00df000, 4096, PROT_READ|PROT_WRITE) 0 write(1, \345\220\257\345\212\250\346\234\215\345\212\241\357\274\214\347\233\221\345\220\254\347\253\257\345\217\243\357\274\23288..., 34) 34 write(1, \n, 1) 1 lseek(3, 58916778, SEEK_SET) 58916778 read(3, PK\3\4\n\0\0\10\0\0U\23\213O\336\274\205\24X8\0\0X8\0\0\25\0\0\0, 30) 30 lseek(3, 58916829, SEEK_SET) 58916829 read(3, \312\376\272\276\0\0\0004\1\367\n\0\6\1\37\t\0\237\1 \t\0\237\1!\t\0\237\1\\t\0..., 14424) 14424 # poll, 把当前的文件指针挂到等待队列文件指针指的是fd5简单来说就是让当前进程阻塞直到有事件触发唤醒 * events: 表示请求事件POLLIN普通或优先级带数据可读、POLLERR发生错误。 poll([{fd5, eventsPOLLIN|POLLERR}], 1, -1从这个代码中可以看到Socket的accept方法最终是调用系统的poll函数来实现线程阻塞的。 通过在linux服务器输入 man 2 poll man: 帮助手册 2 表示系统调用相关的函数 DESCRIPTIONpoll() performs a similar task to select(2): it waits for one of a set of filedescriptors to become ready to perform I/O.poll类似于select函数它可以等待一组文件描述符中的IO就绪事件 通过下面命令访问socket server。 telnet 192.168.221.128 8888这个时候通过tail -f out.33321这个文件发现被阻塞的poll()方法被POLLIN事件唤醒了表示监听到了一次连接。 poll([{fd5, eventsPOLLIN|POLLERR}], 1, -1) 1 ([{fd5, reventsPOLLIN}]) accept(5, {sa_familyAF_INET6, sin6_porthtons(53778), inet_pton(AF_INET6, ::ffff:192.168.221.1, sin6_addr), sin6_flowinfo0, sin6_scope_id0}, [28]) 61.5.2 阻塞被唤醒的过程 如图1-12所示网络数据包通过网线传输到目标服务器的网卡再通过2所示的硬件电路传输最终把数据写入到内存中的某个地址上接着网卡通过中断信号通知CPU有数据到达操作系统就知道当前有新的数据包传递过来于是CPU开始执行中断程序中断程序的主要逻辑是 先把网卡接收到的数据写入到对应的Socket接收缓冲区中再唤醒被阻塞在poll()方法上的线程 center图1-12/center 1.5.3 阻塞的整体原理分析 操作系统为了支持多任务处理所以实现了进程调度功能运行中的进程表示获得了CPU的使用权当进程(线程)因为某些操作导致阻塞时就会释放CPU使用权使得操作系统能够多任务的执行。 当多个进程是运行状态等待CPU调度时这些进程会保存到一个可运行队列中如图1-13所示。 center图1-13/center 当进程A执行创建Socket语句时在Linux操作系统中会创建一个由文件系统管理的Socket对象这个Socket对象包含发送缓冲区、接收缓冲区、等待队列等其中等待队列是非常重要的结构它指向所有需要等待当前Socket事件的进程如图1-14所示。 当进程A调用poll()方法阻塞时操作系统会把当前进程A从工作队列移动到Socket的等待队列中将进程A的指针指向等待队列后续需要进行唤醒此时A被阻塞CPU继续执行下一个进程。 center图1-14/center 当Socket收到数据时等待该Socket FD的进程会收到被唤醒如图1-15所示计算机通过网卡接收到客户端传过来的数据网卡会把这个数据写入到内存然后再通过中断信号通知CPU有数据到达于是CPU开始执行中断程序。 当发生了中断就意味着需要操作系统的介入开展管理工作。由于操作系统的管理工作**如进程切换、分配IO设备需要使用特权指令因此CPU要从用户态转换为核心态。**中断就可以使CPU从用户态转换为核心态使操作系统获得计算机的控制权。因此有了中断才能实现多道程序并发执行。 此处的中断程序主要有两项功能先将网络数据写入到对应 Socket 的接收缓冲区里面(步骤 ④)再唤醒进程 A(步骤 ⑤)重新将进程 A 放入工作队列中。 center图1-15/center 1.5 Linux中的select/poll模型本质 前面在1.4节中讲的其实是Recv()方法它只能监视单个Socket。而在实际应用中这种单Socket监听很明显会影响到客户端连接数所以我们需要寻找一种能够同时监听多个Socket的方法而select/poll就是在这个背景下产生的其中poll方法在前面的案例中就讲过默认情况下使用poll模型。 先来了解一下select模型由于在前面的分析中我们知道Recv()只能实现对单个socket的监听当客户端连接数较多的时候会导致吞吐量非常低所以我们想能不能实现同时监听多个socket只要任何一个socket连接存在IO就绪事件就触发进程的唤醒。 如图1-16所示假设程序同时监听socket1和socket2这两个socket连接那么当应用程序调用select方法后操作系统会把进程A分别指向这连个个socket的等待队列中。当任何一个Socket收到数据后中断程序会唤醒对应的进程。 当进程 A 被唤醒后它知道至少有一个 Socket 接收了数据。程序只需遍历一遍 Socket 列表就可以得到就绪的 Socket。 center图1-16/center select模式有二个问题 就是每次调用select都需要将进程加入到所有监视器socket的等待队列每次唤醒都需要从等待队列中移除这里涉及到两次遍历有一定的性能开销。进程被唤醒后并不知道哪些socket收到了数据所以还需要遍历一次所有的socket得到就绪的socket列表 由于这两个问题产生的性能影响所以select默认规定只能监视1024个socket虽然可以通过修改监视的文件描述符数量但是这样会降低效率。而poll模式和select基本是一样最大的区别是poll没有最大文件描述符限制。 1.6 Linux中的epoll模型 有没有更加高效的方法能够减少遍历也能达到同时监听多个fd的目的呢epoll模型就可以解决这个问题。 epoll 其实是event poll的组合它和select最大的区别在于epoll会把哪个socket发生了什么样的IO事件通知给应用程序所以epoll实际上就是事件驱动具体原理如图1-17所示。 在epoll中提供了三个方法分别是epoll_create、epoll_ctl、epoll_wait。具体执行流程如下 首先调用epoll_create方法在内核创建一个eventpoll对象这个对象会维护一个epitem集合它是一个红黑树结构。这个集合简单理解成fd集合。接着调用epoll_ctl函数将当前fd封装成epitem加入到eventpoll对象中并给这个epitem加入一个回调函数注册到内核。当这个fd收到网络IO事件时会把该fd对应的epitem加入到eventpoll中的就绪列表rdlist双向链表中。同时再唤醒被阻塞的进程A。进程A继续调用epoll_wait方法直接读取epoll中就绪队列rdlist中的epitem如果rdlist队列为空则阻塞等待或者等待超时。 从epoll的原理中可以得知由于rdlist的存在使得进程A被唤醒后知道哪些Socket(fd)发生了IO事件从而在不需要遍历的情况下获取所有就绪的socket连接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何建一个网站教程微信网站开放

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

用asp做的网站有哪些张掖网站设计公司

全世界有3.14 % 的人已经关注了数据与算法之美软件正在统治世界。而软件的核心则是算法。算法千千万万,又有哪些算法属于“皇冠上的珍珠”呢?Marcos Otero 给出了他的看法。什么是算法?通俗而言,算法是一个定义明确的计算过程&…

网站建设月薪培训心得体会范文500字

第一步:按 shift ctrl p 第二步:然后把 > 删除 第三步:输入文件名称即可

怀化同城网站saas系统是干嘛的

摘要:PDO查询中,2个绑定操作:参数绑定与列绑定;参数绑定:bindParm() 和 bindValue();bindParm(:占位符,变量,类型常量) 类型常量默认为字符串bindValue(:占位符,值或变量,类型常量) 如果直接传值,可省略类型…

网站模板 酒类网站改版要多少钱

目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代,数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念,它们在人工智能、数据科学和信息…

营销型企业网站的含义网站免费响应建设

mysql 中的 slow log 是用来记录执行时间较长(超过 long_query_time 秒)的 sql 的一种日志工具。启用 slow log在 my.cnf 中设置[mysqld]slow_query_logonslow_query_log_filemysql-slow重启 MySQL 服务。五款常用工具mysqldumpslowmysqlslamyprofimysql-explain-slow-logmysql…

php 自动做网站点击量网站建设维护什么意思

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…

建二手车网站电商专员是做什么的

C#中结构struct能否继承于一个类class,类class能否继承于一个struct 答案是:都不能。 第一种情行,尝试结构继承类 报错:接口列表中的类型"XX"不是接口interface。 一般来说,都是结构只能实现接口&#x…

thinkphp做的网站怎么预览效果图参考网站

5.1 QThread的两种使用方式 QThread类用于创建和管理线程,它并不是线程本身。通过使用QThread,我们可以在应用程序中实现并发执行的任务,从而提高应用程序的性能和响应能力,能够有效地利用CPU资源,提高程序运行效率。且QThread创建和管理线程的方式是独立于平台的,不管是…

iis网站跳转网站开发工程师6

三高架构是指在软件系统设计与开发中,注重解决高并发性、高可用性和高性能的架构设计模式。 高并发性:指系统能够处理大量并发请求的能力。在高并发场景下,系统需要具备有效的并发处理机制,以保证系统能够快速、准确地响应大量并…

福永网站设计多少钱网站站内推广计划书

在当今数字化时代,网络已经成为我们生活和工作中不可或缺的一部分。无论是家庭网络还是企业网络,都需要有效的网络设备来实现数据通信和资源共享。而网络交换机作为一种重要的网络设备,扮演着连接和管理网络设备的关键角色。本文将探讨交换机…

搭建网站后的网址家装设计师培训课程

随着Spring框架在构建现代Web应用中的广泛应用,对于掌握如何高效地使用Spring来创建RESTful Web服务的需求日益增长。特别是在快手这样的创新和技术驱动的公司,深入理解Spring RESTful Web服务的开发不仅是通过技术面试的关键,更是在日后的工…

做的网站为什么手机上搜不到移动版网站建设

題目:給你一個字符串,在後面拼接一部分使得它變成回文串,使得串最短。輸出這個回文串。分析:KMP,dp。這裡利用KMP算法將串和它的轉置匹配,看結束時匹配的長度就可以。 因為串比较長。使用KMP比较合適&#…

大气网站建设网站集约化建设 要求

在进行鸿蒙(HarmonyOS)应用开发时,开发者需要注意一些重要的问题,以确保应用的质量、性能和用户体验。以下是一些鸿蒙APP开发中需要特别关注的问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软…

网站设计建设服务网站雪花飘落代码

前言MySQL 5.5版本之前默认的复制是异步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式。在介绍 semi sync 之前,我们先了解:半同步 Asynchronous 和 同步 Synchronous 。异步复制模式主库将已经提交的事务event 写入bin…

直播做ppt的网站有哪些创建全国文明城市工作总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 java集合框架中contains(),containsKey()和containsValue()的用法: List集合的contains()方法用于判断集合中包不包含某个元…

青海省建设厅官方网站建设云wordpress 微博组件

前言 这篇博客很久之前就想做了,一直在拖是因为觉得自己对知识点理解还没有足够的透彻。但是每当去复盘基本概念的时候又很难理清逻辑,所以觉得即便现在半吊子水平,但是也想通过博客记录一下自己肤浅的学习心得,权当是为自己巩固…

网站开发项目经验描述建设景区网站的目的

最近有一个音频转文本的需求,了解到了OpenAI的whisper模型可以实现。 Whisper 是 OpenAI 提供的一个通用语音识别模型,支持多语言的音频转文本功能,并具有较高的准确性。它的主要用途包括自动语音识别 (ASR)、语言翻译(将音频直接…

做物流的网站都有什么风险什么网站是最全的

一、前言 作为全球最具扩展性的 MQTT 消息服务器,EMQX 提供了高效可靠海量物联网设备连接,能够高性能实时移动与处理消息和事件流数据,本文将介绍如何在Ubuntu 22.04上部署MQTT服务器。我们本次选择开源版,使用离线安装方式部署。…

浏览器正能量网站免费软件网站开发能作为无形资产吗

Static 静态局部变量 结果: a作为静态局部变量,第一次进入该函数的时候,进行第一次变量的初始化,在程序整个运行期间都不释放。(因为下一次调用还继续使用上次调用结束的数值) 但是其作用域为局部作用域&…