后台开发 -- 核心技术与应用实践

后台开发

核心技术与应用实践

  • 后台开发.

C++编程常用技术

  • 最好不要在头文件中使用命名空间,很容易造成命名冲突。
  • strlen与sizeof的区别:
    • strlen是函数,在运行时才能计算,传入参数是char*指针,返回字符串长度。
    • sizeof()是运算符,而不是一个函数,在编译时就计算好了,用于计算数据空间的字节数。
      • sizeof常用于返回类型和静态分配的对象、结构或数组所占用的空间,返回值跟内容无关。
  • 在C++中,临时对象都是const类型的。
  • 可以使用union(联合)判断系统是大端(big endian)还是little endian(小端)。
    • 几乎所有网络协议都是采用大端(big endian)的方式来传输数据的。
  • 只能把枚举赋值枚举变量,不能把元素的数值直接赋值枚举变量。
  • 共用体以最长的字节为准,考虑内存对齐。
  • 结构体以内置类型的最小公倍数对齐。

面向对象的C++

  • struct默认是public, class默认的是private的。
  • 当一个函数声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
  • 每个目标文件提供了三个表: 未解决符号表,导出符号表,地址重定向表。
    • 未解决符号表提供了多有在编译单元里引用但是定义并不是在本编译单元的符号以及其出现的地址。
    • 导出符号表提供了本编译单元具有定义,并且愿意提供给其它单元使用的符号及其地址。
    • 地址重定向表提供了本编译单元所有对自身地址的引用的记录。
    • 编译器将extern声明的变量置入未解决符号表,extern是外部链接。
    • 编译器将static声明的全局变量不置入未解决符号表,也不置入导出符号表,属于内部链接。
  • 编译阶段: g++会调用gcc, 通过G++来完成链接。
  • Makefile有3个内部变量:
    • $@ 扩展成当前规则的目标文件名。
    • $< 扩展成依靠列表中的第一个依靠文件。
    • $^ 扩展成整个依靠的列表(除了所有重复的文件名)。

调试

  • strace系统调用:
    • strace是通过跟踪系统调用来让开发者直到一个程序在后台所做事情的工具。
    • strace首先调用fork或clone函数新建一个子进程,然后在子进程中调用exec载入需要执行的程序。
  • gdb命令参数:
    gdb命令.
    • 内存访问越界的原因:
      • 搜索字符串时,没有正常的使用结束符。
      • 数组访问越界。
      • 字符串操作函数,读写越界。
    • 多线程使用了线程不安全的函数。
    • 多线程读写的数据未加锁保护。
    • 非法指针,包括使用空指针或随意使用指针转换。
    • 堆栈溢出。

TCP协议

  • ISO七层协议:
    七层模型.
    • 越到底层数据报越大。
  • TCP状态图:
    TCP状态图.
  • 当出现数据包中途丢失、ACK报文中途丢失、对端异常未响应ACK或被对段丢弃,TCP会超时重传。
    • telnet和tcpdump工具可以用来诊断。
  • TCP的滑动窗口主要有两个作用:
    • 一是提供TCP的可靠性。
    • 二是体从TCP的流量控制特性。
    • 滑动窗口机制还体现了TCP面向字节流的设计思路。
  • 任何时候在其发送缓存内的数据都可以分为4类:
    • 已经发送并得到对端ACK;
    • 已经发送但还未收到对端ACK;
    • 未发送但对端允许发送;
    • 未发送且对端不允许发送。
  • '已经发送但未收到对端ACK的'和'未发送但对端允许发送的'这两部分数据称之为发送窗口。
    滑动窗口
    • 滑动窗口实现面向流的可靠性来源于“确认重传”机制.
    • TCP的滑动窗口是动态的。
  • TCP拥塞控制:
    • 网络中的带宽,交换结点中的缓存和处理机等,都是网络的资源。
    • 拥塞控制是防止过多的数据注入网络中,可以使网络中的路由器或链路不过载。
    • 拥塞控制是一个全局性的过程,与流量控制不同,流量控制指点到点的控制。
    • 拥塞控制由4个核心算法组成:
      • 慢开始(slow start);
        • 慢开始的思路是一开始不要发送大量的数据,先探测一下网络的拥塞程度,由小到大逐渐增加拥塞窗口的大小。
      • 拥塞避免(Congession Voidance);
        • 拥塞避免是让拥塞窗口缓慢增长,即每经过一个往返时间RRT就把发送方的拥塞串口cwnd加1,而不是加倍。
      • 快速重传(Fast Restransmit);
        • 快速重传要求接收方在收到一个失序报文后就立即发出重复确认,而不要等到自己发送数据时捎带确认。
        • 发送方连续收到三个重传确认时,就执行乘法减小算法,把ssthresh门限减半(但是不会执行慢开始)。
      • 快速恢复(Fast Recovery).
        • 不执行慢开始,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。
    • 拥塞窗口的大小取决于网络的拥塞成都,并且动态地变化。
    • 发送方让自己的发送窗口等于拥塞窗口,考虑接收方的接收能力,发送串口可能小于拥塞窗口。
  • TCP中的Nagle算法默认是启用的,但它并不适合任何情况。
  • TCP是个流协议,就是没有界限的一串数据(没有分界线)。
  • 连续调用send分别发送两段数据data1和data2:
    • 先接收到data1, 然后接收到data2; --- 正常
    • 先接收到data1的部分数据,然后接收到data1余下的部分以及data2的全部。 --- 粘包
      • 接收端接收不及时造成的接收段粘包。
    • 先接收到data1的全部数据和data2的部分数据, 然后接收到data2的余下数据。 --- 粘包
      • nagle算法等待导致。
      • 两个send之间调用sleep来休眠一段时间。
    • 一次性接收到了data1和data2的全部数据。 --- 粘包
      • 封包是给数据加上包头。--- 包头给定一个数据包的长度。
      • nagle算法等待导致。
      • 循环不停地接收报头给出的数据,直到收够为止。
      • 在发送内容前,加上发送内容的长度,接收方会先接收4字节,解析要接受的长度再进行收包。
  • 一般来说,一个端口释放后要等待两分钟左右后才能再被使用,而SO_REUSEADDR则可以让端口释放后立即就可以再被使用。
  • TCP_DEFER_ACCEPT可以用来预防空连接攻击(只是建立连接,但是不发送任何数据).
  • SO_LINGER, linger是延迟的意思。
  • SO_RCVBUF和SO——SNDBUF这两个接口选项可以改变默认换从去大小。

网络I/O模型

  • 当网络I/O发生时,会设计两个系统对象,一个是调用这个IO的进程,另一个是系统内核。
    • 当一个read操作发生时,会经历两个阶段:
      • 等待数据准备;
      • 将数据从内核拷贝到进程中。
  • 4种网络IO模型:
    • 阻塞IO模型;
      • 阻塞是指IO操作需要彻底完成后才返回到用户空间;
        阻塞IO模型.
    • 非阻塞IO模型;
      • 非阻塞是指IO操作被调用后立即返回给用户一个状态值,不需要等到IO操作彻底完成.
      • 非阻塞IO模型.
    • 多路IO复用模型;
      • 事件驱动IO,有个函数(select,poll,epoll)不断轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
      • 多路IO复用模型.
    • 异步IO模型。
      • 异步IO,当进程发起IO操作之后,就直接返回,直到内核发送一个信号,告诉进程IO已完成,则在这个过程中,进程完全没有被阻塞。
      • 异步IO模型.

网络分析工具

  • ping命令可以检查网络是否连通,帮助分析和判定网络故障。
    • ping发送一个ICMP(Internet Control Messages Protocol, 因特网信报控制协议), 检查网络是否畅通或者网络连接速度的命令。
  • tcpdump根据使用者的定义对网络上的数据包进行截取和分析。
    • -i,指定tcpdump监听的网络界面。
    • -c, 指定要监听的数据包数量。
    • -w, 指定将监听的数据包写入文件保存。
  • netstat命令用于显示与IP, TCP, UDP, IMCP相关的统计数据,一般用于检验本机各端口的网络连接情况。
  • lsof(list open file)是一个列出当前系统打开文件的工具。
    • linux中,通过文件不仅可以访问数据,还可以范文网络连接和硬件。
    • 文件描述符为应用程序与基础操作系统之间的交互提供了通用的接口。
    • lsof | more --- 是一部分一部分地显示。

多线程

  • 多线程就是允许一个进程内存拥有多个控制权,以便让多个函数同时处于激活(active)状态, 从而让多个函数的操作同时运行。
  • 对于多线程来说,由于同一个进程空间中存在多个栈,任何一个空白区域被填满都会导致栈溢出。

进程

  • 一般程序转换为进程需要几个步骤:
    • 内核将程序读入内存,为程序分配内存空间。
    • 内核为该进程分配进程分配标识符(PID)和其他所需资源。
    • 内核为进程保存PID及相应的状态信息,把进程放到运行队列中等待执行,程序转换为进程后就可以被操作系统的调度程序调度执行。
  • 所谓程序就是可运行的二进制文件,把这种文件加载到内存中运行就二道了一个进程。
    • 同一个程序文件可以被加载多次成为不同的进程。
  • 守护进程:
    • 在Linux或者Unix操作系统中在系统的引导的时候会开启很多服务,这些服务叫做守护进程。
    • 守护进程是脱离于终端并且在后台运行的进程。
    • 守护进程是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
    • 守护进程通常在系统引导装入的时候启动,系统关闭时终止。
    • 作业规划进程crond,打印进程lqd(后缀d表示Daemon的意思)。
  • 创建一个守护进程的简单步骤:
    • 创建子进程,父进程退出。
    • 在子进程中创建新会话(setsid系统调用,最重要的一步)。
    • 改变当前目录为根目录。
    • 重设置文件权限。
    • 重设文件权限掩码。
    • 关闭文件描述符。
  • ipcs命令:
    • ipcs命令用于报告系统的消息队列、信号量、共享内存等。

HTTP协议

  • HTTP(Hypertext Transfer Protocol, 超文本传输协议)是一种详细规定了浏览器和万维网(world wide web,WWW)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
  • HTTP实在应用层,基于TCP协议,而HTTPS协议,也是处于应用层,但是是基于TLS,SSL协议层之上的协议。
    HTTP协议与HTTPS协议的对比.
    • HTTP默认端口号是80,HTTPS默认端口好为443。
  • 一次HTTP操作称为一个事务,其工作可分为4步:
    • 客户机与服务器需要建立连接。
    • 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:
      • 统一资源标识符(URL);
      • 协议版本号;
      • MIME信息(包括服务器信息,实体信息和可能的内容)。
    • 服务器接到请求后,给予相应的响应信息,其格式为一个状态行:
      • 信息的版本协议号;
      • 一个成功或者错误的代码号;
      • MIME信息(包括服务器信息,实体信息和可能的内容)。
    • 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
  • HTTP永远是客户机发起请求,服务器惠东响应,服务器无法将消息推送给客户端。
  • HTTP协议结构,无论是请求报文还是回应报文,都分为四个部分:
    • 报文头(initial line);
    • 0个或多个请求头(header line);
    • 空行(作为header lines的结束)。
  • HTTP是基于行的协议,每一行以\r\n作为分隔符。
  • wireshark是一个抓包的好工具,它能够记录计算机和互联网之间的通信内容。
  • HTTP请求方法:
    • OPTONS:返回服务器针对特定资源所支持的HTTP请求方法;也可以利用想Web服务器发送"*"的请求来测试服务器的功能性。
    • HEAD: 向服务器索要与GET请求相一致的响应,只不过响应体不会被返回。
      • 测试超链接的有效性,是否可以访问,以及最近是否更新等信息。
    • GET: 向特定的资源发出请求,GET可能会被网络爬虫随意访问。
    • POST: 向指定资源提交数据进行处理请求(提交表单或者上传文件)。
      • POST请求可能会导致新的资源的建立或对已有资源的修改。
    • PUT: 向指定资源位置上传其最新的内容。
    • DELETE: 请求服务器删除Request-URI所标识的资源。
    • TRACE: 回显服务器收到的请求,主要用于测试或诊断。
    • CONNECT: 协议中预留给能够将连接更改为管道方式的代理服务器。
    • PATCH: 用来将局部修改应用与某以资源。
  • 当某个请求所针对的资源不支持对应的请求方法时,服务器应当返回状态码405(Method Not Allowed).
  • 当服务器不认识或者不支持对应的请求方法时,应当返回状态码501(Not Implemented).
  • HTTP服务器至少要实现GET和HEAD方法。

HTTPS协议

  • 公开代码、算法、协议,通过密钥的私密性来保护数据传输的安全性。
    • 对称加密: 加密的密钥和解密的密钥是一样的,通常使用AES和TEA算法。
      • 计算量小,又有一定的破解门槛。
    • 非对称加密: 加密的密钥和解密的密钥是不一样的,密钥成对出现(公钥加密需要私钥解密,私钥加密需要公钥解密)。
      • 计算量大,常用RSA和ECC算法。
      • 一般使用非对称加密算法得出密钥,再用对称加密算法对消息内容进行加密,然后进行传输。
  • HTTP协议可以轻松抓包并获得其中的内容,是一个不安全的协议,而HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)则是以安全为目标的HTTP通道,可以简单的理解为HTTP的安全版。
  • HTTPS是一个URI scheme(抽象标识符体系),句法类同HTTP体系,用于安全的HTTP数据传输。
  • 但HTTPS的存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。
  • 高层的应用协议能透明地建立于TLS协议之上。
    • TLS协议在应用层之前就已经完成了加密算法,通信密钥的协商以及服务器的认证工作。
    • TLS协议使用通信双方的客户证书以及CA根证书,允许客户端、服务器端以一种不能被偷听的方式通信,在通信双方建立起一条安全的、可信任的通信通道。
  • HTTP和HTTPS的区别:
    • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
    • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的ssl加密传输协议。
    • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,HTTP使用的是80端口号,HTTPS使用的端口号是443.
    • HTTPS的应用比HTTP要少,因为HTTPS比较耗性能,对于安全性没有那么高要求的应用来说,用HTTP就已经足够了。

CGI

  • CGI(Common Gateway Interface, 通用网关接口)是HTTP协议中最重要的技术之一,有着不可替代的重要地位。
  • CGI是一个Web服务器提供信息服务的标准接口。
    • 通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器段的CGI程序进行处理,最后返回结果给客户端。
    • CGI通信系统由两个部分组成:
      • 一部分是HTML页面;
      • 运行在服务器上的CGI程序。
      • CGI.

常用类库

  • JSON(JavaScript Object Notation, JavaScript对象表示法)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。
    • key-value对的集合。
    • 值的有序列表。
  • Protobuf:
    • Protobuf的序列化和反序列化的速度更快,而且传输的数据会先压缩,使得传输的效率更改些。
    • Ptotobuf, 全称Protobuf Buffer,是Google公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化(序列化)。
    • 适合做数据存储或RPC数据交换格式。

猜你喜欢

转载自www.cnblogs.com/longjiang-uestc/p/10869613.html