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

后台开发

核心技术与应用实践

  • .

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个内部变量:
    • [email protected] 扩展成当前规则的目标文件名。
    • $< 扩展成依靠列表中的第一个依靠文件。
    • $^ 扩展成整个依靠的列表(除了所有重复的文件名)。

调试

  • strace系统调用:

    • strace是通过跟踪系统调用来让开发者直到一个程序在后台所做事情的工具。
    • strace首先调用fork或clone函数新建一个子进程,然后在子进程中调用exec载入需要执行的程序。
  • gdb命令参数:
    .

    • 内存访问越界的原因:

      • 搜索字符串时,没有正常的使用结束符。
      • 数组访问越界。
      • 字符串操作函数,读写越界。
    • 多线程使用了线程不安全的函数。
    • 多线程读写的数据未加锁保护。
    • 非法指针,包括使用空指针或随意使用指针转换。
    • 堆栈溢出。

TCP协议

  • ISO七层协议:
    .

    • 越到底层数据报越大。
  • 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,有个函数(select,poll,epoll)不断轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
      • .
    • 异步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默认端口号是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数据交换格式。

原文地址:https://www.cnblogs.com/longjiang-uestc/p/10869613.html

时间: 2024-10-03 08:57:24

后台开发 -- 核心技术与应用实践的相关文章

强烈推荐一本今年八月份的新书《后台开发:核心技术与应用实践》,作者腾讯资深后台开发工程师徐晓鑫

   昨天被华章安利了一本今年8月份的新书<后台开发:核心技术与应用实践>,极好的书,评价和口碑超高.   这本书腾讯公司资深研发工程师多年后台开发经验总结,获腾讯.Facebook.微软.阿里.百度多位资深技术专家高度认可. 完整勾勒后台开发技术能力体系,多维度讲解了成为一名后台开发工程师所需掌握的核心技术.开发工具和实践方法,后台工程师修炼必读.作者sharexu是位值得推崇的女性开发者.   后台开发是一个“历史悠久”的领域,同是也是一个沉淀深厚,高技术价值的领域.本书清晰.严谨.务实的

做后台开发用到的技能都在这儿——《后台开发:核心技术与应用实践》

大多数面向对象语言没有指针的概念,C语言也没有对象的概念,同时具有指针和对象的C++语言在学习时有高昂的门槛,同时在服务端后台开发.处理多并发的海量网络请求等方面有天然的优势.就像Android开发对性能要求比较高的地图.视频.即时通讯由NDK开发一样,当网络应用的用户量. 并发量迅速增长,达到一定量级之后,后端服务的技术架构都会适用于自己玩玩的JavaScript(Bmob云端代码).适用于小规模网站的PHP和适用于中等规模网站的Java转变为Linux C++. 徐老师的<后台开发:核心技术

后台开发:核心技术与应用实践(边写代码边读书才是最好的学习方式)

写下这些文字的时候是我在腾讯工作的第五个年头,这五年让我对效率有了更深刻的认识.还是一个学生的时候,和大家一样,我也曾一字不落地读过<UNIX环境高级编程>,<UNIX环境网络编程>一二三卷,<TCP/IP详解>一二三卷,<C++ Primer>等书籍,这些都是非常经典的开发书籍.它们的共同特点是大而全,不漏掉任何一个知识点,并且每个知识点都讲得非常详细.但在实际的开发工作中,可能用到的知识点只有20%,其他的80%则很少用到.这也是我写这本书的初衷:用最短

现货!《PHP7实践指南:o2o网站与App后台开发》京东天猫有售

终于发售了,啥也不想说了,喜欢的或需要的就点击 链接 进去购买吧. 另外此书将作为 2017 PHP全球开发者大会 现场活动用书 天猫购书包邮 PHP7实践指南:O2O网站与App后台开发 数据库设计 PHP开发工程 适合作为企业内部培训.培训机构和大专院校的教学参考书 京东购书PHP7实践指南:O2O网站与App后台开发 陈小龙 PHP7语言编程教程书籍 php7 PHP全球开发者大会 2017 PHP 全球开发者大会 -百格活动 作者简介陈小龙,奇虎360软件工程师,是国内较早研究微信开发和

PHP核心技术与最佳实践

<PHP核心技术与最佳实践>是一本致力于为希望成为中高级PHP程序员的读者提供高效而有针对性指导的经典著作.系统归纳和深刻解读了PHP开发中的编程思想.底层原理.核心技术.开发技巧.编码规范和最佳实践.全书分为5个部分:第一部分(1-2章)从不同的角度阐述了面向对象软件设计思想的核心概念.技术和原则,分析了面向对象的特性.设计模式的理念,指出了如何设计低耦合.高可扩展性的软件,等等:第二部分(3-6章)详细讲解了PHP中正则表达式的规范和使用技巧,PHP网络编程的原理.方法.技巧和一些重要的操

《App后台开发运维和架构实践》推荐序

软件开发工具的成长速度远远超过开发人员的成长速度,这是现实. 每个月,甚至每天,我们都可以见到新的类库.框架.工具.语言.它们或者极大地降低了开发的成本,或者极大地提升了开发的效率. 随之而来的问题就是,如何让开发人员妥善地运用好这些工具? 曾经有好几个做开发的同事跟我说:"写软件谁不会?从网上找些开源的类和项目来改改就是了".目前也确实充斥着这种"改改就是"的工作思维.介绍某个类库和项目如何安装和调用的文章俯拾皆是. 但是每种工具究竟有什么优缺点?适合用来解决什么

PHP核心技术与最佳实践——全局浏览

难得买到并喜欢一本好书,‘PHP核心技术与最佳实践’. 几天时间,先看了个大概,总结一下整体是什么样子的,怎么看怎么学. 1.总共14章: 2.第1.2章讲PHP的OOP: 其中第一章侧重于PHP的OOP与Java等的对比,面对对象开发的概念性问题,PHP的OOP的特殊之处,并对此给出代码例子: 3.第3.4.5章对某一个基础技术应用进行详解: 第3章讲正则表达式(md,为啥我总是看了就忘,这个东西...): 第4章讲网络技术,包括HTTP协议,socket,抓包,cURL,SMTP等应用层应用

温习《PHP 核心技术与最佳实践》这本书

再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2.1 __set和 __get 方法 PHP 的重载和Java 等语言的重载不同. Java 里,重载指一个类中可以定义参数列表不同但名字相同的多个方法.比如,Java 也有构造 函数,只要保证方法签名不一样就行:而 PHP 则在一个类中只允许有一个构造函数. PHP 提供的『重载』指动态的『创建』

收藏很久的后台开发资源分享给你!

2020的开头真是遇到了太多太多的事儿,大部分的事儿都需要推迟了. 不管是准备春招还是已经工作了,希望这份资料可以帮你在这期间充实自己. 从去年来开始通过平台来学习,好不好大家可以看看哈. 在这里推荐如下资料.注意:所有资料将在文末免费分享给大家 资料 王争< 数据结构与算法之美> 算法面试通关40讲 趣谈网络协议 从零开始学架构 深入拆解 Java 虚拟机 机器学习40讲 Netty源码剖析与实战 玩转Git三剑客 java核心技术36讲 从0开始学微服务 Linux性能优化实战 领取方式: