Code Monkey home page Code Monkey logo

isshe.github.io's People

Contributors

isshe avatar

Watchers

 avatar  avatar

isshe.github.io's Issues

操作系统 —— 信号

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E4%BF%A1%E5%8F%B7/

信号 一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。 每种信号类型都对应于某种系统事件。 信号的默认行为: 1.信号发送和信号接收 待处理信号:一个发出而没有被接收的信号。 内核通过更新目的进程上下文的某个状态,发送一个信号给目的进程。 当目的进程被内核强迫以某种方式对信号的发送做出反应时,目的进程就接收了信号。 Unix系统提供了大量向进程发送信号的机制,所有这些机制都是基于进程组(process group)的。 相关函数: #include <sys/types.h>#include <signal.h>#include <unistd.h> // 发送sig指定信号到pid进程 int kill(pid_t pid, int sig); // 向自己发送SIGALRM信号 unsigned int alarm(unsigned int secs); typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 2.信号处理问题 待处理信号被阻塞。
例如:一个进程捕获一个信号SIGINT然后去处理程序处理信号,此时又来一个SIGINT信号,此信号会被阻塞。[疑问][1] (第2个信号不是SIGINT信号,那是否也还是阻塞?) 待处理信号不会排队等待。
任意类型至多只有一个待处理信号。[疑问][2] (不同类型的信号就可以有多个吗?) 系统调用可以被中断。
如read、wait、accept这样的慢速系统调用被信号打断,但是信号处理函数返回后不再继续被打断的系统调用,而是立即返回错误,errno为EINTR。 详见ex_SIGCHLD.c
教训:不可以用信号来对其他进程中发生的时间计数
3.

操作系统 —— 进程

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B/

进程 进程是操作系统中最核心的概念。
定义:一个执行中的程序的实例。(对正在运行程序的一个抽象) 是资源分配的基本单位。 进程提供给应用程序的关键抽象: 一个独立的逻辑控制流,它提供一个假象,好像程序独占地使用处理器。 一个私有的地址空间,它提供一个假象,好像程序独占地使用存储器系统。 逻辑流(逻辑控制流):程序计数器PC值的序列。 异常处理程序、进程、信号处理程序、线程和Java进程都是逻辑流的例子。 并发流(concurrent flow):一个逻辑流的执行在时间上与另一个流重叠。 并发:多条流并发地执行的一般现象称为并发(concurrecy)。 多任务(multitasking):一个进程和其他进程轮流运行的概念称为多任务。 时间片(time slice):一个进程执行它的控制流的一部分的每一时间段。 并行流(parallel flow):两个流运行在不同的处理器上或者不同的计算机上。 上下文(context):内核重新启动一个被抢占的进程所需要的状态。 上下文切换:内核为每个进程维护一个上下文(context),多任务的实现依赖上下文切换。 1)保存当前进程的上下文; 2)恢复某个先前被抢占的进程被保存的上下文; 3)将控制传递给这个新恢复的进程; 1.进程地址空间 1.1 典型进程地址空间1 典型进程地址空间1
代码段起始地址: 32位:0x08048000 64位:0x00400000 进程从用户模式变为内核模式的方法是:中断、故障、陷入系统调用。 1.2 典型进程地址空间2 典型进程地址空间2
2. 进程状态 2.1 状态转换图 状态转换图 2.2 基本状态 1)运行态:进程实际占用CPU; 2)就绪态:可运行; 3)阻塞态:除非某种外部事件发生(使进程满足运行条件),否则进程不能运行。 2.3 引入的状态: 创建状态; 终止状态; 挂起状态;(图中没有) 3.

Linux 命令 —— ip

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-ip/

ip 显示/操纵路由、设备、策略路由、隧道。
概要 ip [ OPTIONS ] OBJECT { COMMAND | help } ip [ -force ] -batch filename OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics } OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -r[esolve] | -f[amily] { inet | inet6 | ipx | dnet | link } | -o[neline] | -n[etns] name | -a[ll] | -c[olor] } OBJECT:

Linux 命令 —— modprobe

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-modprobe/

modprobe modprobe - 向Linux内核添加或从内核移除模块。
modprobe智能地从Linux内核添加或删除模块:
注意,模块名称中-和_没有区别(自动执行下划线转换)。 modprobe在模块目录/lib/modules/'uname -r'(符号冲突了,用'代替)中查找所有模块和其他文件。 除了/etc/modprobe.d目录是的可选配置文件。详见modprobe.d modprobe还将以<module>.<option>的形式使用内核命令行上指定的模块选项。 modprobe.blacklist=<module>的形式使用黑名单。 如果在modulename之后给出了任何参数,它们将被传递给内核。 除了配置文件中列出的选项。 用法 modprobe [-v] [-V] [-C config-file] [-n] [-i] [-q] [-b] [modulename] [module parameters...] modprobe [-r] [-v] [-n] [-i] [modulename...] modprobe [-c] modprobe [--dump-modversions] [filename] 选项 -a, --all 加载命令行中指定的所有模块。 -b, --use-blacklist 此选项使modprobe将配置文件(如果有)中的黑名单命令也应用于模块名称。 它通常由udev(7)使用。 -C, --config 此选项会覆盖缺省配置目录(/etc/modprobe.d) 此选项通过安装或删除命令传递给 MODPROBE_OPTIONS环境变量中 的其他modprobe命令。 -c, --showconfig 输出config目录中的有效配置并退出。 --dump-modversions 打印出模块所需的模块版本信息列表。 分发版通常使用此选项,以便使用模块版本控制deps(依赖?)打包Linux内核模块。 -d, --dirname 模块的根目录,默认是/。 --first-time 通常,如果告知插入已存在的模块或删除不存在的模块,modprobe将成功(并且不执行任何操作)。 这是简单脚本的理想选择; 然而,更复杂的脚本通常想知道modprobe是否真的做了一些事情: 这个选项使modprobe失败,因为它实际上没有做任何事情。 --force-vermagic 每个模块都包含一个包含重要信息的小字符串,例如内核和编译器版本。 如果模块无法加载并且内核抱怨version magic不匹配,则可以使用此选项将其删除(抱怨)。 当然,这个检查是为了保护你的,所以这个使用选项是危险的,除非你知道你在做什么。 这适用于插入的任何模块:命令行上的模块(或别名)以及它所依赖的任何模块。 --force-modversion 当使用CONFIG_MODVERSIONS集编译模块时,会创建模块使用(或由模块提供)的每个接口的版本的详细说明。 如果模块无法加载并且内核抱怨模块不同意某个接口的版本,则可以使用“--force-modversion”来完全删除版本信息。 当然,这项检查是为了保护您的,所以使用此选项是危险的,除非您知道自己在做什么。 这适用于插入的任何模块:命令行上的模块(或别名)以及它所依赖的任何模块。 -f, --force 尝试从模块中删除任何可能阻止加载的版本信息:这与使用--force-vermagic和--force-modversion相同。 当然,这些检查是为了您的保护,所以使用此选项是危险的,除非您知道自己在做什么。 这适用于插入的任何模块:命令行上的模块(或别名)以及它所依赖的任何模块。 -i, --ignore-install, --ignore-remove 此选项使modprobe忽略命令行中,指定的模块的配置文件(如果有)中的安装和删除命令(任何相关模块仍然受配置文件中为它们设置的命令的限制)。 当使用此选项时,无论是否仅使用--ignore-install或--ignore-remove中的一个或其他(而不是两个)更具体地进行请求,将忽略安装和删除命令。 详见modprobe.

图解密码技术 —— 第三章-对称密码

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%B8%89%E7%AB%A0-%E5%AF%B9%E7%A7%B0%E5%AF%86%E7%A0%81/

对称密码 用相同的秘钥进行加密和解密。
比特序列 编码:将现实中的东西映射为比特序列。 ASCII UTF-8 XOR——异或 XOR: exclusive or, 异或。
异或类似于加密解密过程: 消息A异或秘钥B = X X 异或 B = A 一次性密码本 原理:将明文与一串随机的比特序列进行XOR运算。 无法破解的原因:密文 XOR 破解秘钥得到的有意义明文,可能有多个,无法确定具体是哪个明文。
DES DES: Data Encryption Standard。
美国联邦信息处理标准中采用的一种对称密码。 一种将64bit明文加密成64bit密文的对称密码算法。 秘钥长度是56bit。(实际64bit,但由于每隔7bit设置一个错误检查bit,因此是56bit) 如果明文长于64bit,则需要迭代加密。 差分分析 思路:改变一部分明文并分析密文如何随之改变。
线性分析 思路:将明文和密文的一些对应比特进行XOR并计算其结果为0的概率。
三重DES 3DES(TDEA):将DES重复3次。 分组长度为:64 * 3 = 192
AES 分组长度为:128

操作系统 —— 进程间通信之 SystemV 共享内存

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-systemv-%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/

System V 共享内存区 1. 概述 System V 共享内存区在概念上类似于Posix共享内存区; Posix共享内存区:先调用shm_open,后调用mmap; System V 共享内存区:先调用shmget, 后调用shmat; 2. shmget函数 #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); 作用:创建一个新的共享内存区或者访问一个已存在的共享内存区。 参数: key: ftok的返回值或者IPC_PRIVATE。 如果key=IPC_PRIVATE并且shmflg指定IPC_CREAT标记,则创建共享内存区。 如果没有key对应的共享内存标识符并且指定IPC_CREAT,则创建共享内存区。 创建内存区会初始化内存区为0。(size字节) 创建共享内存区会分配shmid_ds结构 struct shmid_ds { struct ipc_perm shm_perm; /* operation permissions / int shm_segsz; / size of segment in bytes / pid_t shm_lpid; / pid of last shm op / pid_t shm_cpid; / pid of creator / short shm_nattch; / # of current attaches / time_t shm_atime; / last shmat() time*/ time_t shm_dtime; /* last shmdt() time / time_t shm_ctime; / last change by shmctl() */ void shm_internal; / sysv stupidity */ }; size: 大小 shmflg: 标记 返回:共享内存区标识符(整数) 3.

Linux 命令 —— git

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-git/

git submodule 添加submodule: git submodule add <subproject URL> > git submodule add https://github.com/isshe/gitsubproject 查看subproject的commit: git diff --cached <subproject dir> > git diff --cached gitsubproject/ 查看subproject的.gitmodules: git diff --cached --submodule 自动clone每个submodule: git clone --recursive <your repository url> > git clone --recursive https://github.com/isshe/gitproject 拉取子模块: git submodule init git submodule update > 更常用的是:递归更新 git submodule update --init --recursive 子模块的后续更新:
git submodule update --remote 调整submodule的commit: git pull origin xxx 切submodule的分支: git config -f .gitmodules submodule.

操作系统 —— 进线程同步之读写锁

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E4%B9%8B%E8%AF%BB%E5%86%99%E9%94%81/

读写锁 1. 什么是读写锁 互斥锁把试图进入临界区的(多余)线程都阻塞住,无论是读还是写。(不区分读写) 独占锁。 读写锁区分读和写,同时只能一个线程写(写时不能读);允许同时多个线程读(读时没有写)。 读为共享锁,写为独占锁。 读比写更频繁的应用中,用读写锁更好。 2. 读写锁的分配规则 只要没有线程持有读写锁用于写,任意数目的线程可以持有该读写锁用于读。 仅当没有线程持有读写锁时(用于读或写),才能分配读写锁用于写。 3. 相关函数 静态分配用PTHREAD_RWLOCK_INITIALIZER进行初始化。 #include <pthread.h> // 初始化、销毁 int pthread_rwlock_init(pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr); int pthread_rwlock_destroy(pthread_rwlock_t *lock); // 加锁、解锁 int pthread_rwlock_rdlock(pthread_rwlock_t *lock); int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock); int pthread_rwlock_wrlock(pthread_rwlock_t *lock); int pthread_rwlock_trywrlock(pthread_rwlock_t *lock); int pthread_rwlock_unlock(pthread_rwlock_t *lock); // 属性初始化、销毁 int pthread_rwlockattr_init(pthread_rwlockattr_t *attr); int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr); // 属性设置:设置进程间共享: PTHREAD_PROCESS_SHARED/PTHREAD_PROCESS_PRIVATE int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *pshared); int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared);

图解密码技术 —— 第六章-混合密码系统

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%85%AD%E7%AB%A0-%E6%B7%B7%E5%90%88%E5%AF%86%E7%A0%81%E7%B3%BB%E7%BB%9F/

第六章 混合密码系统 用对称密码提高速度,用公钥密码保护会话密钥。
对称密码:用于加密消息/数据。 公钥密码:用于加密密钥/会话密钥。 对称密码和公钥密码的密钥长度必须具备同等强度。 考虑长期运用时,公钥密码的强度应该要高于对称密码。 因为对称密码的会话密钥被破解,只会影响到本次通信,而公钥被破译,会影响过去到未来所有通信内容。 密钥强度对比:
对称密码AES 公钥密码RSA 128 3072 192 7680 256 15360 问题 对称密码: 密钥传送问题 公钥密码: 中间人攻击 速度慢 混合密码加密过程 混合密码加密过程
混合密码解密过程 混合密码解密过程

Linux 命令 —— tcpdump

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-tcpdump/

tcpdump tcpdump - dump traffic on a network(转储网络上的流量)。
用法 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] [ --number ] [ -Q in|out|inout ] [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,.

操作系统 —— IO 多路复用之 poll

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E4%B9%8B-poll/

poll 相关函数 #include <poll.h> struct pollfd { int fd; /* file descriptor / short events; / events to look for / short revents; / events returned */ }; int poll(struct pollfd fds[], nfds_t nfds, int timeout); 作用:类似于select。(指示内核等待多个事件,并在有一个或多个时间或经历指定时间后唤醒进程。) 参数: fds[]: 指向一个结构数组第一个元素的指针。 nfds: 指定fds中的元素个数。 timeout: INFTIM: 永远等待;(INFTIM被定义为一个负值) 0:立即返回; > 0: 等待指定数据的毫秒数。 返回: 成功:就绪描述符数目 超时:0 出错:-1 数据结构说明: events: 要测试的条件; revents: 返回描述符的状态。 events/revents标记: 常值 说明 能作为evnets的输入吗? 能作为revents的输入吗? POLLIN 普通或优先级带数据可读 + + POLLRDNORM 普通数据可读 + + POLLRDBAND 优先级带数据可读 + + POLLPRI 高优先级数据可读 + + POLLOUT 普通数据可写 + + POLLWRNORM 普通数据可写 + + POLLWRBAND 优先级带数据可写 + + POLLERR 发生错误 + POLLHUP 发生挂起 + POLLNVAL 描述符不是一个打开的文件 + 数据分类 poll识别三类数据:普通(normal)、优先级带(priority band)、高优先级(high priority)

图解密码技术 —— 第二章-历史上的密码

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E5%8E%86%E5%8F%B2%E4%B8%8A%E7%9A%84%E5%AF%86%E7%A0%81/

第二章 历史上的密码 历史上著名的密码 凯撒密码 简单替换密码 Enigma 破译方法 暴力攻击 频率分析 凯撒密码 通过将明文中使用的字母表"平移"来进行加密。 秘钥空间:26 破解方式:直接暴力破解。
简单替换密码 更改26个字母的对应关系。如A表示X(A不再是A)。 秘钥空间:26 x 25 x 24 x … x 1 = 403291461126605635584000000 破解方式:频率分析 Enigma 略

操作系统 —— 进程间通信之 Posix 信号量

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-posix-%E4%BF%A1%E5%8F%B7%E9%87%8F/

Posix信号量 信号量是一种提供不同进程间或一个进程的不同线程间同步手段的原语。 Posix提供两类信号量:
有名(named)信号量 基于内存(memory-base)的信号量。【macOS不支持】 Posix信号量的函数调用 Posix有名信号量至少具有岁内核的持续性。 Posix信号量是计数信号量。 1.相关函数 #include <fcntl.h> /* For O_* constants /#include <sys/stat.h> / For mode constants */#include <semaphore.h> // 打开 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); // 关闭 int sem_close(sem_t *sem); // 删除 int sem_unlink(const char *name); // "加锁"——测试指定信号量的值,如果大于0,将它-1 int sem_wait(sem_t *sem); int sem_trywait(sem_t *sem); int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); // “解锁”——信号量+1 int sem_post(sem_t *sem); // 获取信号量的值(macOS不支持) int sem_getvalue(sem_t *sem, int *sval); // 基于内存的信号量(macOS不支持) int sem_init(sem_t *sem, int shared, unsigned int value); int sem_destroy(sem_t *sem); A.

Linux 命令 —— strace

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-strace/

strace strace - 跟踪系统调用和信号。
在最简单的情况下,strace运行指定的命令直到它退出。 它拦截并记录由进程调用的系统调用和进程接收的信号。 每个系统调用的名称,其参数和返回值都打印在标准错误或使用-o选项指定的文件上。 strace是一种有用的诊断,指导和调试工具。 跟踪中的每一行都包含系统调用名称,后跟括号中的参数及其返回值。如:
open("/dev/null", O_RDONLY) = 3 系统调用错误,如:(返回 -1,并打印出错原因)
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory) 信号,如:
sigsuspend([] <unfinished ...> --- SIGINT (Interrupt) --- +++ killed by SIGINT +++ 正在执行系统调用的同时,另一个线程/进程调用另一个系统调用,则strace将尝试保留这些事件的顺序并将正在进行的调用标记为未完成。 当调用返回时,它将被标记为已恢复:
[pid 28772] select(4, [3], NULL, NULL, NULL <unfinished ...> [pid 28779] clock_gettime(CLOCK_REALTIME, {1130322148, 939977000}) = 0 [pid 28772] <... select resumed> ) = 1 (in [3]) 系统调用被中断后重启,如:
read(0, 0x7ffff72cf5cf, 1) = ?

图解密码技术 —— 第十三章-PGP

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0-pgp/

PGP——密码技术的完美组合 什么是PGP? PGP: Pretty Good Privacy. 是Philip Zimmermann编写的密码软件。 PGP有什么用? 可以保护处于极端状况(如:性命攸关)下的人们的隐私。 什么是OpenGPG? OpenGPG:对秘闻和数字签名进行定义的标准规范:RFC1991/RFC2440/RFC4880/RFC5581/RFC6637。 GUN遵照OpenGPG(RFC4880)规范编写了GnuPG自由软件。 什么是信任网? PGP采用的确认公钥合法性的方法。 注意:公钥是否合法和所有者是否可信是两个不同的问题,因为尽管公钥合法,其所有者也可以是不可信的。

个人感悟 —— 国家公祭日有感

https://isshe.site/p/%E4%B8%AA%E4%BA%BA%E6%84%9F%E6%82%9F-%E5%9B%BD%E5%AE%B6%E5%85%AC%E7%A5%AD%E6%97%A5%E6%9C%89%E6%84%9F/

2021 年国家公祭日有感 我是一个南方人,一直以来,都不太愿意去了解这些同胞受难的事情,不愿意面对;同时,也不知道该以什么样的心情去面对。 我不确定一个人、一个军队,在祖国强盛、自己满怀荣光的情况下,如何能够做出这样的事情。 一个人为之,或许可以称之为堕落;一个军队,大概是集体兽化了吧。 何为人?这个提问出自《一人之下》。 “张三”说:法律是道德的最低标准,我们不应该以不违法来标榜自己。 我也是这么认为的。 但是对于我个人来说,我希望我更有原则,更加旗帜鲜明:
旗帜鲜明地表达自己的立场——我热爱自己、热爱家人、热爱祖国、热爱这片土地; 旗帜鲜明地反对屠杀之类禽兽行为;

Linux 命令 —— vmstat

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-vmstat/

vmstat 报告虚拟内存统计信息:进程,内存,分页,块IO,陷阱(traps)、磁盘和cpu活动。
用法 vmstat [options] [delay [count]] vmstat [-f] [-s] [-m] vmstat [-S unit] vmstat [-d] vmstat [-p disk partition] vmstat [-V] 选项 delay 更新之间的延迟,以秒为单位。如果未指定延迟,则仅打印一个报告:自引导以来的平均值。 count 更新次数。如果未指定计数且指定了延迟(delay),则count默认为无穷大。 -a, --active 显示活动和非活动内存(2.5.41及之后的版本) -f, --forks 显示自引导以来的fork数。 这包括fork,vfork和clone系统调用,并且是相当于创建的任务总数。 每个进程由一个或多个任务表示,具体取决于线程用法。此显示不重复(也就是只显示一次)。 -m, --slabs 显示slabinfo。【相关字段含义见下面部分】 -n, --one-header 标题仅显示一次而不是定期显示。 -s, --stats 显示各种事件计数器和内存统计信息。此显示不重复(也就是只显示一次)。 -d, --disk 报告磁盘信息(2.5.70及之后版本) -D, --disk-sum 报告一些有关磁盘活动的摘要统计信息。 -p, --partition device 分区的详细统计信息。 (2.5.70及之后版本). -S, --unit character 更换输出的单位:1000(k),1024(K),1000000(m),1048576(M) 字节。 注意,这不会改变交换(si/so)或块(bi/bo)字段。 -t, --timestamp 为每一行附加时间戳。 -w, --wide 宽屏输出模式(对于具有较高内存量的系统非常有用,其中默认输出模式会受到不必要的列断裂影响)。 输出宽度会超过每行80个字符。 -V, --version 显示版本信息并退出。 -h, --help 显示帮助信息并退出。 字段描述 VM 模式字段描述 进程 r: 可运行进程的数量 (正在运行+就绪状态)。 b: 处于不可中断睡眠的进程数量。 内存 swpd: 使用的虚拟内存量。 free: 空闲内存量。(idle) buff: 用作缓冲区(buffer)的内存量。 cache: 用作缓存(cache)的内存量。 inact: 非活动内存量。(-a选项) active: 活动内存量。(-a选项) 交换内存 si: 从磁盘交换的内存量(/s)。 so: 交换到磁盘的内存量(/s)。 IO bi: 从块设备接收的块数(blocks/s)。 bo: 发送到块设备的块数(blocks/ s)。 系统 in: 每秒的中断数,包括时钟。 cs: 每秒上下文切换次数。 CPU 这些是总CPU时间的占比。 us: 运行非内核代码所花费的时间。 (用户时间, 包括nice时间) sy: 运行内核代码所花费的时间。 (系统时间) id: 空闲时间。在2.

操作系统 —— 进程间通信之管道

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B%E7%AE%A1%E9%81%93/

管道 管道的局限性 半双工:数据只能在一个方向上流动; 只能在具有共同祖先的两个进程间使用。 1. 管道创建 相关函数 #include <unistd.h> int pipe(int fd[2]); fd[0]为读而打开;
fd[1]为写而打开;
fd[1]的输出是fd[0]的输入;【?!】
PIPE_BUF规定内核的管道缓冲区的大小。
pathconf及fpathconf可以确定PIPE_BUF的值。 当管道的一端被关闭后,适用的规则:
当读(read)一个写端被关闭的管道,在所有数据被读取后,read返回0; 当写(write)一个读端被关闭的管道,则产生信号SIGPIPE。 忽略/捕捉信号并从信号处理程序返回后,write返回-1,errno=EPIPE。 A. 疑问 fd[1]的输出是fd[0]的输入? fd[1]写端往管道写数据,即fd[1]的输出。 fd[0]读端从管道读数据,即fd[0]的输入。 详见示例:2_ex_pipe_copy_file_toless_or_more.c 多个进程使用相同的fd[2]的时候,管道的读写是怎么样的? 管道是多个进程共用的,谁都可以写,也都可以读。因此写入/读取的信息可能混杂在一起。 详见示例:3_ex_read_and_write.c

操作系统 —— IO 多路复用之 select

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E4%B9%8B-select/

select select函数允许进程指示内核等待多个事件,并在有一个或多个时间或经历指定时间后唤醒进程。

  1. select #include <sys/select.h> int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout); 作用:指示内核等待多个事件,并在有一个或多个时间或经历指定时间后唤醒进程。 参数: nfds: 待测试的最大描述符+1; readfds: 监听读的fd集合; writefds: 监听写得fd集合; errorfds: 监听异常的fd集合; timeout: 等待超时时间。 NULL: 永远等下去; 非NULL且不为值0: 等待指定时间; 非NULL且值为0: 不等待,检查描述符后立即返回。(轮询) 返回: 返回: 成功:就绪描述符数目 超时:0 出错:-1 2. 描述符就绪条件 读就绪: 该套接字接收缓冲区的数据字节数>=套接字缓冲区低水位标记的当前大小。 高于水位,认为可读。 该套接字的读半部关闭(接收了FIN的TCP连接)。 返回EOF 该套接字是一个监听套接字且已完成的连接数不为0。 此时accept通常不阻塞。 其上有一个套接字错误待处理。 读操作不阻塞、返回-1,并设置errno。 待处理错误,可通过getsockoptvidkSO_ERROR套接字获取并清除。 写就绪: 发送缓冲区的数据字节数>=套接字缓冲区低水位标记的当前大小。 该连接的写半部关闭。 此时写,会产生SIGPIPE信号。 使用非阻塞connect的套接字已建立连接,或者connect已经以失败告终。 其上有一个套接字错误待处理。 异常就绪:(?!) 套接字存在带外数据或者仍处于带外标记。 注意:当某个套接字上发生错误时,它将由select标记为可读又可写。 汇总: 条件 可读吗? 可写吗? 异常吗? 有数据可读 + 关闭连接的读一半 + 给监听套接字准备好新连接 + 有可用于写得空间 + 关闭连接的写一半 + 待处理错误 + + TCP带外数据 + 3.

操作系统 —— 进程间通信之 SystemV 消息队列

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-systemv-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/

消息队列 在新的应用程序中,不应再使用消息队列。【分布式系统里面,好像很常用!需要时再了解!】 详见此Readme 2.4节 若需要客户进程和服务器进程之间的双向数据流,用UNIX域套接字或全双工管道。 队列:消息队列。信息的链接表,存储在内核中,由标识符标识。 队列ID:消息队列标识符。 与队列关联的数据结构:定义队列的当前状态 struct msqid_ds { struct ipc_perm msg_perm; msgqnum_t msg_qnum; // 队列里的消息长度/数量 msglen_t msg_qbytes; // 队列中能容纳的最大字节数 pid_t msg_lspid; // 最后msgsnd()的pid pid_t msg_lrpid; // 最后msgrcv()的pid time_t msg_stime; // 最后msgsnd()的时间 time_t msg_rtime; // 最后msgrcv()的时间 time_t msg_ctime; // 最后改变时间 } 1. 消息队列的系统限制 消息队列的系统限制
导出的:这种限制来源于其他限制。 如:Linux系统中,最大消息数受限于最大队列数,最大队列数受限于系统安装的RAM大小/数量。 2. 相关函数 key转换标识符的规则,见Readme 创建新队列、引用现有队列。 #include <sys/msg.

图解密码技术 —— 第一章-环游密码世界

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%B8%80%E7%AB%A0-%E7%8E%AF%E6%B8%B8%E5%AF%86%E7%A0%81%E4%B8%96%E7%95%8C/

第一章 环游密码世界 名词 明文:加密前的消息。 密文:加密后的消息。 加密:把明文转换为密文的操作。 解密:把密文还原为明文的操作。 破译:接收者以外的人试图将密文还原为明文。 秘钥:加密解密的钥匙。 对称密码:加密、解密使用同一秘钥。 非对称密码:加密、解密使用不同秘钥。(也称为公钥密码) 混合密码系统:结合对称密码和公钥密码的加密方式。 单向散列函数(one-way hash function):用于保证数据的完整性(integrity)。防篡改。 消息认证码(message authentication code):用于确认消息是否来自期望的对象。防篡改、防伪装(认证)。 数字签名(digital signature): 防篡改、防伪装、防止否认。 伪随机数生成器(Pseudo Random Number Generator, PRNG): 一种模拟产生随机数的算法。
密码常识 不要使用保密的密码算法 使用低强度的密码比不进行任何加密更危险 任何密码总有一天都会被破解 密码只是信息安全的一部分

图解密码技术 —— 第十一章-秘钥

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0-%E7%A7%98%E9%92%A5/

第11章 秘钥——秘密的精华 什么是秘钥? 秘钥:一个巨大的数字。
数字本身的大小不重要,重要的是秘钥空间的大小。 秘钥与明文是等价的。
常见的秘钥? DES秘钥:实质长度56bit(7bytes)。 DES-EDE2秘钥:实质长度112bit(14bytes)。 DES-EDE3秘钥:实质长度168bit(21bytes)。 AES秘钥:128/192/256bit 如何管理秘钥? 需要清楚:信息的机密性不应该依赖于密码算法本身,而是应该依赖于妥善保管的秘钥。
生成秘钥: 用随机数生成秘钥; 密码学用途的伪随机数生成器必须是专门针对密码学用途而设计的。 用口令生成秘钥; 配送秘钥: 事先共享秘钥; 更新秘钥: 定期更新,例如每发送1000字节数据更新一次。 更新方式:将当前秘钥的散列值作为下一个秘钥。 这种防止破译过去的通信内容的机制,称为向后安全。
保存秘钥
对秘钥进行加密:有助于减少需要保管的秘钥数量。 作废秘钥
为什么要作废秘钥? 不再需要的秘钥及时作废,防止被解密。 如何作废秘钥? 彻底删除秘钥。 秘钥的分类? 对称、非对称。 用于认证、用于机密性。 Diffie-Hellman秘钥交换 实际并没有交换秘钥,而是通过计算生成相同的秘钥,因此也称为Diffie-Hellman秘钥协商。 什么是基于口令的密码(password based Encryption, PBE)? 根据口令生成秘钥,再用秘钥进行加密的方法。 KEK:通过口令生成的秘钥。 CEK:通过随机数生成器生成的秘钥。 什么是盐?盐的作用是什么? 盐:伪随机数生成器生成的随机数,和口令一起通过单向散列函数生成秘钥(KEK)。 作用:用来防御字典攻击。 字典攻击:准备大量候选KEK,逐一进行尝试。 什么是拉伸? 拉伸:讲单向散列函数进行多次迭代的方法。 通过拉伸可以改良PBE。 如何生成安全的口令? 使用只有自己才能知道的信息。(大原则) 不要使用对自己重要的事物的名字。 不要使用关于自己的信息。 不要使用别人见过的信息。 将多个不同的口令分开使用。 有效利用笔记。 理解口令的局限性。 当对口令字符/长度进行限制时,秘钥的长度(bit)并不太长,可能可以通过暴力破解。 使用口令生成器和管理工具。

图解密码技术 —— 第五章-公钥密码

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%BA%94%E7%AB%A0-%E5%85%AC%E9%92%A5%E5%AF%86%E7%A0%81/

第五章 公钥密码 秘钥配送问题 解决方法 事先共享秘钥 密钥分配中心 Diffie-Hellman密钥交换 公钥密码 RSA RSA是一种公钥密码算法。名字来源于三位作者的姓。
Ron Rivest、Adi Shamir、Leonard Adleman RSA加密 密文 = 明文 ^ E mode N 在RSA中,明文、密钥、密文都是数字。 密文等于明文的E次方对N取模) E = Encryption N = Number E和N的组合就是公钥。 RSA解密 明文 = 密文 ^ D mod N D = Decryption N = Number D和N的组合就是私钥。 求N N = p x q p和q是质数,由伪随机数生成器生成。 求L L = lcm(p - 1, q - 1) lcm:取最小公倍数 求E 1 < E < L gcd(E, L) = 1 gcd: 最大公约数 E和L最大公约数是1(互质) 求D 1 < D < L E x D mode L = 1 中间人攻击 攻击方式: A和B用公钥密码通讯。 中间人X对A冒充B,对B冒充A。 中间人攻击对所有公钥密码对是有效的。

VLAN 介绍

https://isshe.site/p/vlan-%E4%BB%8B%E7%BB%8D/

[TOC]
VLAN VLAN - 虚拟局域网(Virtual Local Area Network)。 在IEEE 802.1Q中,给定以太网上的最大VLAN数为4094。(12位VID。减去头尾的0和4095)
作用 VLAN可以为网络提供以下作用: 广播控制 带宽利用 降低延迟 安全性(非设计作用,本身功能所附加出的) 采用虚拟局域网技术实现交换机以太网的广播隔离。 一个VLAN相当于OSI模型第2层的广播域,它能将广播控制在一个VLAN内部。 不同VLAN之间或VLAN与LAN/WAN的数据通信必须通过第3层(网络层)完成。 原理(划分方式) 物理层(physical layer) 以交换机端口作为划分VLAN的基础。 适合规模不大的组织。 数据链路层(data link layer) 以每台主机的MAC地址作为划分VLAN的基础。 实现方法: 创建一个MAC与VLAN映射的数据库。 当网络设备连接到端口后,交换机向VMPS(VLAN管理策略服务器)请求这个数据库。 找到相应的映射,完成VLAN的分配。 优点: 计算机物理位置的不同,也不影响VLAN的运作。 缺点: 人为建立MAC与VLAN的映射关系;因此导致管理复杂度增加。 网络层 以IP地址作为划分VLAN的基础;以子网视为VLAN设置的依据。【???】 优点: 网管人员已经将内部网段做好规划与分配后,将可大辐降低规划并设置VLANs架构的复杂度。 缺点: 交换机需要对帧进行处理(原本不需要),降低交换机接收和分派分组的效率。

网络协议 —— DHCP

https://isshe.site/p/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE-dhcp/

DHCP DHCP - 动态主机设置协议(Dynamic Host Configuration Protocol)。 DHCP是一个应用层协议。基于UDP。
作用 用于内网或网络服务供应商自动分配IP给用户。 作为内部管理员对所有计算机进行**管理的手段。 历史 DHCP在1993年10月成为标准协议,它的前身是BOOTP协议。 BOOTP:BOOTP是一种网络协议,让电脑或其他周边仪器可以从服务器下载启动程序。 数据包类型 DHCP发现(DISCOVER):client在物理子网上发送广播来寻找可用的服务器。 DHCP提供(OFFER):当DHCP服务器收到一个来自客户的IP租约请求时,它会提供一个IP租约。 DHCP请求(REQUEST):当客户PC收到一个IP租约提供时,它必须告诉所有其他的DHCP服务器它已经接受了一个租约提供。 DHCP确认(Acknowledge,ACK):确认租约,包含租期和客户可能请求的其他所有配置信息。 DHCP释放(RELEASE):客户端向DHCP服务器发送一个请求以释放DHCP资源,并注销其IP地址。 DHCP NAK:服务器回复客户,客户要求的网址不能被分配。 原理/流程 客户主机发送DHCP服务器发现(DISCOVER)广播包。 服务器收到DISCOVER包后,回复OFFER单播或广播包。【疑问?】 客户主机收到OFFER包后,发送REQUEST广播包。 服务器回复ACK单播或广播包。包含分配的IP及网关IP(next server IP)、租约等。 典型DHCP会话的模式
协议结构 +-------+--------+--------+--------+ |8 bits | 8 bits | 8 bits | 8 bits | +-------+--------+--------+--------+ | Op | Htype | Hlen | Hops | +-------+--------+--------+--------+ | Xid | +----------------------------------+ | Secs | Flags | +----------------+-----------------+ | Ciaddr | +----------------------------------+ | Yiaddr | +----------------------------------+ | Siaddr | +----------------------------------+ | Giaddr | +----------------------------------+ | Chaddr (16 bytes) | +----------------------------------+ | Sname (64 bytes) | +----------------------------------+ | File (128 bytes) | +----------------------------------+ | Option (variable) | +----------------------------------+ Op: 信息类型。如:客户端请求为1,服务器回复为2。 Htype:硬件类型。如:Ethernet(0x01) Hlen: 硬件地址长度。如:6。(MAC地址) Hops: 跳数。 Xid:传输ID。 Secs: 过去的时间。【疑问】 Flags:标记。 Ciaddr:客户端IP地址。(这里应该是续约的时候用的) Siaddr:下一个服务器IP地址。 Yiaddr:你的IP。(分配给客户机的IP) Giaddr:中继代理IP。【???】 Chaddr:客户机硬件地址。(Ethernet中就是Mac地址) Sname:服务器主机名称。 File:文件名。 Options:选项。详见rfc2132 1:子网掩码; 3:路由(网关); 12:主机名 50:请求的IP地址 51:租约时间 53:DHCP消息类型。即上面的几种类型。 54:服务器标识。 疑问 DHCP服务器是否可以把一台主机拉黑? 这个应该由DHCP软件提供。 服务器回复为什么是单播或广播包? Flags中设置BROADCAST = 0时,则是单播;否则是广播。这是为了健壮性,同时兼容单播和多播。 Secs字段是哪一个时间段? 从获取到IP地址或者续约过程开始到现在所消耗的时间。 Giaddr字段作用是什么? giaddr: 中继代理地址。 中继代理相关详见:博客 相关 DHCP: RFC 2131 DHCP6: RFC 3315 DHCP wiki DHCP wiki中文 rfc2132

图解密码技术 —— 第七章-单向散列函数

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%B8%83%E7%AB%A0-%E5%8D%95%E5%90%91%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B0/

第七章 单向散列函数 单向散列函数(one-way hash function): 可以根据消息的内容,计算出散列值。
散列值可以被用于检查消息的完整性。 输入:消息(message);输出:散列值(hash value)。 性质 抗碰撞性:collision resistance,难以发生碰撞。 单向性:one-way,无法通过散列值反算出消息的性质。
术语 单向散列函数:消息摘要函数、哈希函数、杂凑函数。 消息:原像。 散列值:消息摘要、指纹。 完整性:一致性。

操作系统 —— 线程

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E7%BA%BF%E7%A8%8B/

线程 当一个程序由exec启动执行时,系统将创建一个称为初始线程(initail thread)或主线程(main thread)的单个线程。 线程取消在8.5章,被取消的线程要释放相关资源(锁等),需要注意。 线程创建可能比进程创建快10~100倍; 线程或者是可汇合的(joinable)或者是脱离/分离的(detached)。(默认可汇合的) 可汇合的线程可以被其他线程回收其资源和杀死。 当可汇合的线程终止时,其线程ID和退出状态将保留,直到另一个线程调用pthread_join; 脱离的线程则像守护进程:终止时,所有资源都释放,因此不能等待它终止; 线程是运行在进程上下文中的逻辑流。 1. 共享及私有 线程共享的内容:
进程指令; 大多数数据; 打开的文件(如描述符); 信号处理程序和信号处置; 当前工作目录; 用户ID和组ID; 线程私有的内容: 线程ID; 寄存器集合(包括程序计数器和栈指针); 栈; 栈指针; 程序计数器; errno; 信号掩码; 优先级; 2. 相关函数 2.1 pthread_create #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 作用:创建线程 参数: tid:线程ID;这是结果参数; attr: 线程属性,如优先级、初始栈大小、是否是一个守护线程等;通常采用默认值; start_routine: 创建的线程所需要执行的函数;称为线程启动函数(thread start function); arg: 参数;如果有多个,则打包成一个结构即可; 返回: 成功:0 失败:Exxx值 2.

操作系统 —— 进线程同步之互斥锁、条件变量

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E4%B9%8B%E4%BA%92%E6%96%A5%E9%94%81%E6%9D%A1%E4%BB%B6%E5%8F%98%E9%87%8F/

互斥锁与条件变量 互斥锁及条件变量是同步的基本组成部分。 互斥锁及条件变量出自Posix.1线程标准; 可以用来同步一个进程内的各个线程; 也可以用在进程间同步:互斥锁放在多个进程的共享内存区中。 1.互斥锁 互斥锁:相互排斥,是最基本的同步形式。 作用:保护临界区(critical region)。 保护的是数据:临界区中被操纵的数据;进程/线程共享的数据。 互斥锁是协作性锁,也就是锁无法防止一些进程/线程不先获取锁就访问数据。(需要靠自觉) 1.1 相关函数 静态分配使用PTHREAD_MUTEX_INITIALIZER进行初始化 #include <pthread.h> // 互斥锁初始化、销毁 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); int pthread_mutex_destroy(pthread_mutex_t *mutex); // 上锁、解锁 int pthread_mutex_lock(pthread_mutex_t *mptr); int pthread_mutex_trylock(pthread_mutex_t *mptr); int pthread_mutex_unlock(pthread_mutex_t *mptr); // 属性初始化、销毁 int pthread_mutexattr_init(pthread_mutexattr_t *attr); int pthread_mutexattr_destroy(pthread_mutexattr_t *attr) // 属性设置:进程间共享等(MACOS和LINUX相关函数有所不同) // 均返回:成功:0,失败:正的Exxx值 2. 条件变量 互斥锁用于上锁,条件变量用于等待。 每个条件变量总是与一个互斥锁相关联。 2.1 相关函数 静态分配使用PTHREAD_COND_INITIALIZER进行初始化 #include <pthread.

图解密码技术 —— 第八章-消息认证码

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%85%AB%E7%AB%A0-%E6%B6%88%E6%81%AF%E8%AE%A4%E8%AF%81%E7%A0%81/

消息认证码-消息被正确传送了吗 消息认证码: Message Authentication Code,MAC。
是一种确认完整性并进行认证的技术。 是一种与秘钥相关联的单向散列函数。 输入:任意长度的消息 + 共享秘钥。 输出:固定长度的数据。 消息认证码使用的秘钥必须是密码学安全的、高强度的伪随机生成器。如果是人为选定,则会增加秘钥被推测的风险 消息验证码能与不能 不能保证消息的机密性; 不能防止否认; 能识别出篡改行为; 能对消息进行认证;(合法) 消息验证码的局限性 无法防止否认; 无法防止否认的本质是:相同的秘钥有多于1个人获得。

图解密码技术 —— 第四章-分组密码的模式

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%9B%9B%E7%AB%A0-%E5%88%86%E7%BB%84%E5%AF%86%E7%A0%81%E7%9A%84%E6%A8%A1%E5%BC%8F/

第四章 分组密码的模式 DES和AES都属于分组密码,它们只能加密固定长度的明文。 如果需要加密任意长度的明文,则需进行迭代,而分组密码的迭代方法,就称为分组密码的模式。
分组密码与流密码 密码算法可以分为分组密码和流密码。 流密码:一次性密码本 分组密码:DES、AES、3DES等大多数堆成密码算法。
模式分类 ECB:Electronic CodeBook mode,电子密码本模式。 CBC:Cipher Block Chaining mode,密码分组链接模式。 CFB:Cipher FeedBack mode,密文反馈模式。 OFB:Output FeedBack mode,输出反馈模式。 CTR:CounTeR mode,计数器模式。 GCM:Galois/Counter Mode, 。 初始化向量 由于加密第一个分组时,不存在“前一个密文分组”,因此事先准备一个长度为一个分组的bit序列来代替。此序列称为初始化向量(Initialization Vector, IV)
初始化向量必须使用不可预测的随机数。 ECB模式 电子密码本模式:切割明文为多个分组,逐个加密。(容易有安全漏洞,不要使用)
加解密过程图示 加解密过程图示 CBC模式 密码分组链接模式:密文分组像链条一样互相连接在一起。(前一个密文分组用于后一个分组的加密)
特点 无法直接对中间分组进行加密。 一个密文分组损坏,解密时最多只有两个明文分组受影响。(在密文长度没变的情况下) 加解密过程图示 加解密过程图示 CFB模式 密文反馈模式:前一个密文分组被送到密码算法的输入端,用于生成下一个密文分组。
特点 依赖上一个密文分组。 加解密过程图示 加解密过程图示 OFB模式 输出反馈模式:加密算法的输出作为下一个分组加密算法的输入。

DHCP 协议介绍

https://isshe.site/p/dhcp-%E5%8D%8F%E8%AE%AE%E4%BB%8B%E7%BB%8D/

title: 【网络协议】DHCP-动态主机配置协议 date: 2018-08-18 14:30:31 tags:
计算机网络 DHCP categories: 网络协议 toc: false mathjax: false description: top: false [TOC]
DHCP DHCP - 动态主机设置协议(Dynamic Host Configuration Protocol)。 DHCP是一个应用层协议。基于UDP。
作用 用于内网或网络服务供应商自动分配IP给用户。 作为内部管理员对所有计算机进行**管理的手段。 历史 DHCP在1993年10月成为标准协议,它的前身是BOOTP协议。 BOOTP:BOOTP是一种网络协议,让电脑或其他周边仪器可以从服务器下载启动程序。 数据包类型 DHCP发现(DISCOVER):client在物理子网上发送广播来寻找可用的服务器。 DHCP提供(OFFER):当DHCP服务器收到一个来自客户的IP租约请求时,它会提供一个IP租约。 DHCP请求(REQUEST):当客户PC收到一个IP租约提供时,它必须告诉所有其他的DHCP服务器它已经接受了一个租约提供。 DHCP确认(Acknowledge,ACK):确认租约,包含租期和客户可能请求的其他所有配置信息。 DHCP释放(RELEASE):客户端向DHCP服务器发送一个请求以释放DHCP资源,并注销其IP地址。 DHCP NAK:服务器回复客户,客户要求的网址不能被分配。 原理/流程 客户主机发送DHCP服务器发现(DISCOVER)广播包。 服务器收到DISCOVER包后,回复OFFER单播或广播包。【疑问?】 客户主机收到OFFER包后,发送REQUEST广播包。 服务器回复ACK单播或广播包。包含分配的IP及网关IP(next server IP)、租约等。 典型DHCP会话的模式
协议结构 +-------+--------+--------+--------+ |8 bits | 8 bits | 8 bits | 8 bits | +-------+--------+--------+--------+ | Op | Htype | Hlen | Hops | +-------+--------+--------+--------+ | Xid | +----------------------------------+ | Secs | Flags | +----------------+-----------------+ | Ciaddr | +----------------------------------+ | Yiaddr | +----------------------------------+ | Siaddr | +----------------------------------+ | Giaddr | +----------------------------------+ | Chaddr (16 bytes) | +----------------------------------+ | Sname (64 bytes) | +----------------------------------+ | File (128 bytes) | +----------------------------------+ | Option (variable) | +----------------------------------+ Op: 信息类型。如:客户端请求为1,服务器回复为2。 Htype:硬件类型。如:Ethernet(0x01) Hlen: 硬件地址长度。如:6。(MAC地址) Hops: 跳数。 Xid:传输ID。 Secs: 过去的时间。【疑问】 Flags:标记。 Ciaddr:客户端IP地址。(这里应该是续约的时候用的) Siaddr:下一个服务器IP地址。 Yiaddr:你的IP。(分配给客户机的IP) Giaddr:中继代理IP。【???】 Chaddr:客户机硬件地址。(Ethernet中就是Mac地址) Sname:服务器主机名称。 File:文件名。 Options:选项。详见rfc2132 1:子网掩码; 3:路由(网关); 12:主机名 50:请求的IP地址 51:租约时间 53:DHCP消息类型。即上面的几种类型。 54:服务器标识。 疑问 DHCP服务器是否可以把一台主机拉黑? 这个应该由DHCP软件提供。 服务器回复为什么是单播或广播包? Flags中设置BROADCAST = 0时,则是单播;否则是广播。这是为了健壮性,同时兼容单播和多播。 Secs字段是哪一个时间段? 从获取到IP地址或者续约过程开始到现在所消耗的时间。 Giaddr字段作用是什么? giaddr: 中继代理地址。 中继代理相关详见:博客 相关 DHCP: RFC 2131 DHCP6: RFC 3315 DHCP wiki DHCP wiki中文 rfc2132

图解密码技术 —— 第14章-SSL-TLS

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC14%E7%AB%A0-ssl-tls/

SSL/TLS为了更安全的通信
什么是SSL/TLS? 是世界上应用最广泛的密码通信方法。 SSL: Secure Socket Layer. TLS: Transport Layer Security. 相当于SSL的后续版本。 由(下层)TLS记录协议(TLS record protocol)和(上层)TLS握手协议(TLS handshake protocol)这两层协议叠加而成。 TLS记录协议 TLS记录协议负责:消息的压缩、加密、数据的认证。
TLS握手协议 TLS握手协议:加密之外的其他各种操作。 握手协议 密码规格变更协议 警告协议 应用数据协议

ICMP 协议介绍

https://isshe.site/p/icmp-%E5%8D%8F%E8%AE%AE%E4%BB%8B%E7%BB%8D/

[TOC]
ICMP ICMP - 互联网控制消息协议(Internet Control Message Protocol) ICMP是互联网协议族的核心协议之一。 IMCP用于发送控制消息,提供可能发生在通信环境中的各种问题反馈。 ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。 原理及技术细节 每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。 报文结构 ICMP报头从IP报头的第160位(20字节)开始:(有可选部分另算)
8bit 8bit 8bit 8bit +------+------+------+------+ | Type | Code | Checksum | +------+------+------+------+ | ID | Sequence | +------+------+------+------+ Type: ICMP报文类型。 Code:进一步划分ICMP的类型;该字段用来查找产生错误的原因。 例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。 Checksum:校验和。 ID:ID/标识,在Echo Reply类型的消息中需要返回这个字段。 Sequence:序号,在Echo Reply类型的消息中需要返回这个字段。 报文类型 Type Code Status 描述 查询 差错 备注 0:Echo响应 0 Echo响应 ✓ ping中使用 1 未分配 ✓ 保留 2 未分配 ✓ 保留 3:目的不可达 0 目标网络不可达 ✓ 1 目标主机不可达 ✓ 2 目标协议不可达 ✓ 3 目标端口不可达 ✓ 4 要求分段并(但)设置DF标记 ✓ 5 源路由失败 ✓ 6 未知的目标网络 ✓ 7 未知的目标主机 ✓ 8 源主机隔离(作废不用) ✓ 9 禁止访问的网络 ✓ 10 禁止访问的主机 ✓ 11 对特定的TOS 网络不可达 ✓ 12 对特定的TOS 主机不可达 ✓ 13 由于过滤 网络流量被禁止 ✓ 14 主机越权 ✓ 15 优先权终止生效 ✓ 4:源端关闭 0 弃用 源端关闭(拥塞控制) ✓ 5:重定向 0 重定向网络 ✓ 1 重定向主机 ✓ 2 基于TOS的网络重定向 ✓ 3 基于TOS的主机重定向 ✓ 6 弃用 备用主机地址 7 未分配 保留 8 0 Echo请求 ✓ 9 0 路由通告 ✓ 10 0 路由器的发现/选择/请求 ✓ 11:超时 0 TTL超时 ✓ 1 分片重组超时 ✓ 12:参数问题-IP头部错误 0 IP报文首部参数错误 ✓ 1 丢失必要选项 ✓ 2 不支持的长度 13 0 时间戳请求 ✓ 14 0 时间戳应答 ✓ 15 0 信息请求 ✓ 16 0 信息应答 ✓ 17 0 地址掩码请求 ✓ 18 0 地址掩码应答 ✓ 19 保留 因安全原因保留 2029 保留 保留用于稳健性实验 3039 弃用 40 Photuris, Security failures ??? 41 用于实验性移动协议,如Seamoby[RFC4065] 42~255 保留 235 实验性 RFC3692 254 实验性 RFC3692 部分报文结构示例 3:目标不可达 目的地不可达由主机或其入站网关生成,以通知客户端由于某种原因目的地不可达。

操作系统 —— 进程间通信之 Posix 共享内存

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-posix-%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/

Posix共享内存区 Posix.1提供了两种无亲缘关系进程间共享内存区的方法:(都需要调用mmap)
内存映射文件(memory-mapped file):由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件。 共享内存区对象(share-memory object):由shm_open打开一个Posix.1 IPC名字,所返回的描述符由mmap函数映射到当前进程的地址空间。 1. 相关函数 #include <sys/mman.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> // 只是打开一个内存区对象,返回fd // oflag: 必须函数O_RDONLY、O_RDWR中的一个。 // mode: // * 指定权限为,在指定了O_CREAT的前提下使用。 // * 与mq_open和sem_open不同,shm_open的mode参数必须指定。 int shm_open(const char *name, int oflag, ...); // 删除一个共享内存区对象的名字。(删除一个名字不会影响低层支撑对象的现有引用。) int shm_unlink(const char *name); // 裁剪普通文件或者共享内存区对象 int ftruncate(int fd, off_t length); //获取打开的共享内存对象的信息 int fstat(int fildes, struct stat *buf); 2. 示例 共享计数器持续+1 示例6_1 示例6_2 向服务器发送消息 A.

操作系统 —— IO 多路复用之 epoll

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E4%B9%8B-epoll/

epoll I/O事件通知设施(I/O event notification facility)。

  1. epoll_create #include <sys/epoll.h> int epoll_create(int size); int epoll_create1(int flags); 作用:打开一个epoll文件描述符。 参数: size: Linux 2.6.8后不再使用,但是必须大于0。 flags: 0:和epoll_create行为一样。 O_CLOEXEC: 进程退出时关闭文件描述符。 返回: 失败:-1,设置errno;否则: 返回一个指向一个新epoll实例的文件描述符;当不再使用此描述符时,应使用close关闭。 当所有指向此epoll实例的描述符都被关闭时,内核会释放相关资源。 2. epoll_ctl typedef union epoll_data { void ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; / Epoll events / epoll_data_t data; / User data variable */ }; int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 作用:epoll文件描述符的控制接口。 参数: epfd: epoll fd,epoll文件描述符; op: EPOLL_CTL_ADD:注册fd到epfd; EPOLL_CTL_MOD:修改与fd的关联evnet事件。 EPOLL_CTL_DEL:从epfd中删除fd; fd: 要操作(op)的fd; event: 与fd关联的事件。EPOLL_CTL_DEL时这个参数被忽略,也可以直接为NULL; 返回: 正常:0; 异常:-1,设置errno; 数据结构说明; struct epoll_event的events的是位掩码的形式,取值是: EPOLLIN: 相关文件可读。(read) EPOLLOUT: 相关文件可写。(write) EPOLLRDHUP: 流套接字对端关闭连接,或关闭写入一半的连接。(在使用边沿触发时,此标志对于编写简单代码以检测对端关闭特别有用。) EPOLLPRI: 有紧急数据可读。 EPOLLERR: 相关文件描述符发生错误。(默认设置,不用手动设置) EPOLLHUP: 相关文件描述符被挂起。(默认设置,不用手动设置) EPOLLET: 相关文件描述符设置为边缘触发。(默认是水平触发) EPOLLONESHOT: 对相关描述符设置一次性行为。 epoll_wait一次后,不会再wait,除非使用EPOLL_CTL_MOD重新设置。 EPOLLWAKEUP: 设置此标记,使事件排队时系统保持唤醒。 当系统设置了自动休眠模式(/sys/power/autosleep)时,为了保持设备唤醒直到事件处理完成,必须使用此标记。 EPOLLEXCLUSIVE:为附加到目标文件描述符fd的epoll文件描述符设置独占唤醒模式。【???】 3.

ARP 协议介绍

https://isshe.site/p/arp-%E5%8D%8F%E8%AE%AE%E4%BB%8B%E7%BB%8D/

[TOC]
ARP协议 ARP(Address Resolution Protocol):地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。
工作过程 当主机A要与主机B通信时,地址解析协议可以将主机B的IP地址解析成主机B的MAC地址(如果A/B不同网段,则A解析的应该是下一跳的MAC地址),以下为工作流程:
第1步:主机A根据路由表内容,确定用于访问主机B的转发IP地址。主机A在本地ARP缓存中查找与主机B的IP匹配MAC地址。 第2步:如果主机A没有找到映射,则将ARP请求帧广播到本地网络上的所有主机。 收到请求的主机检查自己的IP是否匹配,不匹配就丢弃此ARP请求。 第3步:主机B确定ARP请求中的IP地址与自己的IP地址匹配,则将主机A的IP地址和MAC地址映射添加到本地ARP缓存中。 第4步:主机B将包含其MAC地址的ARP回复消息直接发送回主机A。 第5步:当主机A收到从主机B发来的ARP回复消息时,会用主机B的IP和MAC地址映射更新ARP缓存。本机缓存是有生存期的,生存期结束后,将再次重复上面的过程。主机B的MAC地址一旦确定,主机A就能向主机B发送IP通信了。 问题 什么是ARP欺骗? 地址解析协议是建立在网络中各个主机可互相信任的基础上的,收到应答报文的主机,不会校验报文的真实性,就会加到ARP缓存中。 由此,攻击者可以向某一主机发送伪ARP应答报文,使此主机发送的信息无法到达预期的主机或者到达错误的主机,这就是ARP欺骗。

图解密码技术 —— 第十二章-随机数

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0-%E9%9A%8F%E6%9C%BA%E6%95%B0/

第12章 随机数——不可预测性的源泉 随机数的作用?使用场景是什么? 生成秘钥:用于对称密码和消息认证码。 生成秘钥对:用于公钥密码和数字签名。 生成初始化向量(IV):用于分组密码的CBC/CFB/OFB模式。 生成nonce:用于防御重放共计以及分组密码的CTR模式等。 生成盐:用于基于口令的密码等。 随机数的性质 随机性——不存在统计学偏差,是完全杂乱的数列。 不可预测性——不能从过去的数列推测下一个出现的数。 不可重现性——除非将数列本身保存下来,否则不能重现相同的数列。 以上3个性质,越往下越严格。 随机数强度 弱伪随机数:只有随机性。 强伪随机数:具有随机性+不可预测性。 真随机数:同时具备上面三个性质。

数据库 —— Postgresql 慢查询分析

https://isshe.site/p/%E6%95%B0%E6%8D%AE%E5%BA%93-postgresql-%E6%85%A2%E6%9F%A5%E8%AF%A2%E5%88%86%E6%9E%90/

Postgresql 慢查询语句记录与分析 1. 记录 postgresql 以 12 版本为例
我们需要先打开 postgresql 的慢查询日志,此为前置条件,先记录下我们时间较长的查询。
编辑配置文件:/var/postgres12/data/postgresql.conf #log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements # and their durations, > 0 logs only # statements running at least this number # of milliseconds 修改 -1 为 200,表示大于等于 200 毫秒的操作将被记录到日志。
重载配置 /path/to/pg_ctl reload -D /path/to/pgdata 2. 获取慢查询语句 2.1 切 postgresql 超户 sudo su - postgres 2.2 获取慢查询语句 打开日志文件 less /path/to/pg_log/postgresql.

Linux 命令 —— netstat

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-netstat/

netstat 显示当前的连接情况。(UDP、TCP、UNIX、ICMP等) 显示路由表、网络接口列表、网络统计信息、多播信息、伪装连接等。

  1. 介绍 1.1 用法 netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help} netstat [-vWnNcaeol] [<Socket> ...] netstat { [-vWeenNac] -i | [-cWnNe] -M | -s } 1.2 选项 -r, --route 显示路由表 -i, --interfaces 显示接口列表 -g, --groups 显示多播组成员 -s, --statistics 显示网络统计信息 -M, --masquerade display masqueraded connections【???】 -v, --verbose 详细 -W, --wide 不要截断IP地址 -n, --numeric 不要解析IP成域名(直接使用IP,不经过域名服务器) --numeric-hosts 不要解析主机名 --numeric-ports 不要解析端口名 --numeric-users 不要解析用户名 -N, --symbolic 解析硬件名 【???】 -e, --extend 显示更多信息 -p, --programs 显示进程ID和进程名 -c, --continuous 持续列出网络状态 -l, --listening 显示LISTENING状态的连接 -a, --all, --listening 显示所有连接(默认: 显示CONNECTED的连接) -o, --timers 显示计时器 【netstat -to】 -F, --fib 显示转发信息库(Forwarding Information Base),默认显示 -C, --cache 显示路由缓存(routing cache)而不是FIB -t, --tcp 显示TCP信息 -u, --udp 显示UDP信息 -w, --raw 实现raw信息 -x, --unix 显示unix信息 --ax25 显示AMPR AX.

操作系统 —— 进程间通信之 Posix 消息队列

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-posix-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/

Posix 信息队列 消息队列可认为是一个消息链表。具有随内核的持续性 有读权限的线程可以从队列中取走信息; 有写权限的线程可以从队列中放置信息; 允许异步事件通知。 1. 相关函数 #include <mqueue.h>// 打开消息队列 mqd_t mq_open(const char name, int oflag, ... / mode_t mode, struct mq_attr *attr */); // 关闭消息队列,调用进程不用,但不会被删除消息队列 int mq_close(mqd_t mqdes); // 从系统中删除消息队列 // mq_unlink(const char *name); // int mq_notify(mqd_t mqdes, const struct sigevent *notification); A. Posix消息队列和SystemV消息队列的区别 Posix消息队列的读总是返回最高优先级的最早消息;System V消息队列的读可以返回任意指定优先级的消息。 往空队列放置一个消息时,Posix消息队列允许产生一个信号或者启动一个线程。System V没有类似的机制。

操作系统 —— 进程间通信之共享内存

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98/

Posix共享内存区 共享内存区是可用IPC形式中最快的。 一旦内存区映射到共享它的进程的地址空间,这些进程间的数据传递就不需要经过内核了;但是读写内存区时,需要进行同步。 非共享缓冲区读文件传给另一个进程写:4次内核与内核的交互 非共享缓冲区读文件传给另一个进程写 共享缓冲区读文件传给另一个进程写:2次内核与进程的交互 共享缓冲区读文件传给另一个进程写 1. 相关函数 1.1 mmap mmap: 把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间。 使用此函数有3个目的: 使用普通文件以提供内存映射I/O; 使用特殊文件以提供匿名内存映射; 使用shm_open以提供无亲缘关系进程间的Posix共享内存区。 映射文件示意图: 映射文件示意图 #include <sys/mman.h> // addr: 指定fd映射到的进程内空间的起始地址; // len: 映射的长度——字节数; // offset: 从被映射文件开头起offset字节开始映射; // prot: 属性/模式(PROT_READ|PROT_WRITE|PROT_EXEC|PROT_NONE) // * PROT_NONE Pages may not be accessed. // * PROT_READ Pages may be read. // * PROT_WRITE Pages may be written. // * PROT_EXEC Pages may be executed.

操作系统 —— 进程间通信之 SystemV 信号量

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8B-systemv-%E4%BF%A1%E5%8F%B7%E9%87%8F/

System V 信号量 1. 概述 二值信号量(binary semaphore): 其值为0或1的信号量; 计数信号量(counting semaphore): 其值为0~某个限制值之间的信号量; 以上两种信号量,等待(waiting)操作都等待信号量的值变为大于0; 计数信号量集(set of counting semaphores): 一个或多个信号量(构成一个集合), 其中的每个都是计数信号量。 System V信号量通过此概念给信号量增加了一级复杂度。 当讨论System V信号量时,都是指计数信号量集;当讨论Posix信号量时,都是指计数信号量。
约定: semval: 信号量当前值 semncnt: 等待semval变为大于其当前值的线程数; semzcnt: 等待semval变为0的线程数; semadj: 所指定信号量针对调用进程的调整值;【???】 2.信号量集相关数据结构 信号量集结构图
struct semid_ds { struct ipc_perm sem_perm; // 操作权限 struct sem *sem_base; // 指向信号量集数组的指针 ushort sem_nsems; // 信号量集中信号量的数量 time_t sem_otime; // 最后semop()的时间 time_t sem_ctime; // 最后创建或IPC_SET的时间 } struct sem { ushort_t semval; // 信号量值 short sempid; // 最后成功semop()/SETVAL, SETALL的PID ushort_t semncnt; // awaiting semval > current vale的数量 ushort_t semzcnt; // awaiting semval = 0 的数量 } // 给信号量集中某个特定的信号量指定一个操作 // 不能静态初始化,顺序根据实现不同而不同 struct sembuf { short sem_num; // 信号量号:0, 1, .

图解密码技术 —— 第九章-数字签名

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E4%B9%9D%E7%AB%A0-%E6%95%B0%E5%AD%97%E7%AD%BE%E5%90%8D/

数字签名 公钥密码:存在加密秘钥(公钥)和解密秘钥(私钥)。用公钥加密。 数字签名:签名秘钥(私钥)和验证秘钥(公钥)。用私钥加密。 数字签名并不是为了保证机密性。
签名的生成和验证 签名秘钥:私钥。用于对消息进行签名——生成签名。只能一人持有。 验证秘钥:公钥。用于验证消息的签名——验证签名。可以多人持有。
对消息签名的过程 A用自己的私钥进行加密。 A将签名和消息发送给B。 B用A的公钥进行解密(签名验证)。 B将解密后的消息与A发过来的消息进行对比。一致,则验证成功,否则,验证失败。 对消息散列值签名的过程 公钥密码算法较慢,如果直接对消息进行签名,会比较耗时。
A用单向散列函数计算消息的散列值。 A用私钥对散列值进行加密。 A将消息和签名发送给B。 B用A的g公钥对收到的签名进行解密。 B将签名解密后得到的散列值与A发送的消息的散列值进行对比。一致,验证成功,否则,验证失败。 应用场景 信息公告 确保是目标组织发布的目标公告,法制被篡改。 软件下载 软件下载完成后,验证签名,防止软件遭到篡改。(并不能检测软件是否是恶意的) 公钥证书。 验证数字签名时,需要合法的公钥。对公钥进行签名得到的就是公钥证书。【第三方???】 SSL/TLS。 使用服务器证书验证服务器身份。 服务器证书:加上数字签名的服务器公钥。 总结 对称密码的秘钥是机密性的精华,单向散列函数的散列值是完整性的精华。

Linux 命令 —— ssh

https://isshe.site/p/linux-%E5%91%BD%E4%BB%A4-ssh/

ssh 隧道 场景:家里内网机器 A 想要访问公司的内网机器 B。 条件:需要一个公网机器 C (假设IP是 1.1.1.1)。
打开公网机器的转发
在 B 上执行:
ssh -p 22 -NR 0.0.0.0:10443:0.0.0.0:443 [email protected] # 前面部分 0.0.0.0:10443:C 的信息 # 后面部分 0.0.0.0:443:B 的信息 注意:此时链接会一直保持,终端不会返回。
在 A 上执行: ssh -p 22 -NL 0.0.0.0:10443:0.0.0.0:10443 [email protected] # 前面部分 0.0.0.0:10443:A 的信息 # 后面部分 0.0.0.0:10443:C 的信息 注意:此时链接会一直保持,终端不会返回。
此时,在 A 上通过 localhost:10443 即可访问 B 的 443。
端口映射 此方法相比上面的更为简化,直接把内网端口映射到外网设备上,直接访问外网设备映射的端口即可。
修改公网设备的 ssh 配置 sudo vi /etc/ssh/sshd_config # 设置 GatewayPorts yes # 重启 ssh 服务 sudo systemctl restart sshd 进行端口映射 在内网机器上:

操作系统 —— 进程间通信之FIFO

https://isshe.site/p/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F-%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E4%B9%8Bfifo/

FIFO FIFO有时被称为命名管道。 FIFO是一种文件类型。 支持在无亲缘进程间使用。 1. FIFO创建 创建FIFO类似于创建文件;FIFO的路径名存在于文件系统中。 2. 创建FIFO 相关函数 #include <sys/stat.h>int mkfifo(const char *path, mode_t mode); // 在fd表示的目录相关位置,创建一个FIFO。 // * path为绝对路径,则忽略fd // * path为相对路径,则fd参数是一个打开的目录的文件描述符。路径名和目录有关【???】 // * path为相对路径,并且fd参数有特殊值AT_FDCWD,则路径名以当前目录开始。 int mkfifoat(int fd, const char *path, mode_t mode); 3. 其他 open一个FIFO时,非阻塞标记(O_NONBLOCK)会产生的影响: 一般情况下(没有指定O_NONBLOCK), 只读open要阻塞到其他进程为写打开此FIFO为止; 只写open要阻塞到其他进程为读打开此FIFO为止; 如果指定了O_NONBLOCK,则: 只读open时,立即返回。【返回啥?正常返回?】 只写open时,如果没有其他进程为读打开此FIFO,则此只写open返回-1,errno置为ENXIO。 若write一个没有进程为读打开的FIFO,则产生信号SIGPIPE。(类似pipe) 若FIFO的最后一个写进程关闭了该FIFO,则将为改FIFO的读进程产生一个文件结束标记。(类似于pipe) FIFO的两种用途: shell命令使用FIFO将数据从一条管道传送到另一条时,无需创建中间临时文件; 客户——服务器进程应用中,FIFO用作汇聚点,在客户和服务器进程间传递数据; 4.

网络协议 —— ICMP

https://isshe.site/p/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE-icmp/

ICMP ICMP - 互联网控制消息协议(Internet Control Message Protocol) ICMP是互联网协议族的核心协议之一。 IMCP用于发送控制消息,提供可能发生在通信环境中的各种问题反馈。 ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。 原理及技术细节 每个路由器在转发数据报的时候都会把IP包头中的TTL值减1。 报文结构 ICMP报头从IP报头的第160位(20字节)开始:(有可选部分另算)
8bit 8bit 8bit 8bit +------+------+------+------+ | Type | Code | Checksum | +------+------+------+------+ | ID | Sequence | +------+------+------+------+ Type: ICMP报文类型。 Code:进一步划分ICMP的类型;该字段用来查找产生错误的原因。 例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。 Checksum:校验和。 ID:ID/标识,在Echo Reply类型的消息中需要返回这个字段。 Sequence:序号,在Echo Reply类型的消息中需要返回这个字段。 报文类型 Type Code Status 描述 查询 差错 备注 0:Echo响应 0 Echo响应 ✓ ping中使用 1 未分配 ✓ 保留 2 未分配 ✓ 保留 3:目的不可达 0 目标网络不可达 ✓ 1 目标主机不可达 ✓ 2 目标协议不可达 ✓ 3 目标端口不可达 ✓ 4 要求分段并(但)设置DF标记 ✓ 5 源路由失败 ✓ 6 未知的目标网络 ✓ 7 未知的目标主机 ✓ 8 源主机隔离(作废不用) ✓ 9 禁止访问的网络 ✓ 10 禁止访问的主机 ✓ 11 对特定的TOS 网络不可达 ✓ 12 对特定的TOS 主机不可达 ✓ 13 由于过滤 网络流量被禁止 ✓ 14 主机越权 ✓ 15 优先权终止生效 ✓ 4:源端关闭 0 弃用 源端关闭(拥塞控制) ✓ 5:重定向 0 重定向网络 ✓ 1 重定向主机 ✓ 2 基于TOS的网络重定向 ✓ 3 基于TOS的主机重定向 ✓ 6 弃用 备用主机地址 7 未分配 保留 8 0 Echo请求 ✓ 9 0 路由通告 ✓ 10 0 路由器的发现/选择/请求 ✓ 11:超时 0 TTL超时 ✓ 1 分片重组超时 ✓ 12:参数问题-IP头部错误 0 IP报文首部参数错误 ✓ 1 丢失必要选项 ✓ 2 不支持的长度 13 0 时间戳请求 ✓ 14 0 时间戳应答 ✓ 15 0 信息请求 ✓ 16 0 信息应答 ✓ 17 0 地址掩码请求 ✓ 18 0 地址掩码应答 ✓ 19 保留 因安全原因保留 2029 保留 保留用于稳健性实验 3039 弃用 40 Photuris, Security failures ??? 41 用于实验性移动协议,如Seamoby[RFC4065] 42~255 保留 235 实验性 RFC3692 254 实验性 RFC3692 部分报文结构示例 3:目标不可达 目的地不可达由主机或其入站网关生成,以通知客户端由于某种原因目的地不可达。

图解密码技术 —— 第十章-证书

https://isshe.site/p/%E5%9B%BE%E8%A7%A3%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF-%E7%AC%AC%E5%8D%81%E7%AB%A0-%E8%AF%81%E4%B9%A6/

证书——为公钥加上数字签名 这章不是太理解。
什么是证书? 证书:记录个人信息及公钥,并由认证机构施加数字签名. 证书是公钥证书的简称。
证书的应用场景? 什么是公钥基础设施? 公钥基础设施(PKI, Public-key Infrastructure): 为了能更有效运用公钥而制定的一系列规范和规格的总称。
公钥基础设置(PKI)的组成要素是什么? 用户:使用PKI的人。 认证机构:颁发证书的人。 仓库:保存证书的数据库。 为什么需要证书?

设计模式 —— 装饰者模式

https://isshe.site/p/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E8%A3%85%E9%A5%B0%E8%80%85%E6%A8%A1%E5%BC%8F/

装饰者模式——不改变接口,但加入责任 1. 基础概念 定义:动态地给一个对象添加一些额外的职责。
注意是针对对象而不是类 类图: 类图
出场嘉宾:
[基础]组件(Conponent): 被装饰者,定义一个对象接口(Java:接口,C++:抽象类); 具体[基础]组件(Concrete Conponent): 定义一个具体的基础组件对象,可以给这个对象添加一些职责(装饰该对象)。 装饰者(Decorator): 维持一个指向组件对象的指针,并定义一个与组件接口一致的接口。(指针是为了知道所修饰的是什么) 具体装饰者(Concrete Decorator): 可以向具体组件添加职责(修饰)。 2. 解决什么问题?如何解决? 解决用继承给对象添加功能不够灵活的问题。 通常拓展一个类都是用继承的方法,这是静态拓展,随着拓展增多,子类会膨胀。 解决方法:具体组件和修饰者都继承自公共的类,使一个对象能装饰另一个对象。 3. 优缺点是什么? 3.1 优点 拓展功能时,提供比继承更有弹性的解决方案。(可增加、删除职责) 比静态继承更灵活。 可通过动态的方式在运行时选择不同的具体装饰类,实现不同的行为。 可以对一个对象进行多次修饰(甚至多次相同的修饰)。 符合开闭原则,具体组件和具体修饰者可以独立变化,用户根据需要添加组件或装饰者,原代码不需修改。 装饰者可以在所委托的装饰者行为之前或之后加上自己的行为,以达到特定的目的 3.2 缺点 可能有许多小对象,排错难度加大、代码阅读难度加大。 可能不同的东西,继承自一个公共类。(个人理解) 4. 使用场景是什么? 在不影响其他对象的情况下,已动态、透明的方式给单个对象添加职责。 处理那些可以撤销的职责。 怎么实现撤销??? 当不能使用子类/继承的方法进行扩充时。 情况一:类定义被隐藏,因此无法用于生成子类。 情况二:有大量独立的扩展,为支持每一种组合将产生大量子类。(使子类书目爆炸性增长) 5.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.