服务端基础知识

OSI七层模型 层 作用 注 应用层 为程序提供服务 规范数据格式 表示层 数据格式转换,加密 翻译 会话层 建立和管理会话 没有指定协议 传输层 管理端到端之间的连接 TCP协议、UDP协议 网络层 IP地址和路由 IP地址、ARP协议 数据链路层 链路管理 MAC地址、帧 物理层 提供传输环境 网线、WiFi TCP/IP四层模型 层 包含 应用层 应用层、表示层、会话层 传输层 传输层 网络层 网络层 数据链路层 数据链路层、物理层 ARP协议 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。 TCP/UDP协议 TCP和UDP协议是TCP/IP协议的核心。 TCP 传输协议:TCP 协议是一TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说,它是事先为所发送的数据开辟出连接好的通道,然后再进行数据发送;而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说,TCP对应的是可靠性要求高的应用,而UDP对应的则是可靠性要求低、传输经济的应用 TCP三次握手 所谓的“三次握手”:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系,并建立虚连接。 为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。 过程 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据(可使用抓包工具tcpdump 命令 tcpdump -nn -i eth0 prot 80) TCP四次挥手 对于一个已经建立的连接,TCP使用改进的四次挥手来释放连接(使用一个带有FIN附加标记的报文段)。TCP关闭连接的步骤如下: 第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。 第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。...

December 17, 2022 · 1 min · Leanku

Markdown入门

Markdown 1.Markdown 简介 2.常用语法入门 标题 段落 分割线 列表 引用 强调 辅助线 字体字号 背景色 行内代码 代码块 超链接 图片 Markdown 是什么? Markdown 是一种轻量级标记语言,创始人是约翰・格鲁伯(John Gruber)。它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档”。 —— 维基百科。 常用语法总结 标题 1.在标题文字下方添加标记,连续的三个 “等号”(===) 代表一级标题,连续的三个 “减号”(—)代表二级标题。 2.在标题文字行首增加连续的 “井号” (#) 及空格。1 个 “井号” 代表一级标题,2 个连续 “井号” 代表二级标题,以此类推,最多支持到 6 级标题。 段落 不同于分段换行,不分段换行不是用 p 标签描述段落,而是用 br 标签折断文字。 如果要让文字另起一行而不分段,需在行尾增加两个空格。 分割线 连续的三个「星号 *」,或者连续的三个「减号 -」,或者连续的三个「下划线 _」会被渲染成分割线。 列表 支持有序和无序两种列表,无序列表使用 「星号 “*"」、「加号 “+"」、「减号 “-"」表示,有序列表使用数字定义,如: 1. xxx 2.xxx 3.xxx 等。 引用 使用邮件风格「大括号 >」的引用声明。如果你已了解如何在邮件中引用文章,那代表你也掌握了在 Markdown 文本中引用文字的方法了。其实现方式就是在被引用的文字行开头添加「大于号 >」。 如果需要在块引用内的换行,可以在行尾增加两个连续的空格。 强调 用 「星号 *」或者 「下划线 _」 包裹住,一个符号的时候代表斜体,如 斜体,两个符号的时候代表粗体,如 **粗体**。...

November 19, 2022 · 2 min · Leanku

Markdown进阶

Markdown语法进阶 常用语法总结 原样输出 页内跳转 代码高亮 注释 表格 生成目录 脚注尾注 流程图 饼图 数学公式 Markdown 是什么? Markdown 是一种轻量级标记语言,创始人是约翰・格鲁伯(John Gruber)。它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档”。 —— 维基百科。 常用语法总结 原样输出 1.使用反斜杠\ 如 \斜体 页内跳转 <a id="table1">Table - 1</a> #要跳转的位置,id = 链接位置 [跳转到 Table-1](#table1) #在需要跳转的地方引用,点击即可实现跳转(编辑器中右键打开链接) 代码高亮 代码块后面标注语法类型,即可完成语法的高亮显示。 echo 'hello'; 注释 第一是通过 html 的 <!– –> 标记; 第二可以通过样式隐藏段落内容,即 <div style=“display:none”>;第三是通过 Markdown 自身的解析原理实现。 表格 表格包含三个部分:表头、分割线、数据。 表头 用来对列名对象进行描述,也就是通常所说的列名; 数据 用来展示每行的具体内容,数据是表格的核心; 分割线 用来区分表头和数据,也是 Markdown 中表格定义的最基本语法要求。 竖线 用来定义列,每两个竖线之间为一个单元格元素; 减号 用来定义分割线,也就是分割表头和数据体; 冒号 配合减号使用,用于定义列数据的对齐属性。...

November 19, 2022 · 1 min · Leanku

# Carbon(nesbot/carbon)-- PHP 日期时间利器化

Carbon(nesbot/carbon)– PHP 日期时间利器化 一、Carbon介绍 Carbon 是 PHP 中最流行的 日期时间处理库,基于 PHP 原生的 DateTime 类封装,提供 链式操作、易读 API、时区支持 等强大功能。 特点: 链式调用,语义化强 支持日期时间加减、比较、格式化 支持中文等多语言友好显示 可与 Laravel、Hyperf 等框架无缝集成 官方文档:https://carbon.nesbot.com/docs/ 安装:composer require nesbot/carbon 二、基本使用 2.1 获取当前时间 $now = Carbon::now(); // 当前时间,默认系统时区 echo $now; // 2023-09-28 15:30:12 // 指定时区: $nowShanghai = Carbon::now('Asia/Shanghai'); 2.2 日期创建 $dt1 = Carbon::create(2023, 9, 28, 15, 30, 0); // 年, 月, 日, 时, 分, 秒 $dt2 = Carbon::parse('2023-12-31 23:59:59'); $dt3 = Carbon::today(); // 当天 0:00:00 $dt4 = Carbon::tomorrow(); // 明天 0:00:00 $dt5 = Carbon::yesterday(); // 昨天 0:00:00 2....

November 15, 2022 · 2 min · Leanku

composer

composer Composer是 PHP 用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer 会帮你安装这些依赖的库文件。 一、Composer 基础概念 Composer 是 PHP 的依赖管理工具,它通过定义项目所需的依赖包及版本,自动安装和管理这些依赖,确保项目在不同环境下都能稳定运行。其核心概念主要包括以下几个方面: 1.1 包(Package) 包是 Composer 管理的基本单元,它可以是一个 PHP 类库、框架组件,或是某个功能模块。比如用于 HTTP 请求处理的 Guzzle,以及知名的 PHP 框架 Laravel、Symfony 等,都可以看作是 Composer 包。这些包被发布在 Packagist 等包仓库中,方便开发者获取使用。 1.2 composer.json 与 composer.lock composer.json是项目的依赖配置文件,开发者在其中定义项目所需的依赖包及其版本约束。例如,若要在项目中使用 PHPUnit 进行单元测试,可在composer.json添加 “phpunit/phpunit”: “^9.5” ,表示使用 PHPUnit 9.5 及以上版本,但低于 10.0 版本。​ composer.lock则是锁定依赖包具体版本的文件。当执行composer install或composer update时,Composer 会将实际安装的依赖包版本记录在composer.lock中。下次在其他环境安装依赖时,该文件能确保安装的依赖包版本与之前完全一致,避免因版本差异导致项目出现兼容性问题 。 1.3 包仓库(Repository)​ 包仓库是存储 Composer 包的地方,默认情况下,Composer 使用 Packagist 作为官方包仓库,它汇聚了海量的 PHP 开源包。除了 Packagist,开发者还可以搭建私有包仓库,用于管理内部开发的私有包,或者使用其他公共仓库,拓展包的来源。 packagist仓库地址 二、安装composer #下载安装脚本 - composer-setup.php - 到当前目录。 php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup....

November 15, 2022 · 3 min · Leanku

Composer 自动加载原理

Composer 自动加载原理 Composer 的自动加载本质是 动态加载类文件,它实现了“按需加载”的机制,避免了手动 require 每个类文件。 一、Composer 自动加载的核心 PHP 提供了 spl_autoload_register() 函数: spl_autoload_register(function ($class) { require 'src/' . str_replace('\\', '/', $class) . '.php'; }); 当你第一次使用一个类时,PHP 会调用这个函数。 $class 是你使用的类全名(包括命名空间)。 函数里通过规则找到对应文件并 require。 Composer 自动加载,就是在这个基础上做了 规范化管理。 二、Composer 生成的自动加载文件 安装依赖后,Composer 会生成: vendor/autoload.php vendor/composer/autoload_*.php vendor/autoload.php:入口文件,只需 require 一次。 vendor/composer/autoload_psr4.php:记录 PSR-4 命名空间 → 文件路径映射。 vendor/composer/autoload_classmap.php:记录 类名 → 文件路径,用于 classmap 加速加载。 vendor/composer/autoload_files.php:记录需要立即加载的文件(如全局函数库)。 vendor/autoload.php 的核心逻辑: require __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit::getLoader(); ComposerAutoloaderInit::getLoader() 会: 初始化一个 ClassLoader 实例。 根据配置注册 PSR-4、PSR-0、classmap、files 自动加载函数到 PHP。 调用 spl_autoload_register() 注册这些函数。 三、PSR-4 自动加载机制 PSR-4 是 Composer 默认的推荐机制。 假设 composer....

November 15, 2022 · 1 min · Leanku

Guzzle

Guzzle HTTP 客户端全解析及 PHP 使用与优化 一、介绍 Guzzle 是 PHP 世界中最流行的 HTTP 客户端库之一,用于发送 HTTP/HTTPS 请求并处理响应。 它支持: 同步和异步请求 HTTP/2 中间件机制(类似 Laravel / Hyperf 的管道) 并发请求 请求重试、超时、连接池 Guzzle 常被用于调用第三方 API、微服务接口或爬取网页数据。 官方文档:https://docs.guzzlephp.org 二 、安装 composer require guzzlehttp/guzzle 三、基本使用 3.1 同步 GET 请求 use GuzzleHttp\Client; $client = new Client([ 'base_uri' => 'https://api.example.com', 'timeout' => 5.0, // 超时时间 ]); $response = $client->get('/users/1'); echo $response->getStatusCode(); // 200 echo $response->getBody(); // JSON 或 HTML 3.2 POST 请求与 JSON 数据 $response = $client->post('/users', [ 'json' => [ 'name' => 'John', 'email' => 'john@example....

November 15, 2022 · 2 min · Leanku

Netlify部署静态网站

关于Netlify 在它的主页上可以看到它的宣传语: 用最快的方式构建最快的网站。 官方文档 为什么选择Netlify 内置 CI/CD 支持自动构建拉取代码仓库,每次提交的自动构建并发布预览 能够托管服务免费 CDN 能够绑定自定义域名 能够启用免费的TLS证书启用HTTPS 提供 Webhooks 和 API 通过内置应用程序添加动态功能 部署一个静态网站就非常简单,此处以GitHub仓库为例 静态网站push到GitHub仓库 进入netlify 登录 直接使用GitHub账号,授权 创建网站 点击New site from Git 选择仓库 选择分支(Branch to deploy) 4.3 打包命令 (Build command)诸如 npm run build,gulp build 之类;如果本身已是静态文件,不需打包编译,这一栏则不填 4.4 打包后目录 (Publish directory)诸如 public,dist,_site 之类;如果本身已是静态文件,这一栏则不填 4.5 deploy site 设置域名 netlify会随机生成了一个netlify下的域名,我们可以更改其前缀,并绑定到我们自己的域名下: Site settings->Change site name 更换默认域名 Domain settings->Add custom domain添加域名,然后到域名服务商网站绑定的域名下添加一条CNAME解析,解析的主机记录即对应的netlify域名值(即 xx.netlify.com) 关于.netlify.toml自动部署参阅文档 https://docs.netlify.com/configure-builds/file-based-configuration/ 更多操作后续更新。。。

October 22, 2022 · 1 min · Leanku

Git版本升级

使用 Brew 对Mac系统Git进行版本升级 #安装最新的Git ➜ ~ brew install git #改变默认Git指向 ➜ ~ which git #/usr/bin/git ➜ ~ git --version #git version 2.24.1 (Apple Git-126) ➜ ~ brew link git --overwrite #新开终端查看版本 ➜ ~ git version #git version 2.38.1 可以看到,我们的 git 版本已经升级到最新版了

October 21, 2022 · 1 min · Leanku

Hello Hugo

Hugo 是用 Go 语言写的,支持多个平台 包括 Windows, Linux, FreeBSD 和 OS X (Darwin) for x64, i386 和 ARM architectures. 官方文档 为什么选择hugo 通过 Hugo 你可以快速搭建你的静态网站,比如博客系统、文档介绍、公司主页、产品介绍等等。相对于其他静态网站生成器来说,Hugo 具备如下特点: 极快的页面编译生成速度。( ~1 ms 每页面) 完全跨平台支持,可以运行在 Mac OS X, Linux, Windows, 以及更多! 安装方便 Installation 本地调试 Usage 时通过 LiveReload 自动即时刷新页面。 完全的皮肤支持。 可以部署在任何的支持 HTTP 的服务器上。 一.安装 下载最新的 release 版本 Hugo Releases, Windows, Linux, FreeBSD 和 OS X (Darwin) for x64, i386 和 ARM architectures. Windows安装时需要加入环境变量 Mac就比较方便直接执行:brew install hugo 安装成功之后的操作如下...

October 21, 2022 · 1 min · Leanku