linux高性能服务器编程书本总结
目录
第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型
8-9 服务器的架构模式 --也是本书最重要的章节 8是内核
第三篇 高性能服务器优化监控 介绍了一个linux 下的工具和小技巧
这本书是我在上周面试 2月25号-28号之间看的,早上面试下午看书,从书本中学到的东西马上就在面试官面前卖弄,输入输出,让我感觉自己的收获还是挺大的。
看书小技巧:首先拿到一本书,看出版社看序言-一般作者或出版社会大概介绍本书,让后是书本目录,花个几分钟全书浏览一般,目的是为大致再了解一下本书,是否你有兴趣读,是否可以阅读有意义?让后再花一天时间将本书从头阅读一遍,遇到重点章节记录一下,难以理解的记住某一个章节,让后继续把这本书看完,到时候拿出具体都重点章节和难点章节啃掉。
---读书的方法可以看《如何阅读一本书》
目录分析
第一篇从 1-4章节主要是介绍 计算机网络基础知识和 TCP/IP模型
- ARP 原理 DNS 原理
- IP协议 特点:动力层,为上层提供无状态,无连接,不可靠服务。
- IP 头 --通常20字节
- 介绍 IP 数据报路由与转发
- IP路由 是为了找到目标机器的路径 --了解这个前提要了解IP模块工作流程
- 传输层 tcp
- tcp头部 --40个固定字节,用来连接和控制
- 三次握手四次挥手
- 半关闭状态 某一方不再发送,但是允许继续接受对方数据.
- 状态转移过程 -- 两段状态变化的过程。
-
- 复位报文手段 作用也就是通知对方关闭连接或者重新连接
- 访问不存在的端口 --什么情况下都可以收到复位报文段
-
异常终止连接
- 一旦tcp发送了复位报文,发送端所等待的排队数据都被丢弃,可以使用 SO_LINGER来发送复位报文段,终止一个连接。
- 处理半打开连接 就是对方网络故障没有收到结束报文 网络故障等一些原因,但是服务器以为对方关闭成为半打开,可以写数据时发一个复位报文,就可以被关闭了
- 复位报文手段 作用也就是通知对方关闭连接或者重新连接
- 数据流 就是tcp与应用程序之间的数据通讯分析
- 交互数据 字节少,实时性高。
- nagle算法优化 将多个小的数据报文一起发了,减少小数据报文
- 成块数据 例如ftp
-
外带数据 用于迅速告诉对方本端发生的重要事件。
- 所以外带数据的优先级最高,无需排队,udp 没有该数据,tcp 也不是真正意义上的,只是利用紧急指针的两个字段,该缓存1字节,上层如何没有及时拿出下次就覆盖了。
- 交互数据 字节少,实时性高。
-
数据流控制 超时重传和拥塞控制
-
tcp 超时重传 也就是发生异常网络情况下
- tcp 模块维护的 重传定会器--如果对方没有应答那么就启动,传多少次? 经过分析 重传五次 0.2s 0.4 0.8 1.6 3.2s每次重传加倍,五次后由IP和ARP接管。
- 拥塞控制
- tcp 重要任务 提高网络利用率降低丢包,保证网络资源对数据流的公平性,这就是拥塞控制。
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
- tcp 重要任务 提高网络利用率降低丢包,保证网络资源对数据流的公平性,这就是拥塞控制。
-
tcp 超时重传 也就是发生异常网络情况下
-- 这里呢 也只是简单的介绍一下书,要看具体详情 网络这一块 可以看tcp/ip核心3卷
第二篇 核心篇 5 章到 15 章节
5-6章节 主要介绍 套接字编程API的使用和介绍
-
socket地址API
- 主机字节序和网络字节序(大端:高位字节存储低位,低位字节存储高位,主机字节序反之)
char union_bytes[sizeof(short)]; if (sizeof(short) == 2) { if (test.union_bytes[0] == 1 && test.union_bytes[1] == 2) cout << "big endian" << endl; else if (test.union_bytes[0] == 2 && test.union_bytes[1] == 1) cout << "little endian" << endl; } ---代码段
- 套接字地址族 含 地址族(IPV4,6) 端口号(网络字节序) IPV4地址结构体
- 创建socket socket 它是一个可读可写可控制,可开关的文件描述符。
- 命名socket bind 函数来做一个地址族绑定具体某一个socket
- 监听socket listen函数 创建一个监听队列来存放待处理的客户连接。
- 接受连接 accept
- 测试 :如果在accept 接受过程中客户端断开了,会不会影响到该函数的调用呢? 经过测试答案是不会的,它只是从队列中取出来数据而已。
- 发送请求 connect 客户端与服务器主动发出连接
- 关闭连接 close
- 主机字节序和网络字节序(大端:高位字节存储低位,低位字节存储高位,主机字节序反之)
- 数据读写
- tcp 数据写
- recv
- send
- udp数据读写
- recvfrom
- sendto
- 通用读写函数
- recvmsg
- sendmsg
- 外带标记 sockatmark
- 地址信息函数 获取本端的socket地址 获取远端的 getsockname getpeername
- socket 选项 getsocket setsocket --这个是专门用来设置socket文件描述符的属性,而fcntl 是POSIX方法。具体了解https://blog.****.net/swartz_lubel/article/details/79574472 该函数更多选项
- tcp 数据写
- 网络信息API
- 根据主机名获取主机完整信息,根据ip 获取完整信息
- 根据名称获取某个服务的完整信息,根据端口获取某个服务完整信息 -- 具体函数就不列举出来了,只是告诉有这个功能
- 高级io 函数-----------------------
- pipe 管道,做进程间通讯
- dup dup2 函数 把标准输出重定向到另一个文件或者其它的。
- readv 和 writev 函数 将分散在内存块中的数据一并写入文件描述符中。
- sendfile 两个文件描述符之间直接传递数据,避免内核和用户缓冲区,提高效率。
- mmap munmap 用于申请一块内存,该内存作为进程间通讯的共享内存。
- splice 函数 用于连个文件描述符之间数据移动 ,零拷贝就是不消耗什么效率
- tee 两文件描述符之间复制数据
-
fcntl 函数 提供对文件描述符的各种控制
- 复制文件描述符
- 设置获取文件描述符标志
- 设置获取它们状态
- 管理信号
7章 是linux 服务器方面的一个规范操作
- 系统日志 服务器的维护和调试都需要这个东西,系统也提供了 一些函数 rsyslogd
- 有时候不能以root 权限来操作,因为权限太大,所以应该使用用户 代码中做用户判断呢?
- 系统资源限制
- 物理限制 cpu 内存数
- 服务器程序后台化 就是以守护进程的方式运行
8-9 服务器的架构模式 --也是本书最重要的章节 8是内核
- 服务器编程框架
-
模块 单个服务器程序 服务器集群 I/O处理单元 处理客户连接,读写网络数据 作为接入服务器实现负载均衡 逻辑单元 业务进程或现场 逻辑服务器 存储单元 本地数据库或文件缓存 数据库服务器 请求队列 各个单元之间通讯方法 各个服务器之间永远tcp连接 - IO模型
- 将文件描述符设置为非阻塞 fcntl 设置为F_SETFL
-
IO模型 读写操作和阻塞阶段 阻塞IO 程序阻塞利于读写函数 IO复用 程序阻塞与IO复用系统调用,可以同时监听多个IO事件 SIGIO信号 信号触发读写就绪事件,用户程序执行读写操作,程序不阻塞 异步IO 内核执行写操作并触发读写完成事件。
- 两种高效事件处理模式
- Reactor
- 负责监听文件描述符是否具有事件发生,如果有事件则立即通知该事件的工作线程。 select
- 详细介绍https://www.cnblogs.com/doit8791/p/7461479.html
- Proactor 模式将所有IO操作都交给主线程和内核来处理,工作线程仅仅只负责处理业务逻辑
- Reactor
- 逻辑单元
- IO模型
-
10章 信号
11章定时器
12章 libevent 开源库
13-14 多进程线程编程开发
15章 进程池线程池
第三篇 高性能服务器优化监控 介绍了一个linux 下的工具和小技巧