HCIP-BGP

本贴最后更新于 1425 天前,其中的信息可能已经事过境迁

1.概述

边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 BGP 是唯一一个用来处理像因特网大小的网络的协议,也是唯一能够妥善处理好不相关路由域间的多路连接的协议。 BGP 构建在 EGP 的经验之上。 BGP 系统的主要功能是和其他的 BGP 系统交换网络可达信息。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓扑图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。

自治系统 AS(Autonomous System)

AS 是指在一个实体管辖下的拥有相同选路策略的 IP 网络。BGP 网络中的每个 AS 都被分配一个唯一的 AS 号,用于区分不同的 AS。AS 号分为 2 字节 AS 号和 4 字节 AS 号,其中 2 字节 AS 号的范围为 1 至 65535,其中 1-64511 为公有 AS 号,64512-65534 为私有 AS 号。4 字节 AS 号的范围为 1 至 4294967295。支持 4 字节 AS 号的设备能够与支持 2 字节 AS 号的设备兼容。这个编号由 IANA 分配。

clipboard.png

clipboard.png

2.特点

BGP 属于外部或域间路由协议。BGP 的主要目标是为处于不同 AS 中的路由器之间进行路由信息通信提供保障。BGP 既不是纯粹的矢量距离协议,也不是纯粹的链路状态协议,通常被称为通路向量路由协议。这是因为 BGP 在发布到一个目的网络的可达性的同时,包含了在 IP 分组到达目的网络过程中所必须经过的 AS 的列表。通路向量信息时十分有用的,因为只要简单地查找一下 BGP 路由更新的 AS 编号就能有效地避免环路的出现。BGP 对网络拓扑结构没有限制,其特点包括:

(1)实现自治系统间通信,传播网络的可达信息。BGP 是一个外部网关协议,允许一个 AS 与另一个 AS 进行通信。BGP 允许一个 AS 向其他 AS 通告其内部的网络的可达性信息,或者是通过该 AS 可达的其他网络的路由信息。同时,AS 也能够从另一个 AS 中了解这些信息。与距离向量选路协议类似,BGP 为每个目的网络提供的是下一跳(next-hop)结点的信息。

(2)多个 BGP 路由器之间的协调。如果在一个自治系统内部有多个路由器分别使用 BGP 与其他自治系统中对等路由器进行通信,BGP 可以协调者一系列路由器,使这些路由器保持路由信息的一致性。

(3)BGP 支持基于策略的选路(policy-base routing)。一般的距离向量选路协议确切通告本地选路中的路由。而 BGP 则可以实现由本地管理员选择的策略。BGP 路由器可以为域内和域间的网络可达性配置不同的策略。

(4)可靠的传输。BGP 路由信息的传输采用了可靠地 TCP 协议。BGP 四层使用 tcp 179 号端口

(5)路径信息。在 BGP 通告目的网络的可达性信息时,处理指定目的网络的下一跳信息之外,通告中还包括了通路向量(path vector),即去往该目的网络时需要经过的 AS 的列表,使接受者能够了解去往目的网络的通路信息。

(6)增量更新。BGP 不需要再所有路由更新报文中传送完整的路由数据库信息,只需要在启动时交换一次完整信息。后续的路由更新报文只通告网络的变化信息。这种网络变化的信息称为增量(delta)。

(7)BGP 支持无类型编制(CIDR)及 VLSM 方式。通告的所有网络都以网络前缀加子网掩码的方式表示。

(8)路由聚集。BGP 允许发送方把路由信息聚集在一起,用一个条目来表示多个相关的目的网络,以节约网络带宽。

(9)BGP 还允许接收方对报文进行鉴别和认证,以验证发送方的身份。

(10)BGP 主要用于大型网络、大型集团、运营商、银行、国家电网、国家与国家之间的路由。

(11)BGP 可以跨路由器建立邻居(因为 BGP 发送的报文都是单播)

(12)一台路由器只能启用一个 BGP 进程

3.运行方式

如图 1 所示,BGP 按照运行方式分为 EBGP(External/Exterior BGP)和 IBGP(Internal/Interior BGP)。

clipboard.png

  • EBGP:运行于不同 AS 之间的 BGP 称为 EBGP。为了防止 AS 间产生环路,当 BGP 设备接收 EBGP 对等体发送的路由时,会将带有本地 AS 号的路由丢弃。
  • IBGP:运行于同一 AS 内部的 BGP 称为 IBGP。为了防止 AS 内产生环路,BGP 设备不将从 IBGP 对等体学到的路由通告给其他 IBGP 对等体,并与所有 IBGP 对等体建立全连接。为了解决 IBGP 对等体的连接数量太多的问题,BGP 设计了路由反射器和 BGP 联盟。

说明:

如果在 AS 内一台 BGP 设备收到 EBGP 邻居发送的路由后,需要通过另一台 BGP 设备将该路由传输给其他 AS,此时推荐使用 IBGP。

BGP 报文交互中的角色

BGP 报文交互中分为 Speaker 和 Peer 两种角色。

Speaker:发送 BGP 报文的设备称为 BGP 发言者(Speaker),它接收或产生新的报文信息,并发布(Advertise)给其它 BGP Speaker。

Peer:相互交换报文的 Speaker 之间互称对等体(Peer)。若干相关的对等体可以构成对等体组(Peer Group)。

BGP 的路由器号(Router ID)

BGP 的 Router ID 是一个用于标识 BGP 设备的 32 位值,通常是 IPv4 地址的形式,在 BGP 会话建立时发送的 Open 报文中携带。对等体之间建立 BGP 会话时,每个 BGP 设备都必须有唯一的 Router ID,否则对等体之间不能建立 BGP 连接。

BGP 的 Router ID 在 BGP 网络中必须是唯一的,可以采用手工配置,也可以让设备自动选取。缺省情况下,BGP 选择设备上的 Loopback 接口的 IPv4 地址作为 BGP 的 Router ID。如果设备上没有配置 Loopback 接口,系统会选择接口中最大的 IPv4 地址作为 BGP 的 Router ID。一旦选出 Router ID,除非发生接口地址删除等事件,否则即使配置了更大的地址,也保持原来的 Router ID。

4.BGP 报文

BGP 对等体的建立、更新和删除等交互过程主要有 5 种报文、6 种状态机和 5 个原则。

BGP 对等体间通过以下 5 种报文进行交互,其中 Keepalive 报文为周期性发送,其余报文为触发式发送:

Open 报文:用于建立 BGP 对等体连接。

Update 报文:用于在对等体之间交换路由信息。可以发布也可以撤销路由信息。

Notification 报文:用于中断 BGP 连接。

Keepalive 报文:用于保持 BGP 连接。

Route-refresh 报文:用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新(Route-refresh)能力的 BGP 设备会发送和响应此报文。

5.BGP 状态机

BGP 对等体的交互过程中存在 6 种状态机:空闲(Idle)、连接(Connect)、活跃(Active)、Open 报文已发送(OpenSent)、Open 报文已确认(OpenConfirm)和连接已建立(Established)。在 BGP 对等体建立的过程中,通常可见的 3 个状态是:Idle、Active 和 Established。

图 2 BGP 对等体交互过程

clipboard.png

  1. Idle 状态是 BGP 初始状态。在 Idle 状态下,BGP 拒绝邻居发送的连接请求。只有在收到本设备的 Start 事件后,BGP 才开始尝试和其它 BGP 对等体进行 TCP 连接,并转至 Connect 状态。
  • Start 事件是由一个操作者配置一个 BGP 过程,或者重置一个已经存在的过程或者路由器软件重置 BGP 过程引起的。
  • 任何状态中收到 Notification 报文或 TCP 拆链通知等 Error 事件后,BGP 都会转至 Idle 状态。
  1. 在 Connect 状态下,BGP 启动连接重传定时器(Connect Retry),等待 TCP 完成连接。
  • 如果 TCP 连接成功,那么 BGP 向对等体发送 Open 报文,并转至 OpenSent 状态。
  • 如果 TCP 连接失败,那么 BGP 转至 Active 状态。
  • 如果连接重传定时器超时,BGP 仍没有收到 BGP 对等体的响应,那么 BGP 继续尝试和其它 BGP 对等体进行 TCP 连接,停留在 Connect 状态。
  1. 在 Active 状态下,BGP 总是在试图建立 TCP 连接。
  • 如果 TCP 连接成功,那么 BGP 向对等体发送 Open 报文,关闭连接重传定时器,并转至 OpenSent 状态。
  • 如果 TCP 连接失败,那么 BGP 停留在 Active 状态。
  • 如果连接重传定时器超时,BGP 仍没有收到 BGP 对等体的响应,那么 BGP 转至 Connect 状态。
  1. 在 OpenSent 状态下,BGP 等待对等体的 Open 报文,并对收到的 Open 报文中的 AS 号、版本号、认证码等进行检查。
  • 如果收到的 Open 报文正确,那么 BGP 发送 Keepalive 报文,并转至 OpenConfirm 状态。
  • 如果发现收到的 Open 报文有错误,那么 BGP 发送 Notification 报文给对等体,并转至 Idle 状态。
  1. 在 OpenConfirm 状态下,BGP 等待 Keepalive 或 Notification 报文。如果收到 Keepalive 报文,则转至 Established 状态,如果收到 Notification 报文,则转至 Idle 状态。
  2. 在 Established 状态下,BGP 可以和对等体交换 Update、Keepalive、Route-refresh 报文和 Notification 报文。
  • 如果收到正确的 Update 或 Keepalive 报文,那么 BGP 就认为对端处于正常运行状态,将保持 BGP 连接。
  • 如果收到错误的 Update 或 Keepalive 报文,那么 BGP 发送 Notification 报文通知对端,并转至 Idle 状态。
  • Route-refresh 报文不会改变 BGP 状态。
  • 如果收到 Notification 报文,那么 BGP 转至 Idle 状态。
  • 如果收到 TCP 拆链通知,那么 BGP 断开连接,转至 Idle 状态。

BGP 对等体之间的交互原则

BGP 设备将最优路由加入 BGP 路由表,形成 BGP 路由。BGP 设备与对等体建立邻居关系后,采取以下交互原则:

  • 从 IBGP 对等体获得的 BGP 路由,BGP 设备只发布给它的 EBGP 对等体。
  • 从 EBGP 对等体获得的 BGP 路由,BGP 设备发布给它所有 EBGP 和 IBGP 对等体。
  • 当存在多条到达同一目的地址的有效路由时,BGP 设备只将最优路由发布给对等体。
  • 路由更新时,BGP 设备只发送更新的 BGP 路由。
  • 所有对等体发送的路由,BGP 设备都会接收。

| 参数 | 缺省值 |
| BGP | 未使能 |

Keepalive 消息发送间隔 60 秒

6.BGP 与 IGP 交互

BGP 与 IGP 在设备中使用不同的路由表,为了实现不同 AS 间相互通讯,BGP 需要与 IGP 进行交互,即 BGP 路由表和 IGP 路由表相互引入。

BGP 引入 IGP 路由

BGP 协议本身不发现路由,因此需要将其他路由引入到 BGP 路由表,实现 AS 间的路由互通。当一个 AS 需要将路由发布给其他 AS 时,AS 边缘路由器会在 BGP 路由表中引入 IGP 的路由。为了更好的规划网络,BGP 在引入 IGP 的路由时,可以使用路由策略进行路由过滤和路由属性设置,也可以设置 MED 值指导 EBGP 对等体判断流量进入 AS 时选路。

BGP 引入路由时支持 Import 和 Network 两种方式:

  • Import 方式是按协议类型,将 RIP、OSPF、ISIS 等协议的路由引入到 BGP 路由表中。为了保证引入的 IGP 路由的有效性,Import 方式还可以引入静态路由和直连路由。
  • Network 方式是逐条将 IP 路由表中已经存在的路由引入到 BGP 路由表中,比 Import 方式更精确。

IGP 引入 BGP 路由

当一个 AS 需要引入其他 AS 的路由时,AS 边缘路由器会在 IGP 路由表中引入 BGP 的路由。为了避免大量 BGP 路由对 AS 内设备造成影响,当 IGP 引入 BGP 路由时,可以使用路由策略,进行路由过滤和路由属性设置。

IGP:路由发现和计算

BGP:路由的控制和优先

7.BGP 路由的生成方式

1.network //只能 network ip 路由表里的路由,路由和掩码需要一致

clipboard.png

2.import

[R5-bgp]import-route ospf 1

[R3-bgp]import-route ospf 1

3.路由汇总

路由黑洞:能够学习到路由,但是无法访问。

8.BGP 示例 1

clipboard.png

[R1]interface g0/0/0

[R1-GigabitEthernet0/0/0]ip add 10.1.12.1 24

[R1]interface loopback 0

[R1-LoopBack0]ip add 1.1.1.1 24

[R1-LoopBack0]interface loopback 1

[R1-LoopBack1]ip add 1.1.2.1 24

[R1]router id 1.1.1.1

[R1]ospf 1

[R1-ospf-1]area 5

[R1-ospf-1-area-0.0.0.0]network 10.1.12.0 0.0.0.255

[R1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0

[R1-ospf-1-area-0.0.0.0]network 1.1.2.1 0.0.0.0

[R1]bgp 100 //R1 AS 号

[R1-bgp]peer 2.2.2.2 as-number 100 //Loopback 接口属于逻辑接口,与物理接口相比,不受链路影响,减少 BGP 振荡。 邻居的 AS 号为 100

[R1-bgp]peer 2.2.2.2 connect-interface loopback 0 //指定更新源 loopback0 为 R1 环回接口地址 1.1.1.1

[R2]interface g0/0/0

[R2-GigabitEthernet0/0/0]ip add 10.1.12.2 24

[R2-GigabitEthernet0/0/0]interface loopback 0

[R2-LoopBack0]ip add 2.2.2.2 24

[R2]interface g0/0/1

[R2-GigabitEthernet0/0/1]ip add 10.1.23.2 24

[R2-GigabitEthernet0/0/1]interface g0/0/2

[R2-GigabitEthernet0/0/2]ip add 10.1.25.2 24

[R2]router id 2.2.2.2

[R2]ospf 1

[R2-ospf-1]area 0

[R2-ospf-1-area-0.0.0.0]network 10.1.23.0 0.0.0.255

[R2-ospf-1-area-0.0.0.0]network 10.1.25.0 0.0.0.255

[R2-ospf-1-area-0.0.0.0]area 5

[R2-ospf-1-area-0.0.0.5]network 10.1.12.0 0.0.0.255

[R2-ospf-1-area-0.0.0.5]network 2.2.2.2 0.0.0.0

[R2-ospf-1-area-0.0.0.5]q

[R2-ospf-1]silent-interface g0/0/1 //将 g0/0/1 和 g0/0/2 配置为静默接口

[R2-ospf-1]silent-interface g0/0/2

[R2]bgp 100

[R2-bgp]peer 1.1.1.1 as-number 100

[R2-bgp]peer 1.1.1.1 connect-interface loopback 0

[R2-bgp]peer 10.1.23.3 as-number 200

[R2-bgp]peer 10.1.25.5 as-number 200

clipboard.png

//reset bgp all 重置 BGP 邻居关系 生产环境不能使用

clipboard.png

[R3]interface g0/0/0

[R3-GigabitEthernet0/0/0]ip add 10.1.23.3 24

[R3-GigabitEthernet0/0/0]interface g0/0/1

[R3-GigabitEthernet0/0/1]ip add 10.1.34.3 24

[R3-GigabitEthernet0/0/1]interface loopback 0

[R3-LoopBack0]ip add 3.3.3.3 24

[R3-LoopBack0]q

[R3]router id 3.3.3.3

[R3]ospf 1

[R3-ospf-1]area 0

[R3-ospf-1-area-0.0.0.0]network 3.3.3.3 0.0.0.0

[R3-ospf-1-area-0.0.0.0]network 10.1.23.0 0.0.0.255

[R3-ospf-1-area-0.0.0.0]network 10.1.34.0 0.0.0.255

[R3-ospf-1-area-0.0.0.0]q

[R3-ospf-1]silent-interface g0/0/0

[R3]bgp 200

[R3-bgp]peer 5.5.5.5 as-number 200

[R3-bgp]peer 5.5.5.5 connect-interface LoopBack 0

[R3-bgp]peer 4.4.4.4 as-number 200

[R3-bgp]peer 4.4.4.4 connect-interface LoopBack 0

[R3-bgp]peer 10.1.23.2 as-number 100

[R4]interface g0/0/0

[R4-GigabitEthernet0/0/0]ip add 10.1.34.4 24

[R4-GigabitEthernet0/0/0]interface g0/0/1

[R4-GigabitEthernet0/0/1]ip add 10.1.45.4 24

[R4-GigabitEthernet0/0/1]interface loopback 0

[R4-LoopBack0]ip add 4.4.4.4 24

[R4-LoopBack0]interface loopback 1

[R4-LoopBack1]ip add 4.4.5.4 24

[R4-LoopBack1]q

[R4]router id 4.4.4.4

[R4]ospf 1

[R4-ospf-1]area 0

[R4-ospf-1-area-0.0.0.0]network 4.4.4.4 0.0.0.0

[R4-ospf-1-area-0.0.0.0]network 4.4.5.4 0.0.0.0

[R4-ospf-1-area-0.0.0.0]network 10.1.34.0 0.0.0.255

[R4-ospf-1-area-0.0.0.0]network 10.1.45.0 0.0.0.255

[R4]bgp 200

[R4-bgp]peer 3.3.3.3 as-number 200

[R4-bgp]peer 3.3.3.3 connect-interface LoopBack 0

[R4-bgp]peer 5.5.5.5 as-number 200

[R4-bgp]peer 5.5.5.5 connect-interface LoopBack 1

[R5]interface g0/0/0

[R5-GigabitEthernet0/0/0]ip add 10.1.25.5 24

[R5-GigabitEthernet0/0/0]interface g0/0/1

[R5-GigabitEthernet0/0/1]ip add 10.1.45.5 24

[R5-GigabitEthernet0/0/1]interface loopback 0

[R5-LoopBack0]ip add 5.5.5.5 24

[R5-LoopBack0]q

[R5]router id 5.5.5.5

[R5]ospf 1

[R5-ospf-1]area 0

[R5-ospf-1-area-0.0.0.0]network 5.5.5.5 0.0.0.0

[R5-ospf-1-area-0.0.0.0]network 10.1.25.0 0.0.0.255

[R5-ospf-1-area-0.0.0.0]network 10.1.45.0 0.0.0.255

[R5-ospf-1-area-0.0.0.0]q

[R5-ospf-1]silent-interface g0/0/0

[R5]bgp 200

[R5-bgp]peer 10.1.25.2 as-number 100

[R5-bgp]peer 3.3.3.3 as-number 200

[R5-bgp]peer 3.3.3.3 connect-interface LoopBack 0

[R5-bgp]peer 4.4.5.4 as-number 200

[R5-bgp]peer 4.4.5.4 connect-interface LoopBack 0

clipboard.png

1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 65 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 97 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    34 引用 • 148 回帖
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 445 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 748 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 321 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 664 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 632 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    575 引用 • 3533 回帖
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 344 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 725 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖
  • sts
    2 引用 • 2 回帖 • 197 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 675 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 715 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 45 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 4 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    6 引用 • 14 回帖
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 513 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖