<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[FengYu]]></title><description><![CDATA[渺沧海之一粟]]></description><link>https://blog.youkuaiyun.com/sinat_33518009</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sinat_33518009]]></copyright><item><title><![CDATA[IEEE802.1x]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/106414696</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/106414696</guid><author>sinat_33518009</author><pubDate>Thu, 28 May 2020 23:05:26 +0800</pubDate><description><![CDATA[背景：最近完成一个需求，要求交换机支持dot1x+radius+ tacacs+ ，因此研究了一下这个认证协议！

简介

IEEE802.1x是为了解决无线局域网网络的安全问题，提出的认证协议，后来，802.1x协议作为局域网接口的一个普通接入控制机制在以太网中被广泛应用，主要解决以太网内认证和安全的问题。

802.1x，又被称为EAPOE，（Extensible Authentication Protocol Over Ethernet）。认证时采用了radius协议一种认证方式，不过同样也支持tac]]></description><category></category></item><item><title><![CDATA[DHCP-packet]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/99130769</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/99130769</guid><author>sinat_33518009</author><pubDate>Sun, 11 Aug 2019 00:57:52 +0800</pubDate><description><![CDATA[DHCP

Dynamic Host Configuration Protocol,动态主机配置协议，采用C/S模式，主要应用在为客户机自动分配IP地址、子网掩码、缺省网关、DNS服务器的IP地址等。

基于UDP协议，采用的知名端口号如下：

DHCP server：67

DHCP client：68

DHCPv6 Client：546

协议报文

DHCP一共有8种报文，按照客户端和服务...]]></description><category></category></item><item><title><![CDATA[linux-文件权限]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/98122961</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/98122961</guid><author>sinat_33518009</author><pubDate>Fri, 02 Aug 2019 00:21:12 +0800</pubDate><description><![CDATA[chmod


#include &lt;sys/stat.h&gt;

int chmod (const char* filename, int mode);


filename是文件名

mode文件权限，八进制数

返回值：成功 返回0，失败返回-1。

chown


#include &lt;unistd.h&gt;

int chown(const char *path, uid_t...]]></description><category></category></item><item><title><![CDATA[VLAN Tag/Untag Frame Forward Process]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/97576202</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/97576202</guid><author>sinat_33518009</author><pubDate>Sun, 28 Jul 2019 00:47:35 +0800</pubDate><description><![CDATA[Link Type：

Access：端口只能属于一个vlan，一般用于连接PC

Trunk：端口可以属于多个vlan，可以接收和发送多个vlan的报文，一般用于交换机之间连接的端口

Hybird：端口可以属于多个vlan，可以接收和发送多个blan的报文，与trunk的区别在于，hybird端口可以允许多个vlan的报文发送时不打tag，而trunk只允许缺省vlan的报文不打tag。

A...]]></description><category></category></item><item><title><![CDATA[const-常量指针和指针常量]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/96459363</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/96459363</guid><author>sinat_33518009</author><pubDate>Thu, 18 Jul 2019 22:02:21 +0800</pubDate><description><![CDATA[const

常量指针

eg:const int *p;

指针指向的内容是常量。因此，内容不可以改变，但是指针地址可以改变。

指针常量

eg:int *const p;

指针是常量。因此，指针地址不可以改变，指向的内容可以改变。


#include &lt;stdio.h&gt;

int main()
{
	int m = 10, n =20;
	const int *p1 = &a...]]></description><category></category></item><item><title><![CDATA[linux-内存寻址-内存地址]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/95395915</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/95395915</guid><author>sinat_33518009</author><pubDate>Wed, 10 Jul 2019 23:38:17 +0800</pubDate><description><![CDATA[内存地址

1.逻辑地址

包含在机器语言指令中用来指定一个操作数或一条指令的地址。每个逻辑地址都由一个段（segment）和偏移量（offset）组成，偏移量指明了从段开始的地方到实际地址之间的距离。

2.线性地址

是一个32位无符号整数，可以用来表示4GB的地址，也就是高达4294967296个内存单元。线性地址通常用十六进制数字表示，范围从0x00000000到0xffffffff。

...]]></description><category></category></item><item><title><![CDATA[linux-启动过程-systemd]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/94667258</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/94667258</guid><author>sinat_33518009</author><pubDate>Fri, 05 Jul 2019 00:09:56 +0800</pubDate><description><![CDATA[操作系统的启动分为两个过程：boot（引导）和startup（启动）。

boot阶段开始于打开电源开关，结束于内核初始化完成和systemd进程成功。启动阶段接管了剩余工作，直到操作系统进入可操作状态。

因此，linux系统的启动过程如下：

POST(BIOS上电自检)-&gt;GRUB（引导装载程序）-&gt;kernel init（内核初始化）-&gt;startsystemd（启动s...]]></description><category></category></item><item><title><![CDATA[linux-IPC-ShareMemory]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/94500570</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/94500570</guid><author>sinat_33518009</author><pubDate>Wed, 03 Jul 2019 00:18:34 +0800</pubDate><description><![CDATA[共享内存（ShareMemory）

共享内存允许两个或多个进程共享一个给定的存储区。因为数据不需要在客户进程和服务器进程之间复制，因此，这是最快的一种IPC方式。

使用共享内存的关键点在于：多个进程同步访问一个给定的存储区，若服务器进程正在把数据放入共享内存区，则它在做完这一操作之间，客户进程不能取这些数据。可以使用信号量、记录锁或者互斥量来完成同步过程。

数据结构


#include &...]]></description><category></category></item><item><title><![CDATA[linux-IPC-Semaphore]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/94487794</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/94487794</guid><author>sinat_33518009</author><pubDate>Tue, 02 Jul 2019 22:17:12 +0800</pubDate><description><![CDATA[信号量semaphore

信号量是一个计数器，用于为多个进程提供对共享数据对象的访问。常用的信号量形式为二元信号量（Binary semaphore）。它控制单个资源，初始值为1。但是，一般而言，信号量的初值可以是任意正数，该值表明有多少个共享资源单位可供共享应用。

数据结构


#include &lt;sem.h&gt;

struct ipc_perm
{
	__kernel_key_t...]]></description><category></category></item><item><title><![CDATA[linux-IPC-消息队列]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/94408774</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/94408774</guid><author>sinat_33518009</author><pubDate>Mon, 01 Jul 2019 22:10:54 +0800</pubDate><description><![CDATA[消息队列

消息队列是消息的链接表，存储在内核中，由消息队列标志符标识。

每个消息都包含一个正的长整型类型的字段、一个非负的长度以及实际的数据字节数，这些都在消息添加到队列时，传送给msgsnd。msgrcv用于在队列中取消息，消息并不一定需要先进先出，可以根据消息类型字段来取。

特点

1.生命周期随内核，消息队列会一直存在，需要调用接口显式删除或使用命令删除

2.消息队列可以双向通信

...]]></description><category></category></item><item><title><![CDATA[linux-IPC -PIPE]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/93790100</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/93790100</guid><author>sinat_33518009</author><pubDate>Wed, 26 Jun 2019 23:41:38 +0800</pubDate><description><![CDATA[进程间通信 （InterProcess Communication，IPC）

原因：由于不同进程地址空间也不同，A进程无法访问B进程的地址空间。任何一个进程的全局变量也无法被其他进程所见，因此，进程间通信必须通过内核。在内核中开辟一块缓冲区，A进程把数据从用户空间拷贝到内核缓冲区，B进程从内核缓冲区把数据读走，这便是IPC。



管道（PIPE）

1.PIPE是UNIX系统IPC最古老的形...]]></description><category></category></item><item><title><![CDATA[linux-UNIX socket]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/93645613</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/93645613</guid><author>sinat_33518009</author><pubDate>Tue, 25 Jun 2019 20:05:45 +0800</pubDate><description><![CDATA[UNIX域套接字

域套接字作为进程间通信的一种手段，值得我们研究一下。

域套接字实现本地进程间通信，同样有服务端和客户端之分。一个进程作为客户端，另一个进程作为服务端。这个和TCP socket类似，但是不一样。域套接字不经过底层网络。数据结构使用的是struct sockaddr_un。对于这个结构，重点便是填充sun_family和sun_path，sun_path是文件路径。调用的so...]]></description><category></category></item><item><title><![CDATA[linux-socket]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/93536599</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/93536599</guid><author>sinat_33518009</author><pubDate>Mon, 24 Jun 2019 23:17:55 +0800</pubDate><description><![CDATA[socket系统调用

socket函数族在系统调用时，同样遵循我上篇博客的 用户态-&gt;内核态，但是，我在寻找sys_socket定义时，只有函数声明

asmlinkage long sys_socket(int, int, int);

那么它的实现在哪儿呢？这里就需要有技巧了！

这样实现都在net/socket.c文件。以socket函数为例，

SYSCALL_DEFINE3(so...]]></description><category></category></item><item><title><![CDATA[linux-系统调用过程]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/93416217</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/93416217</guid><author>sinat_33518009</author><pubDate>Sun, 23 Jun 2019 23:15:46 +0800</pubDate><description><![CDATA[调用过程：

用户空间-&gt;内核空间

INT 0x80（封装在C库函数中） --&gt;system_call（系统调用处理程序）--&gt;系统调用服务例程 --&gt;内核程序

系统调用时通过软中断指令INT 0x80实现的，这条指令会让系统跳转到一个预先设置好的内核地址，指向系统调用处理程序system_call。

系统调用服务例程是对一个具体的系统调用的内核实现函数。执行任何系统...]]></description><category></category></item><item><title><![CDATA[linux-asmlinkage]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/93376618</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/93376618</guid><author>sinat_33518009</author><pubDate>Sat, 22 Jun 2019 23:57:03 +0800</pubDate><description><![CDATA[asmlinkage限定词

(/linux 2.6/arch/x86/include/asm)

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

__attribute__是关键字，是GCC的C语言扩展，regparm(0)表示0个寄存器传递参数，即不从寄存器传送参数，强迫从栈中提取。

如果regparm（3），那么...]]></description><category></category></item><item><title><![CDATA[linux 内存分配]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/92066429</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/92066429</guid><author>sinat_33518009</author><pubDate>Sat, 15 Jun 2019 10:22:37 +0800</pubDate><description><![CDATA[进程内存分配：

每个进程所分配的内存由很多“段”组成：（地址递增方向）

1.文本段：包含了进程运行的程序机器语言指令

2.初始化数据段：包含了显式初始化的全局变量和静态变量

3.未初始化数据段：包含了未进行显式初始化的全局变量和静态变量

4.堆：向上增长

5.栈：向下增长

虚拟内存管理

1.每个进程都有独立的虚拟地址空间，进程访问的虚拟地址并不是真正的物理地址

2.虚拟地址可以通...]]></description><category></category></item><item><title><![CDATA[SimpeSortAlgorithm]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/91488207</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/91488207</guid><author>sinat_33518009</author><pubDate>Wed, 12 Jun 2019 00:14:41 +0800</pubDate><description><![CDATA[#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
//排序算法文件

//算法1：冒泡排序
void bubbleSort(int *arr, int size)
{
	int i, j, temp;
	
	for (i = 0; i&lt;size; i++)
	for (j = 0; j&lt;size-i-1;j++){
		if ...]]></description><category></category></item><item><title><![CDATA[【MOOC】Graph-Part One]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/90814354</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/90814354</guid><author>sinat_33518009</author><pubDate>Tue, 04 Jun 2019 22:31:12 +0800</pubDate><description><![CDATA[终于从MOOC上跟陈姥姥学Graph了！

图（Graph）

&gt;表示“多对多”的关系

&gt;一组顶点：通常用V（Vertex）表示顶点集合

&gt;一组边：通常用E（Edge）表示边的集合

边是顶点对，有向边&lt;v,w&gt;表示从v指向w的边（单行线）

不考虑重边和自回路

ADT

G（V，E）由一个非空的有限顶点集合v和一个有限边集合e组成

操作集：对于任意图G，v，...]]></description><category></category></item><item><title><![CDATA[Binary Tree -AVL]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/90745095</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/90745095</guid><author>sinat_33518009</author><pubDate>Sun, 02 Jun 2019 23:31:06 +0800</pubDate><description><![CDATA[写在前面：对于AVL的印象一直停留在左旋、右旋的层次，具体的概念都已经忘记了。趁着复习二叉树的劲儿，又认真学习了一下AVL。这两天也看了不少关于AVL的资料和博客，这里感谢https://www.cnblogs.com/zhuwbox/p/3636783.html，博主写的很通俗易懂。感恩师兄，南无本师释迦牟尼佛（今天看了灵光寺舍利）。

基本概念：

AVL树的本质是BST，但它又有下面的特点：...]]></description><category></category></item><item><title><![CDATA[【MOOC】Binary Part -IV Huffman Tree && Huffman Coding]]></title><link>https://blog.youkuaiyun.com/sinat_33518009/article/details/90707262</link><guid>https://blog.youkuaiyun.com/sinat_33518009/article/details/90707262</guid><author>sinat_33518009</author><pubDate>Thu, 30 May 2019 22:25:25 +0800</pubDate><description><![CDATA[Huffman Tree

带权路径长度（WPL）：二叉树有n个叶子结点，每个叶子结点带有权值Wk，从根结点到每个叶结点的长度为lk，则每个叶子结点的带权路径长度之和就是WPL.

最优二叉树或者哈夫曼树：WPL最小的二叉树

哈夫曼树的构造方法：

每次把权值最小的两颗二叉树合并。

这里利用最小堆的特性，构造一个最小堆，每次返回最小的结点，返回两次则可以作为哈夫曼树的左右结点，权值为左右结点之...]]></description><category></category></item></channel></rss>