自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (1)
  • 收藏
  • 关注

原创 《深入浅出密码技术之2历史上的密码》

2 History of cryptography2.1 凯撒密码(Caesar cipher)凯撒密码的加密:通过将明文中所使用的字母表按照一定的字数“平移”来进行加密。用凯撒密码进行加密,密钥为3凯撒密码可以用暴力破解(brute-force attack)来破译密码,即把密钥为0到密钥为25的26种情况都尝试一遍。2.2 简单替换密码简单替换密码(simple substitution cipher):将明文中所使用的字母替换为另一套字母表的密码。凯撒密码也可以说是简单替换密码的

2020-08-06 10:09:32 204

原创 《深入浅出密码技术之1环游密码世界》

1 环游密码世界1.1 术语加密 encrypt解密 decrypt明文 plaintext密文 ciphertext算法 algorithm密钥 key对称密码 symmetric cryptography公钥密码 public-key cryptography/非对称密码 asymmetric cryptography混合密码系统 hybrid cryptosystem单向散列函数(one-way hash function):可以检测出数据是否被篡改过,即保证数据完整性(int

2020-07-13 17:40:41 148 1

原创 《深入理解TCP之15不要忘记字节的性别》

15 不要忘记字节的性别15.1 大端模式是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;15.2 小端模式是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。总结小端模式:低地址存放数据的低字节大端模式:低地址存放数据的高字节uint32 x =

2020-06-22 20:53:10 201

原创 《深入理解TCP之14理解如何使connect调用超时》

14 理解如何使connect调用超时14.1 connect的调用过程就是三次握手得过程首先将标志位设为Non-blocking模式,准备在非阻塞模式下调用connect函数调用connect,正常情况下,因为TCP三次握手需要一些时间;而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回EINPROGRESS,表示在建立连接但还没有完成。在读套接口描述符集(fd_set rset)和写套接口描述符集(fd_setwset)中将当前套接口置位(用FD_ZERO()、FD_SET()宏),并

2020-06-17 10:24:47 194

原创 《深入理解TCP之13服务器应该设置SO_REUSERADDR》

13 服务器应该设置SO_REUSERADDR问题:对服务器重启时,会得到“Address already in use”的原因:前一个连接仍然处于TIME-WAIT状态解决方法:设置套接字选项SO_REUSEADDR(在bind之前调用setsocketopt)首先声明一个问题:当两个socket的address和port相冲突,而你又想重用地址和端口,则旧的socket和新的socket都要已经被设置了SO_REUSEADDR特性,只有两者之一有这个特性还是有问题的。SO_REUSEADDR

2020-06-11 14:21:19 422

原创 《深入理解TCP之12不要用TIME-WAIT暗杀来关闭一条连接》

12 不要用TIME-WAIT暗杀来关闭一条连接12.1 连接拆除主机1的应用程序关闭自己这端的连接,使得tcp向主机2发送了一个FIN主机2对这个FIN进行ACK,并将这个FIN作为一个EOF传给应用程序一段时间后,主机2上的应用程序关闭了它那端的连接,这样就会向主机1发送1个FIN主机1会以ack应答此时,主机2关闭连接并释放资源。但是主机1还没有关闭连接,而是会进入TIME-WAIT状态,并将这个时间停留在2MSL(2个最大分段寿命的时间,TTL,MSL被RFC 793定义为2分钟,BS

2020-06-09 19:54:17 159

原创 《深入浅出TCP之11理解tcp的有序释放操作》

11 理解tcp的有序释放操作tcp连接的三个阶段:连接建立阶段数据传输阶段连接拆除阶段服务器和客户端可以通过关闭各自半边分连接来通知对方,它已完成应答了.效果上看,它们发送的就是一条EOF.shutdown调用int shutdown( int s, int how );how = 0 : 关闭连接的接收端(也适用于UDP)how = 1 : 关闭连接的发送端(后继所有试图对套接字进行写操作都会除错.将发送缓冲区中所有的数据都发送出去之后,tcp会向其对等实体发送一个FIN,通知

2020-06-08 19:07:29 234

原创 《深入浅出TCP之10理解tcp的写操作》

10 理解tcp的写操作10.1 从用户层看写操作用户程序对一条tcp连接进行写调用时,首先会将数据从用户缓冲区赋值到内核中去,当send返回时(除非tcp发送缓冲区满了,否则写操作是不会被阻塞的),具体发送了多少数据依赖于连接状态.写操作很少向tcp返回错误.因此,常见错误通常由读操作返回,写操作只返回写调用时发生的明显错误,如下:套接字描述付无效文件描述符指向的不是套接字调用中指定的套接字不存在或未连接缓冲区地址参数指向无效地址EPIPE或SIGPIPE是个例外,连接被对等实体重置

2020-06-05 10:18:45 136

原创 《深入浅出TCP之9成功的LAN策略不一定能推广到WAN中去》

9 成功的LAN策略不一定能推广到WAN中去可能出现的问题有两类:由于WAN引入了额外的时延,在WAN上可能会出现问题在LAN上可以工作的不正确代码,在WAN上可能会出现问题出现1中的问题通常意味着要考虑重新设计应用程序了....

2020-06-05 10:13:43 99

原创 《深入浅出TCP之8提防对等实体的不友好动作》

8 提防对等实体的不友好动作编写网络程序,需要进行防御性编程,最终要的原则是:即使两端的协议都是我们自己实现的,也不能认为对等实体会遵循应用协议.检测客户端的终止如果客户端在发送quit命令之前就崩溃或终止了,此时,客户端的tcp会向对等实体tcp发送一个FIN,服务器的读操作会返回一个EOF,服务端需要显示检测EOF(0 == recv).没必要通过心跳信号来检测客户端的丢失,只要在读操作上设置一个定时器,客户端在某段时间区间内没有发出请求,服务器就认为客户端已经丢失.FTP服务器就是这么做的.

2020-06-04 15:06:42 147

原创 《深入浅出TCP之7TCP/IP不是轮询的》

7 TCP/IP不是轮询的7.1 tcp无法将连接的丢失立即通知应用程序的原因如果实现立即通知连接丢失的功能,可能使用某种轮询的协议不停地测试对等实体是否存在.在任何情况下,实现这种功能都是要付出代价的,需要消耗一定的网络带宽.设计tcp/ip的基本原则之一就是端到端原则,将其应用与网络时,基本上就是指多有智能都要尽可能地靠近连接的端点,网络自身应该是相对"亚的".比如,tcp自己处理错误控制,而不依赖网络提供.在监视对等应用程序间的连接,就意味着,需要应用程序来提供这项功能.tcp/i

2020-06-03 18:34:08 586

原创 《深入浅出TCP之6要认识到TCP是一个可靠的,但并不绝对可靠的协议》

6 要认识到TCP是一个可靠的,但并不绝对可靠的协议6.1 可靠性是啥第一个可以讨论确保可靠传输问题的地方就是应用程序B所在主机的tcp层。当一个段抵达应用程序B所在主机的tcp层时,唯一可以确认的就是这个段已经到达了,但它可能损坏了,可能是重复的数据,可能是错序的,或者是由于其他一些原因无法接受的。注意,发送端tcp无法对这些抵达接收端tcp的段作出任何保证。但接收端tcp要像发送端tcp确认,也就是说它ACK的数据以及在此数据之前到达的所有数据在tcp层都已经正确接收了,发送端tcp可以安全的

2020-06-01 15:57:37 506

原创 《深入浅出TCP之5不要低估TCP的性能》

5 不要低估TCP的性能任何协议的性能都与网络、应用程序、负载和包括实现质量在内的其他一些因素有关。5.1 TCP性能TCP在基本的IP数据报服务的基础上增加了可靠性和流量控制功能,而UDP只添加了一个检验和,但是这并不表示UDP的性能比TCP好。TCP为了提供可靠性,接收端TCP必须向发送端TCP发送ACK,但是这个工作量没有想象的那么多。首先,接收端可以通过它要发回给对等实体的数据来捎带ACK,实际上,很多TCP实现都会将ACK延迟几个毫秒发送,以防止本端应用程序有对输入分段的应答发送。

2020-05-28 14:04:58 239

原创 《深入浅出TCP之0客户端-服务器结构》

0 客户端-服务器结构0.1 客户端和服务端位于同一台主机上由于没有网络延迟,更容易判断客户端和服务器应用程序的原始性能提供了理想的实验环境,分组不会被丢弃、延迟、传输时也不会失序注意:如果施加足够的压力也会造成UDP报文丢失。0.2 客户端和服务端位于同一局域网内的不同机器上这种情况还是近乎理想,分组很少丢失,并且实际上不会出现错序的情况。0.3 客户端和服务端被广域网隔开两个应用程序不在同一个局域网中,从一个应用程序传向另一个应用程序的IP数据报必须经过一台或多台路由器。随着流量的

2020-05-27 10:29:31 197

原创 《深入浅出TCP之4TCP是一种流协议》

4 TCP是一种流协议数据是以字节流的形式传递给接收者,没有固有的报文或报文边界分概念。send通常只是将数据复制到主机的tcp/ip栈中,就返回了,由tcp来决定需要立即发送多少数据(取决于,发送窗口,拥塞窗口,MSS等)tcp会记录它发送了多少字节,以及确认的字节,但它不会记录这些字节是如何分组的变长报文,一般在每条报文前面加上一个首部,这个首部至少包含报文的长度,首先读取定长的报文头部,从首部解析出可变部分的长度,然后读取可变长部分...

2020-05-27 10:23:28 185

原创 《深入浅出TCP之3理解私有地址和NAT》

3 理解私有地址和NAT3.1 私有地址10.0.0.0 ~ 10.255.255.255 (10/8 前缀)172.16.0.0 ~ 172.31.255.255 (172.16/12 前缀)192.168.0.0 ~ 192.168.255.255 (192.168/16 前缀)3.2 NAT(网络地址翻译)转换机制静态模式 一一映射将私有网络上的部分或所有主机的私有IP地址都映射为一个固定的、全局分配的地址。缓冲池模式-多对多映射NAT设备有一组全局分配的IP地址可用,它会将其

2020-05-26 10:33:08 230

原创 《深入浅出TCP之2理解子网和CIDR的概念》

2 理解子网和CIDR的概念2.1 分类编址地址被分为两部分,第一部分是网络ID,用来标识地址所指的特定网络,之后是主机地址,标识那个网络中一台特定的主机。A类网络: 0.0.0.0 ~ 127.255.255.255 网络位8位,前导:0B类网络: 128.0.0.0 ~ 191.255.255.255 网络位16位 前导:10C类网络: 192.0.0.0 ~ 223.255.255.255 网络位24位 前导:110还有D类网络主要是用于多点广播地址,前导:1110E类网络是保留的,前

2020-05-25 13:17:25 218

原创 《深入浅出TCP之1理解面向连接和无连接协议之间的区别》

1 理解面向连接和无连接协议之间的区别1.1 区别区别:对无连接协议来说,每个分组的处理都独立于所有其他分组,都是独立寻址,而面向连接的协议来说,协议面向连接的协议来说,协议实现规则维护了与后继分组有关的状态信息。注意:对于无连接,如果应用程序实现的功能较为复杂,就可能需要维护数据报之间的状态,但重点是状态由应用程序维护,而不是协议维护。1.2 TCP/IP协议栈TCP/IP分为四层,分别是接口层/物理层/链路层–>网络层–>传输层–>应用层。网络层主要就是IP层,该层提供了一

2020-05-24 17:19:46 682

原创 《深入浅出c++11之7融入实际应用》

7 融入实际应用7.1 对齐支持C++ 98中gcc使用如下对齐描述:__attribute__ ((__aligned__(8)))C++11中新增了2个关键字:操作符alignof,对齐描述符alignasint a;long long b;auto &c = b;char d[1024];cout << alignof(int) << endl; //4cout << alignof(a) << endl //4 &lt

2020-05-24 13:03:17 332

原创 《深入浅出c++11之6为改变思考方式而改变》

6 为改变思考方式而改变6.1 指针空值–nullptrC++ 98中,字面常量0的类型既可以是一个整型,也可以是一个无类型指针(void *)C++ 11中,nullptr是一个所谓“指针空值类型”的常量。nullptr的类型是nullptr_tnullptr类型数据所占用的内存空间大小跟void*相同,即sizeof(nullptr_t) == sizeof(void*)nullptr到任何指针转换是隐式的int *py = nullptr;6.2 =default 与 =delet

2020-05-24 13:01:29 133

原创 《深入浅出c++11之5提高性能及操作硬件的能力》

5 提高性能及操作硬件的能力5.1 常量表达式5.1.1 运行时常量性与编译时常量性const int i = 3; //运行时常量constexpr int GetConst() {return 1;}; //编译时常量5.1.2 常量表达式函数常量表达式函数的要求:函数体只有单一的return返回语句。(如果有static_assert, using和typedef指令通常也是可以的)函数必须返回值(不能是void函数)在使用前必须已有定义return返回语句表达式中不能使用非常

2020-05-24 12:59:26 279

原创 《深入浅出c++之4提高类型安全》

4 提高类型安全4.1 强类型枚举C++ 98中的非强类型作用域,允许隐式转换为整型,占用存储空间及符号性不确定,都是枚举类的缺点。C++11引入枚举类,即强类型枚举。强类型枚举优势:强作用域,强类型枚举成员的名称不会被输出到其父作用域空间转换限制,强类型枚举成员的值不可以与整形隐式地相互转换可以指定底层类型。强类型枚举默认的底层类型为int,但也可以显示地指定底层类型,具体方法在枚举名称后面加上":type",type是除了wchar_t以外的任何整型,如:enum class Weig

2020-05-24 12:56:29 127

原创 《深入浅出c++11之3新手易学,老兵易用》

3 新手易学,老兵易用3.1 右尖括号 > 的改进在C++ 98中,如果实例化模版的时候出现了连续的两个右尖括号>,需要一个空格来进行分隔,否则被解析为右移。C++ 11中取消了这种限制。3.2 auto类型推导auto声明的变量必须被初始化,以使编译器能够从其初始化表达式中推导其类型。auto使用细则:int x;int * y = &x;double foo();int &bar();auto *a = &x; //int*auto &

2020-05-23 17:13:42 204

原创 《深入浅出C++11之2通用为本,专用为末》

2 通用为本,专用为末2.1 继承构造函数C++11中子类可以通过using声明来声明继承基类的构造函数。struct A { A(int i) {} A(double d, int i) {} A(float f, int i, const char* c) {}};struct B: A { using A::A; //继承构造函数 //等价于 //B(int i): A(i) {} //B(double d, int i): A(d, i) {} //B(float f,

2020-05-23 17:10:40 401

原创 《深入浅出C++11之1保证稳定性和兼容性》

1 保证稳定性和兼容性1.1 保持与C99兼容C++11将对一下C99特性的支持纳入新标准:C99中的预定义宏__func__预定义标识符_Pragma操作符不定参数宏定义以及__VA_ARGS__宽窄字符串连接1.1.1 预定义宏宏名称功能描述__STDC_HOSTED__如果编译器的目标系统环境中包含完整的标准C库,那么这个宏定义为1,否则宏的值为0__STDC__C编译器通常用这个宏的值来表示编译器的实现是否和C标准一致。C++11标准中这个宏是否定

2020-05-23 17:06:18 343

原创 《深入浅出redis》

1 数据结构与对象1.1 SDS(simple dynamic string)定义 /* * 保存字符串对象的结构 */ struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[]; };free属性的值为0,表示这个SDS没有分配任何未使用空间len属性的值为5,表示这个SDS保

2020-05-22 21:45:17 579

常见设计模式的解析和实现.pdf

常见的 20 个设计模式好好复习并且逐个用 C++实现了一 遍, 适合广大开发者学习使用,看不懂 UML 结构图和时序图,UML 图解释的类与类之间的关系,时序图 解释的是各个对象的实现方式,两者结合在一起看才能加深对设计模式的理解

2020-05-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除