一些貌似很重要的东西

Netty

作为一个学Java的,如果没有研究过Netty,那么你对Java语言的使用和理解仅仅停留在表面水平,会点SSH,写几个MVC,访问数据库和缓存,这些只是初等Java程序员干的事。如果你要进阶,想了解Java服务器的深层高阶知识,Netty绝对是一个必须要过的门槛。

有了Netty,你可以实现自己的HTTP服务器,FTP服务器,UDP服务器,RPC服务器,WebSocket服务器,Redis的Proxy服务器,MySQL的Proxy服务器等等。

如果你想知道Nginx是怎么写出来的,如果你想知道Tomcat和Jetty是如何实现的,如果你也想实现一个简单的Redis服务器,那都应该好好理解一下Netty,它们高性能的原理都是类似的。

我们回顾一下传统的HTTP服务器的原理

  1. 创建一个ServerSocket,监听并绑定一个端口
  2. 一系列客户端来请求这个端口
  3. 服务器使用Accept,获得一个来自客户端的Socket连接对象
  4. 启动一个新线程处理连接
    1. 读Socket,得到字节流
    2. 解码协议,得到Http请求对象
    3. 处理Http请求,得到一个结果,封装成一个HttpResponse对象
    4. 编码协议,将结果序列化字节流
    5. 写Socket,将字节流发给客户端
  5. 继续循环步骤3

HTTP服务器之所以称为HTTP服务器,是因为编码解码协议是HTTP协议,如果协议是Redis协议,那它就成了Redis服务器,如果协议是WebSocket,那它就成了WebSocket服务器,等等。

使用Netty你就可以定制编解码协议,实现自己的特定协议的服务器。

上面我们说的是一个传统的多线程服务器,这个也是Apache处理请求的模式。在高并发环境下,线程数量可能会创建太多,操作系统的任务调度压力大,系统负载也会比较高。那怎么办呢?

于是NIO诞生了,NIO并不是Java独有的概念,NIO代表的一个词汇叫着IO多路复用。它是由操作系统提供的系统调用,早期这个操作系统调用的名字是select,但是性能低下,后来渐渐演化成了Linux下的epoll和Mac里的kqueue。我们一般就说是epoll,因为没有人拿苹果电脑作为服务器使用对外提供服务。而Netty就是基于Java NIO技术封装的一套框架。为什么要封装,因为原生的Java NIO使用起来没那么方便,而且还有臭名昭著的bug,Netty把它封装之后,提供了一个易于操作的使用模式和接口,用户使用起来也就便捷多了。

那NIO究竟是什么东西呢?

NIO的全称是NoneBlocking IO,非阻塞IO,区别与BIO,BIO的全称是Blocking IO,阻塞IO。那这个阻塞是什么意思呢?

  1. Accept是阻塞的,只有新连接来了,Accept才会返回,主线程才能继
  2. Read是阻塞的,只有请求消息来了,Read才能返回,子线程才能继续处理
  3. Write是阻塞的,只有客户端把消息收了,Write才能返回,子线程才能继续读取下一个请求

所以传统的多线程服务器是BlockingIO模式的,从头到尾所有的线程都是阻塞的。这些线程就干等在哪里,占用了操作系统的调度资源,什么事也不干,是浪费。

那么NIO是怎么做到非阻塞的呢。它用的是事件机制。它可以用一个线程把Accept,读写操作,请求处理的逻辑全干了。如果什么事都没得做,它也不会死循环,它会将线程休眠起来,直到下一个事件来了再继续干活,这样的一个线程称之为NIO线程。

三大优点:并发高,传输快,封装

Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象,感觉和Socket建立在tcp上有点相似。

Netty主要目前应用在通信方面,如Dubbo、淘宝的RocketMQ消费生产之前的通信、

Http和Socket


网络由下往上分为
  物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
  
通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,
  三者从本质上来说没有可比性,
  socket则是对TCP/IP协议的封装和应用(程序员层面上)。
  也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,
  而HTTP是应用层协议,主要解决如何包装数据。
  关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:
  “我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容。
  如果想要使传输的数据有意义,则必须使用到应用层协议。
  应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。
  WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
  
 而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,
 而是一个调用接口(API)。
   通过Socket,我们才能使用TCP/IP协议。
  

WebSocket

WebSocket协议是基于TCP的一种新的网络协议

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)
首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解

                               
Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。



他解决了HTTP的这几个难题。
首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。
所以上面的情景可以做如下修改。
客户端:啦啦啦,我要建立Websocket协议,需要的服务:chat,Websocket协议版本:17(HTTP Request)
服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)
客户端:麻烦你有信息的时候推送给我噢。。
服务端:ok,有的时候会告诉你的。
服务端:balabalabalabala
服务端:balabalabalabala
服务端:哈哈哈哈哈啊哈哈哈哈
服务端:笑死我了哈哈哈哈哈哈哈

就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。
那么为什么他会解决服务器上消耗资源的问题呢?
其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)
本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。
Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
这样就可以解决客服处理速度过慢的问题了。

同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)

总结
虽然http也有keep-alive 长连接,但是两者并不一样,websocket是全双工可以完成推送功能。

在以前 HTTP 协议中所谓的 keep-alive connection 是指在一次 TCP 连接中完成多个 HTTP 请求,但是对每个请求仍然要单独发 header;所谓的 polling(轮询) 是指从客户端(一般就是浏览器)不断主动的向服务器发 HTTP 请求查询是否有新数据。这两种模式有一个共同的缺点,就是除了真正的数据部分外,服务器和客户端还要大量交换 HTTP header,信息交换效率很低。它们建立的“长连接”都是伪.长连接,只不过好处是不需要对现有的 HTTP server 和浏览器架构做修改就能实现。

WebSocket 解决的第一个问题是,通过第一个 HTTP request 建立了 TCP 连接之后,之后的交换数据都不需要再发 HTTP request了,使得这个长连接变成了一个真.长连接。但是不需要发送 HTTP header就能交换数据显然和原有的 HTTP 协议是有区别的,所以它需要对服务器和客户端都进行升级才能实现。


未来可能正因为它的持久连接,有可能会取代http,不过个人理解也是正因为http的短连接比较高效,用户量也大,需要反复使用资源,所以http应该还是主流,所以现在websocket比较适合做长连接的如通讯类



<think>我们正在分析用户的问题:用户希望理解总线命名及其在硬件系统中的作用,特别是U_NIC_CPU、U_NIC_PERIPH_BUS、U_NIC_GP_BUS等总线的含义和用途。 根据之前的对话历史,用户之前询问了AXI协议中的信号含义,而现在转向总线命名和硬件系统中的作用。用户提供的引用内容虽然涉及PHY、IIC和bash脚本,但似乎与当前问题关联不大。因此,我们将主要依靠硬件设计常识和总线命名惯例来回答。 在硬件系统中,总线(Bus)是用于在不同组件之间传输数据、地址和控制信号的公共通道。总线的命名通常反映了其连接的主要组件、功能或拓扑结构。常见的命名方式包括: - 以连接的组件命名(如CPU_BUS、MEM_BUS) - 以总线类型命名(如AHB_BUS、AXI_BUS) - 以功能命名(如PERIPH_BUS用于连接外设,GP_BUS用于通用外设) 用户提到的三个总线名称: 1. U_NIC_CPU 2. U_NIC_PERIPH_BUS 3. U_NIC_GP_BUS 我们可以这样解析: - "U"可能表示"Unit"或"Universal",但更常见的是在原理图或框图标识中作为器件编号前缀(如U1, U2),这里可能表示该总线属于某个单元(Unit)内部。 - "NIC"是网络接口控制器(Network Interface Controller)的缩写,因此这些总线很可能位于一个网络接口控制器的设计上下文中。 具体分析每个总线: 1. U_NIC_CPU:连接NIC和CPU的总线。通常用于CPU与网络接口控制器之间的高速数据交换和控制命令传输。例如,CPU通过该总线配置NIC的寄存器,或读取接收到的网络数据包。 2. U_NIC_PERIPH_BUS:连接NIC和外围设备(Peripheral)的总线。这里的“外设”可能指与NIC相连的其他片上外设,如DMA控制器、定时器等。该总线通常用于NIC与这些外设之间的数据传输。 3. U_NIC_GP_BUS:连接NIC的通用总线(General Purpose Bus)。这种总线可能用于连接一些通用的外设或作为备用总线,用途较为灵活。例如,连接LED指示灯、EEPROM或其他低速设备。 在硬件系统中,这些总线的作用: - 提供数据传输通道:在CPU、NIC、外设之间传递数据。 - 实现控制:CPU通过总线对NIC进行配置和状态监控。 - 连接不同组件:构建完整的系统架构。 需要说明的是,这些命名可能是特定于某个设计或公司的,因此没有绝对标准,但根据常见的命名习惯,我们可以做出合理推断。 我们将按照以下结构组织回答: 1. 解释总线命名的常见规则 2. 分别解释三个总线的含义和用途 3. 总结它们在系统中的作用 同时,根据用户要求,生成相关问题。</think>在硬件系统中,总线命名通常反映其功能、连接对象和层级结构。以下是这些总线的典型含义和用途分析: ### 一、总线命名规则解析 1. **前缀标识** - `U_`:通常表示"Unit"(单元),指代特定功能模块(如NIC网络接口控制器) - `NIC`:明确标识总线所属模块为**网络接口控制器**(Network Interface Controller) - 后缀部分:描述总线连接对象或功能类型 2. **层级关系** ```mermaid graph LR NIC[网络接口控制器] -->|U_NIC_CPU| CPU NIC -->|U_NIC_PERIPH_BUS| PERIPH[外设] NIC -->|U_NIC_GP_BUS| GP[通用设备] ``` --- ### 二、具体总线功能解析 #### 1. **U_NIC_CPU** - **含义**:连接NIC与CPU的专用总线 - **作用**: - 传输CPU对NIC的控制命令(如寄存器配置) - 传递网络数据包到CPU内存(DMA操作) - 中断信号传递(如数据到达通知) - **特性**: - 高优先级传输 - 低延迟设计 - 通常采用高速总线协议(如AXI Stream) #### 2. **U_NIC_PERIPH_BUS** - **含义**:连接NIC与**外设控制器**的总线 - **作用**: - 连接PHY芯片实现物理层通信[^1] - 对接MAC控制器处理数据帧 - 连接加密引擎等专用外设 - **特性**: - 支持标准外设协议(如APB, AHB) - 中等带宽需求 - 地址映射访问机制 #### 3. **U_NIC_GP_BUS** - **含义**:NIC的**通用外设总线**(General Purpose) - **作用**: - 连接低速配置设备(如EEPROM存储配置信息) - 支持管理接口(如I²C多主从通信)[^2] - 连接状态指示灯等辅助设备 - **特性**: - 低带宽设计 - 支持异步操作 - 通常采用简化协议(如I²C, SPI) --- ### 三、总线协同工作示例 ```mermaid sequenceDiagram CPU->>U_NIC_CPU: 发送配置命令 U_NIC_CPU->>NIC: 写入控制寄存器 NIC->>U_NIC_PERIPH_BUS: 发送数据帧到PHY U_NIC_PERIPH_BUS->>PHY: 物理层传输 PHY->>U_NIC_GP_BUS: 状态反馈(如链路状态) U_NIC_GP_BUS->>LED: 驱动状态指示灯 ``` --- ### 四、设计意义与系统作用 1. **功能隔离** - 分离高速数据流(CPU总线)与低速控制流(GP总线) - 避免外设操作阻塞核心通信(如PERIPH_BUS独立处理PHY交互) 2. **资源优化** - 按需分配带宽(CPU总线>PERIPH_BUS>GP_BUS) - 降低功耗(GP总线可动态关闭) 3. **扩展性支持** - PERIPH_BUS支持热插拔外设 - GP_BUS可挂接多种设备(温度传感器/EEPROM等) 4. **故障隔离** - 总线错误仅影响局部功能(如GP_BUS故障不影响核心传输) > ⚠️ **注意**:具体实现可能因厂商而异,需参考对应文档。例如某些设计可能将PERIPH_BUS与GP_BUS合并,或通过桥接器连接不同总线域[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值