wenmo8 发布的文章

一、什么是BGP
BGP全称是Border Gateway Protocol, 对应中文是边界网关协议。这个名字比较抽象,而维基中文的解释我觉得比较好(维基英文甚至都没有类似的解释)。BGP是互联网上一个核心的去中心化自治 路由协议。从这个解释来看,首先这是一个用于互联网(Internet)上的路由协议。它的地位是核心的(目前是最重要的,互联网上唯一使用的路由协议),它的目的是去中心化,以达到各个网络自治。不过还是有点抽象?

先看看几个相关的概念:

AS(Autonomous system):自治系统,指在一个(有时是多个)组织管辖下的所有IP网络和路由器的全体,它们对互联网执行共同的路由策略。也就是说,对于互联网来说,一个AS是一个独立的整体网络。而BGP实现的网络自治也是指各个AS自治。每个AS有自己唯一的编号。
IGP(Interior Gateway Protocol):内部网关协议,在一个AS内部所使用的一种路由协议。一个AS内部也可以有多个路由器管理多个网络。各个路由器之间需要路由信息以知道子网络的可达信息。IGP就是用来管理这些路由。代表的实现有RIP和OSPF。
EGP(Exterior Gateway Protocol):外部网关协议,在多个AS之间使用的一种路由协议,现在已经淘汰,被BGP取而代之。
由于BGP就是为了替换EGP而创建,它的地位与EGP相似。但是BGP也可以应用在一个AS内部。因此BGP又可以分为IBGP(Interior BGP :同一个AS之间的连接)和EBGP(Exterior BGP:不同AS之间的BGP连接)。既然EGP已经被替代了,那EBGP的存在比较好理解,但是IGP协议都还活得好好的(这里指的是OSPF),那IBGP的意义何在?IGP的协议是针对同一个AS网络来设计的,一个自治网络的规模一般都不大,所以设计的时候就没有考虑大规模网络的情况。而当一个自治网络足够大时,OSPF存在性能瓶颈(后面会说明)。BGP本身就是为了在Internet工作,其设计就是为了满足大型网络的要求,所以大型私有IP网络内部可以使用IBGP。总的来说,这几类路由协议,小规模私有网络IGP,大规模私有网络IBGP,互联网EBGP。

图片

二、为什么需要BGP
BGP号称是使互联网工作的协议,看起来似乎很重要,为什么平常的生活中很少接触呢?似乎云里面也不怎么提BGP,我们来看看原因吧。

假设小明正在搭建一个云环境,提供虚拟机服务。

图片

云里的虚机需要有互联网访问能力,于是小明向ISP(Internet service provider)申请了一个公网IP,这里的ISP可以是联通,移动,电信等等。虚机们可以通过路由器的NAT/PAT(Network / Port address translation)将自己的私网IP转换成这个公网IP,然后小明在云中路由器上将ISP router的地址设为默认路由。这样地址转换之后的IP包都发送到了ISP,进而发送到了互联网(这也是我们家用路由器能让家里的设备上网的原理)。这样小明的1.0版本云简单上线。这里小明不需要BGP。

版本上线之后怎么办?当然是开发下一版本!下一版本的需求是可以通过互联网访问虚机(也就是从互联网访问我们家里的电脑)。这个也不难,可以通过端口转发(Port Forward),将虚机的一个端口与公网IP的端口进行映射。例如将虚机的22端口映射到公网IP的1122端口,那么可以通过互联网ssh到公网IP:1122,登陆虚机。这部分工作仍然是在小明的云中路由器完成。这样,小明的2.0版本云上线了,这里小明还是不需要BGP。

图片

2.0版本虽然支持了从互联网访问虚机,但是还有问题:

1、每个虚机每开放一个端口都需要映射一次
2、公网IP的端口是有限的
为了解决这些问题,小明向联通申请了一些公网IP地址,对于需要从外网访问的虚机,直接给它们分配公网IP。这样小明的3.0版本云上线了,这里小明还是不需要BGP。因为:

1、联通是小明云唯一连接的ISP,小明只能通过联通访问互联网,所以小明的云中路由器的默认路由只能设置成ISP 路由器的地址。
2、小明云里面的公网IP都是联通分配的,联通当然知道该从哪个IP地址作为下一跳去访问那些IP地址。
图片

联通的IP毕竟是有限的,而且联通还老是断线。这都发布3个版本了,小明决定干一票大的。

首先,小明向IANA(Internet Assigned Numbers Authority)申请了自己的公网IP池。因为有了自己的公网IP,也必须要考虑申请AS号。AS号是一个16bit的数字,全球共用这60000多个编号。1 – 64511 是全球唯一的,而 64512 – 65535 是可以自用的,类似于私网网段。每个自治网络都需要申请自己的AS编号,联通的AS号是9800。

然后,小明分别向联通和电信买了线路,这样就算联通断线还能用电信。

那现在问题来了:

1、联通或者电信怎么知道小明申请的公网IP是什么。换言之,我现在拨号拨进了联通宽带,我怎么才能访问到小明云的公网IP?
2、小明的云中路由器的默认路由该设置到联通的ISP路由器,还是电信的?
终于,在小明的4.0版本云上,小明需要用BGP了。通过BGP,小明可以将自己云中的路由信息发送到联通,电信,这样ISP就知道了改如何访问小明的公网虚拟机,也就是说我们普通的使用者通过ISP,能访问到小明的网络。另一方面,通过在云中运行BGP服务,小明可以管理云中路由器的默认路由。

总的来说,要是你之前没有听过或者用过BGP,只能说你的网络还没有到那个规模 :)

三、BGP协议
BGP可以说是最复杂的路由协议。它是应用层协议,其传输层使用TCP,默认端口号是179。因为是应用层协议,可以认为它的连接是可靠的,并且不用考虑底层的工作,例如fragment,确认,重传等等。BGP是唯一使用TCP作为传输层的路由协议,其他的路由协议可能都还到不了传输层。

TCP连接的窗口是65K字节,也就是说TCP连接允许在没有确认包的情况下,连续发送65K的数据。而其他的路由协议,例如EIGRP和OSPF的窗口只有一个数据包,也就是说前一个数据包收到确认包之后,才会发送下一个数据包。当网络规模巨大时,需要传输的数据也相应变大,这样效率是非常低的。这也是它们不适合大规模网络的原因。而正是由于TCP可以可靠的传输大量数据,且互联网的路由信息是巨大的,TCP被选为BGP的传输层协议,并且BGP适合大规模网络环境。

和大部分协议一样,BGP的数据由header和data组成。Header有19个字节,所有的BGP数据的Header格式是一样的。

图片

Marker有16个字节长,存储着同步信息和加密信息。Length2个字节,包含header在内的长度。Type1个字节,表示当前BGP数据的类型,具体有4类:

Open(code 1):TCP连接建立之后,BGP发送的第一个包。收到Open之后,BGP peer会发送一个Keepalive消息以确认Open。其他所有的消息都只会在Open消息确认之后,并且BGP连接已经建立之后发送。
Update(code 2):BGP连接后的首次Update会交换整个BGP route table,之后的Update只会发送变化了的路由信息。所以说BGP是动态的传输路由消息的变化。
Notification(code 3):出错时发送的消息,这个消息一旦发送,BGP连接将会中断。
Keepalive(code 4):没有data,只有header。用来保持BGP连接,通常是1/3的BGP session hold time。默认是60秒,如果hold time是0,不会发送Keepalive。
每一种BGP数据的data都不相同,这些都由网络设备商实现了,简单看一下Open和Update的data吧。

图片

BGP Open 数据,由于是发送的第一个包,因此就是一些配置信息。例如自身的AS号,BGP连接的超时时间(hold time),BGP id。

图片

BGP Update 数据,主要就是交换Network Layer Reachability Information (NLRI)。一个Update数据包里面只会有一条path的路由信息,因此只有一组path attribute,但是路由可以有多条。具体的说,一个BGP router可能连接了多个BGP peer router,那么它在发送BGP Update数据时,一次只会发送一个它的BGP peer router的信息。(欢迎关注公众号:网络工程师阿龙)

四、BGP如何工作
BGP是一种路径矢量协议(Path vector protocol)的实现。因此,它的工作原理也是基于路径矢量。首先说明一下,下面说的BGP route指的是BGP自己维护的路由信息,区分于设备的主路由表,也就是我们平常看见的那个路由表。BGP route是BGP协议传输的数据,并存储在BGP router的数据库中。(欢迎关注公众号:网络工程师阿龙) 并非所有的BGP route都会写到主路由表。每条BGP route都包含了目的网络,下一跳和完整的路径信息。路径信息是由AS号组成,当BGP router收到了一条 路由信息,如果里面的路径包含了自己的AS号,那它就能判定这是一条自己曾经发出的路由信息,收到的这条路由信息会被丢弃。

这里把每个BGP服务的实体叫做BGP router,而与BGP router连接的对端叫BGP peer。每个BGP router在收到了peer传来的路由信息,会存储在自己的数据库,前面说过,路由信息包含很多其他的信息,BGP router会根据自己本地的policy结合路由信息中的内容判断,如果路由信息符合本地policy,BGP router会修改自己的主路由表。本地的policy可以有很多,(欢迎关注公众号:网络工程师阿龙) 举个例子,如果BGP router收到两条路由信息,目的网络一样,但是路径不一样,一个是AS1->AS3->AS5,另一个是AS1->AS2,如果没有其他的特殊policy,BGP router会选用AS1->AS2这条路由信息。policy还有很多其他的,可以实现复杂的控制。

除了修改主路由表,BGP router还会修改这条路由信息,将自己的AS号加在BGP数据中,将下一跳改为自己,并且将自己加在路径信息里。在这之后,这条消息会继续向别的BGP peer发送。而其他的BGP peer就知道了,可以通过指定下一跳到当前BGP router,来达到目的网络地址。

所以说,BGP更像是一个可达协议,可达信息传来传去,本地根据收到的信息判断决策,再应用到路由表。

pidstat 概述
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

pidstat 安装
pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。

在Debian/Ubuntu系统中可以使用下面的命令来安装:
apt-get install sysstat
CentOS/Fedora/RHEL版本的linux中则使用下面的命令:
yum install sysstat
pidstat 示例
pidstat 的用法:

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
如下图:

常用的参数:

-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
示例一:查看所有进程的 CPU 使用情况( -u -p ALL)
pidstat
pidstat -u -p ALL
pidstat 和 pidstat -u -p ALL 是等效的。
pidstat 默认显示了所有进程的cpu使用率。

详细说明
PID:进程ID
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令
示例二: cpu使用情况统计(-u)
pidstat -u
使用-u选项,pidstat将显示各活动进程的cpu使用统计,执行”pidstat -u”与单独执行”pidstat”的效果一样。

示例三: 内存使用情况统计(-r)
pidstat -r
使用-r选项,pidstat将显示各活动进程的内存使用统计:

PID:进程标识符
Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
VSZ:虚拟地址大小,虚拟内存的使用KB
RSS:常驻集合大小,非交换区五里内存使用KB
Command:task命令名
示例四:显示各个进程的IO使用情况(-d)
pidstat -d

报告IO统计显示以下信息:

PID:进程id
kB_rd/s:每秒从磁盘读取的KB
kB_wr/s:每秒写入磁盘KB
kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
COMMAND:task的命令名
示例五:显示每个进程的上下文切换情况(-w)
pidstat -w -p 2831

PID:进程id
Cswch/s:每秒主动任务上下文切换数量
Nvcswch/s:每秒被动任务上下文切换数量
Command:命令名
示例六:显示选择任务的线程的统计信息外的额外信息 (-t)
pidstat -t -p 2831

TGID:主线程的表示
TID:线程id
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令
示例七:pidstat -T
pidstat -T TASK
pidstat -T CHILD
pidstat -T ALL
TASK表示报告独立的task。
CHILD关键字表示报告进程下所有线程统计信息。
ALL表示报告独立的task和task下面的所有线程。

注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。

PID:进程id
Usr-ms:任务和子线程在用户级别使用的毫秒数。
System-ms:任务和子线程在系统级别使用的毫秒数。
Guest-ms:任务和子线程在虚拟机(running a virtual processor)使用的毫秒数。
Command:命令名

链接:https://www.jianshu.com/p/3991c0dba094
来源:简书

有时候,我们需要排查bug,或者是查看编写的代码后执行的语句是否如我们预期那般,可以开启MySQL的日志记录,

例如,刚刚写的ThinkPHP的事务,是否如我们所想,是一种不错的调试方式:

1、查看日志是否开启,和日志文件存放的目录:

SHOW VARIABLES LIKE 'general%';
日志文件存放的目录

2、SET GLOBAL general_log='ON';
日志是否开启

3、调试完毕,关闭日志

SET GLOBAL general_log='OFF';
日志记录信息

————————————————
原文链接:https://blog.csdn.net/mrtwenty/article/details/82810508

【今日资讯】
1、神舟十三号航天员顺利进入天舟三号
2、小红书就“滤镜景点”致歉
3、2021云栖大会英特尔分论坛10月19日重磅展开
4、杂交水稻双季亩产创新纪录:1603.9公斤
5、百度董事长兼CEO李彦宏:“限购”“限行”政策或在5-10年内取消
6、截至2020年全国老年人口抚养比为19.7% 比10年前提高7.8个百分点
——————————————————————————————————————
【今日好文分享】
1、移动端销售日月报新体验
https://bbs.fanruan.com/thread-129650-1-1.html

2、 体验FineReport11.0,提交体验报告 最多获得500元现金奖励!
https://bbs.fanruan.com/thread-136829-1-1.html

3、 体验FineReport11.0,发现BUG与新需求最高奖励一百块!
https://bbs.fanruan.com/thread-137087-1-1.html