TCP 的三次握手假设 A 为客户端,B 为服务器端。首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。B 收到 A 的确认后,连接建立。三次握手的原因第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽 ...
C语言——static关键字
1. 全局静态变量在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量.静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为 0(自动对象的值是任意的,除非他被显式初始化);作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。2. 局部静态变量在局部变量之前加上关键字 static,局部变量就成为一个局部静态变量。内存中的位置:静态存储区初始化:未经初始化的全局静态变量会被自动初始化为 0(自动对象的值是任意的,除非他被显式初始化);作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变;3. 静态函数在函数返回类型前加 static,函数就定义为静 ...
面试基础知识【转载】
本文来自 CyC2018/CS-Notes,最新版本请关注公众号 CyC2018 之后回复“下载”获取。# 第 1 章 网络## 第 1.1 节 计算机网络### 概述#### 网络的网络网络把主机连接起来,而互联网是把多种不同的网络连接起来,因此互联网是网络的网络。#### ISP互联网服务提供商 ISP 可以从互联网管理机构获得许多 IP 地址,同时拥有通信线路以及路由器等联网设备,个人或机构向 ISP 缴纳一定的费用就可以接入互联网。目前的互联网是一种多层次 ISP 结构,ISP 根据覆盖面积的大小分为第一层 ISP、区域 ISP 和接入 ISP。互联网交换点 IXP 允许两个 ISP 直接相连而不用经过第三个 ISP。#### 主机之间的通信方式- 客户-服务器(C/S):客户是服务的请求方,服务器是服务的提供方。- 对等(P2P):不区分客户和服务器。#### 电路交换与分组交换 ...
Redis学习笔记(3)——字典
简介字典, 又称符号表(symbol table)、关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构。在字典中, 一个键(key)可以和一个值(value)进行关联(或者说将键映射为值), 这些关联的键和值就被称为键值对。字典中的每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 又或者根据键来删除整个键值对, 等等。字典经常作为一种数据结构内置在很多高级编程语言里面, 但 Redis 所使用的 C 语言并没有内置这种数据结构, 因此 Redis 构建了自己的字典实现。字典在 Redis 中的应用相当广泛, 比如 Redis 的数据库就是使用字典来作为底层实现的, 对数据库的增、删、查、改操作也是构建在对字典的操作之上的。举个例子, 当我们执行命令:redis> ...
根据前序序列和中序序列构建二叉树
前序序列和中序序列构建二叉树简介输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例子例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \9 20 / \ 15 7代码class Solution{public: TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { int len = inorder.size(); if (preorder.empty() || inorder.empty()) // 序列为空 ret ...
Redis学习笔记(2)——链表
简介链表提供了高效的节点重排能力, 以及顺序性的节点访问方式, 并且可以通过增删节点来灵活地调整链表的长度。作为一种常用数据结构, 链表内置在很多高级的编程语言里面, 因为 Redis 使用的 C 语言并没有内置这种数据结构, 所以 Redis 构建了自己的链表实现。链表在 Redis 中的应用非常广泛, 比如列表键的底层实现之一就是链表: 当一个列表键包含了数量比较多的元素, 又或者列表中包含的元素都是比较长的字符串时, Redis 就会使用链表作为列表键的底层实现。举个例子, 以下展示的 integers 列表键包含了从 1 到 1024 共一千零二十四个整数:redis> LLEN integers(integer) 1024redis> LRANGE integers 0 101. "1"2. "2"3. "3"4. "4"5. "5"6. "6"7. "7"8. "8 ...
Redis学习笔记(1)——数据结构与对象
简单动态字符串 SDS(simple dynamic string)简介Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。/* * 保存字符串对象的结构 */struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 数据空间 char buf[];};空间预分配空间预分配用于优化 SDS 的字符串增长操作: 当 SDS 的 API 对一个 SDS 进行修改, 并且需要对 SDS 进行空间扩展的时候, 程序不仅会为 SDS 分配修改所必须要的空间, ...
操作系统笔记(1)——操作系统引论
操作系统(Operating System,OS)是配置在计算机硬件上的第一层软件,其主要作用是管理好这些设备,提高它们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用软硬件资源。操作系统的目标和作用操作系统的目标方便性有效性提高系统资源的利用率提高系统的吞吐量可扩充性开放性系统能够遵循世界标准规范操作系统的作用OS作为用户与计算机硬件系统之间的接口 OS 作为用户与计算机硬件系统之间接口的含义是:OS 处于用户与计算机硬件系统之间,用户通过 OS 来使用计算机系统。 用户可通过以下三种方式使用计算机命令方式系统调用方式图形、窗口方式OS作为计算机系统资源的管理者 资源归纳起来分为四类:处理器、存储器、I/O 设备以及信息(数据和程序)处理器管理:用于分配和控制处理机存储器管 ...
oh-my-zsh
zshzsh 简介zsh 是一个专为交互式使用而设计的 shell,尽管它也是一种强大的脚本语言。 bash,ksh 和 tcsh 的许多有用功能都被合并到 zsh 中; 添加了许多原始功能。zsh 安装原文链接macOS使用 Homebrew 安装brew install zsh zsh-completions要将 zsh 设置为默认 shell,请对 macOS High Sierra 执行以下操作chsh -s /bin/zshmacOS 的大多数版本默认提供 zsh,也可使用 MacPorts 安装sudo port install zsh zsh-completionsUbuntu, Debian & derivatives (Windows 10 WSL | Native Linux kernel with Windows 10 build 1903)apt insta ...
learn for vi/vim
what is vi/vimA text editor. very strong.命令模式字符操作插入:i # 当前光标的位置插入:I # 当前光标所在行首插入:a # 当前字符之后插入:A # 当前光标所在行末插入退出:esc # 退出当前模式删除:x # 当前光标位置向后删除:X # 当前光标位置向前删除撤销:u # 撤销一步操作(相当于图形编辑器的ctrl+z)行的操作:home或^ # 移动光标到行首:end或$ # 移动光标到行末:dd # 删除一行:Ndd # 删除N行:yy # 复制一行:Nyy # 复制N行:p # 粘贴内容词操作:dw # 向后删除一个单词(从当前光标开始):yw ...