IT技术博客大学习 共学习 共进步

网络系统

共 180 篇文章

IT 2021-05-27 07:40:19 / 累计浏览 2,091

让服务器响应整个网段中的请求

这篇讲的是如何让一台服务器响应整个网段的所有IP地址请求。作者从实际需求出发,发现这个看似复杂的网络配置,核心方案其实异常简洁,仅需两步关键操作。 第一步是在路由器上为目标网段(如 172.16.0.0/16)添加静态路由,将其网关指向服务器的物理地址。第二步则是在服务器本机,使用一条 `ip route add local` 命令,将该网段绑定到本地回环接口(lo)上。作者特别指出,这样能确保服务器正确接收并回复所有来自该网段的数据包,且比使用 ARP 代理(如 tarpd、ndppd)的传统方式性能更优,不会导致网关和服务器的邻居表爆炸。 此外,作者还补充了该方法对 IPv6 同样有效,并提示路由应配置在 lo 而非 eth0 接口上以避免潜在问题。整体来看,这是一个高效、干净的解决方案,通过巧妙的路由表配置,用最小的改动实现了复杂需求,尤其适合开发测试或需要模拟多服务端点的场景。

IT 2021-02-13 23:22:30 / 累计浏览 3,081

近场通信 vs. 低功耗蓝牙:如何抉择

这篇讲的是NFC和低功耗蓝牙(BLE)这两项热门的低功耗无线技术,该如何根据实际需求做出选择。 虽然它们都成本低廉、易于部署,但核心差异很大。NFC的优势恰恰在于其“近场”特性:设备必须贴近到几厘米内才能连接,这带来了极高的安全性,攻击者很难窃听。连接几乎是瞬间完成的,因此它非常适合安全门禁、非接触支付以及快速设备配对——比如手机一碰投影仪就能开始投屏,但实际数据会通过Wi-Fi等通道传输。 相比之下,BLE的工作距离可达几十米,带宽也更高(约1Mbit/s),但连接需要一点“握手”时间。它的通用性更强,更适合资产追踪、室内导航和位置感知广告等需要一定范围覆盖的企业应用。 简单说,需要极近距离、即时安全交互时,NFC是首选;需要更远距离和一定数据吞吐的场景,则BLE更为合适。两者并非替代关系,而是针对不同需求的互补方案。

IT 2020-02-07 14:18:40 / 累计浏览 3,080

内网穿透神器frp

这篇讲的是内网穿透工具frp,它解决了开发者常遇到的一个痛点:如何让内网服务(比如公司内网的调试接口、家里的树莓派)安全便捷地暴露到公网。作者对比了之前流行的ngrok,指出其国内访问慢、配置复杂的问题,而frp凭借开源、速度快、配置简单的特点脱颖而出。 文章的核心是手把手教读者搭建frp。作者先解释了frp的基本架构:在外网服务器部署服务端(frpc),在内网设备部署客户端(frpc),通过简单的配置文件建立隧道。接着,文章展示了配置服务端监听端口和客户端代理SSH、HTTP服务的具体示例,整个过程清晰明了。 作者通过实际搭建经验(服务端跑在Google Cloud上,客户端连家里树莓派)验证了frp的效能,并提到该项目在GitHub上已有过万Star。最终,frp只需十分钟即可完成部署的便捷性,使其成为解决内网穿透问题的高效选择。

IT 2020-02-02 10:55:04 / 累计浏览 3,040

直播/点播中HTTP Live Streaming(HLS)协议的简介与使用

这篇讲的是HLS协议在直播与点播场景中的应用。作者从基本概念切入,梳理了推流与拉流的过程,并点明HLS是拉流环节的关键协议。 HLS由苹果提出,核心特点是将连续流切分为小段TS文件,通过m3u8索引文件进行分发。它的优势在于完全基于HTTP,易于利用CDN分发,且支持客户端根据网络状况自适应选择码率。不过,这种分段机制也带来了延迟较高的缺点。文章详细说明了其工作模式:客户端先下载m3u8索引,再按列表顺序请求并播放TS片段。对于点播,文件列表固定;对于直播,索引文件则持续更新。 在实践部分,文章给出了用ffmpeg创建HLS流的命令示例,并探讨了加密与防盗链。HLS支持AES-128加密,但静态密钥安全性不足,更可靠的方案是结合用户信息动态生成密钥。最后,文章将HLS与新兴的MPEG-DASH标准进行了对比,指出DASH使用MPD描述文件且更倾向于支持fMP4分片,是国内如B站等平台选用的方案之一。 整篇内容从原理到实践,清晰展现了HLS协议的工作全貌与技术权衡。

IT 2020-02-01 20:00:49 / 累计浏览 2,899

你不在意的HTTPS证书吊销机制

这篇讲的是HTTPS证书在有效期内如果私钥泄露,该怎么紧急“作废”它的故事。作者从《长安十二时辰》的望楼加密系统联想到现实中的证书安全,抛出了这个关键问题。 文章的核心是清晰对比了两种主流的吊销状态检测机制。一种是传统的证书吊销列表,它像个定期发布的“黑名单”,但更新慢、文件可能大到1MB,拖慢访问速度。另一种是在线证书状态协议,它支持实时查询,但每次访问都要去CA服务器问一句,不仅慢,还会把用户的浏览地址暴露给CA。 作者进一步点出了OCSP机制面临的两难困境:如果浏览器查不到响应就拒绝访问,CA服务器就成了单点故障;如果查不到就默认信任,那这个机制又形同虚设。最终,文章引出了OCSP Stapling这个更优的方案——把查询工作交给网站服务器来做,并缓存响应,既保证了实时性,又解决了延迟和隐私问题。整篇文章从一个有趣的梦出发,把看似枯燥的安全机制讲得有层次、有取舍。

IT 2020-02-01 14:59:54 / 累计浏览 2,393

一图看懂HTTP缓存控制/浏览器缓存控制

这篇从一张广为流传但部分有误的HTTP缓存控制流程图说起,系统梳理了浏览器缓存的两大核心机制:强缓存与协商缓存。 作者清晰对比了两者的关键差异。强缓存(状态码200)在资源有效期内直接从本地读取,不发起网络请求,主要依赖`Cache-Control`(相对时间)和`Expires`(绝对时间)头部控制,前者优先级更高。而协商缓存(状态码304)则需服务器验证资源是否更新,核心涉及`ETag/If-None-Match`与`Last-Modified/If-Modify-Since`两组字段的配合,服务器会优先校验ETag。 文章还深入解答了常见实践问题:例如,为何需要ETag(解决Last-Modified在秒级修改和内容不变时更新时间等情况下的局限性),以及在未设置任何缓存策略时,浏览器采用的启发式算法。最终,作者提供了一张更正后的流程图,将复杂的缓存判断逻辑可视化,帮助开发者理清`Cache-Control`、`ETag`、`Last-Modified`等字段在决策树中的具体位置与作用,避免在实际开发中配置出错。

IT 2019-08-11 12:23:37 / 累计浏览 2,550

Http/2知识图谱

这篇讲的是HTTP/2环境下依然有效的十大通用性能优化规则。作者从HTTP/2与HTTP/1.x的显著差异出发,提炼出一系列核心实践。 文章具体列出了这些优化点:包括通过优化DNS查询来避免请求阻塞,充分利用HTTP/2的单TCP连接特性,以及谨慎处理跨域重定向。它强调了客户端与CDN边缘缓存的必要性,并提到了使用条件缓存、gzip压缩和针对性图片优化等具体手段。同时,文章也客观指出,像激进的预获取资源这类做法,在HTTP/2下可能收效甚微且开销大。 文章的一个关键亮点是,除了正面规则,还专门指出了HTTP/2下应避免的反模式,并配有一张清晰的知识图谱。这为开发者提供了直接的避坑指南。对于追求Web性能优化的工程师来说,这份结合了新旧协议考量的规则清单,具有很强的实操参考价值。

IT 2019-06-27 13:55:01 / 累计浏览 3,279

使用DNSPOD的API实现动态域名

这篇讲的是如何通过 DNSPOD 的 API,一步步搭建自己的动态域名解析(DDNS)服务。作者从实际操作出发,解决的是家庭网络等场景下,公网 IP 变动导致域名指向失效的问题。 文章的核心方案非常清晰:利用 DNSPOD 提供的 HTTP API,通过脚本自动获取当前外网 IP 并更新 A 记录。作者详细拆解了七个关键步骤,其中特别强调了容易踩坑的地方,比如生成的 Token 必须是 “ID,Token” 的组合格式,以及如何正确获取域名和子域名的 Record ID。 整个实现思路巧妙地结合了 `nc` 命令获取 IP 和 `curl` 调用 API,并最终封装成一个 Shell 脚本,配合 crontab 定时任务(例如每 15 分钟一次)即可实现全自动化。这为需要稳定域名指向动态 IP 的技术人员提供了一个轻量、可靠的自建方案。

IT 2019-03-28 22:28:54 / 累计浏览 2,653

重要的事情说三遍:ARQ协议

这篇讲的是作者从一个实际的网络难题出发,引出了ARQ(自动重传请求)协议这一关键概念。他家里的阿里云服务在公司访问异常,最后通过在家庭服务器和云服务器间建立可靠的“隧道”解决了问题,而这条隧道的核心就是ARQ。 文章随后像剥洋葱一样,清晰地解释了ARQ的精髓:它本质是一种在不可靠网络上实现可靠传输的错误控制策略,核心在于“确认”与“超时”机制,就像重要的事情没听清就要再说一遍。作者不仅给出了定义,更生动地对比了三种主流实现策略:最基础但低效的“停止并等待”、TCP所采用的“后退N帧”,以及更智能高效的“选择性重发”,把它们各自的原理和优劣讲得明明白白。 理解ARQ,不仅有助于我们看懂日常使用的TCP/IP协议背后的机制,也为在复杂网络环境下设计可靠的服务提供了思路。

IT 2019-01-01 19:59:27 / 累计浏览 2,067

TCP 滑动窗口 与窗口缩放因子(Window Scaling)

这篇讲的是TCP滑动窗口协议中一个常被忽略但影响重大的参数:窗口缩放因子(Window Scaling)。文章指出,TCP窗口字段本身只有16位,最大值为65535字节。在“高带宽-长延迟”的网络中,这个上限会成为性能瓶颈——比如在10Mbps、单向延迟80ms的链路上,理想窗口需要约100KB,但65KB的窗口迫使发送方必须等待确认,白白浪费了带宽。 为了解决这个问题,窗口缩放选项被引入。它通过在TCP握手中协商一个“缩放因子”,将接收到的窗口值左移该因子位,从而将最大窗口理论上扩展至约1GB(缩放因子最大为14)。文章通过计算示例说明,原先65KB的窗口经过缩放后,能够匹配高带宽网络的实际吞吐需求。 作者在实战中也验证了其效果:对一个上传服务进行调优,增大TCP缓冲区并启用窗口缩放后,上传一个8MB视频文件的时间从1分30秒显著缩短至20秒,体现了在特定网络环境下对此参数进行调优的实际价值。

IT 2019-01-01 19:57:27 / 累计浏览 2,455

流量引导:网络世界的负载均衡解密

这篇讲的是大型互联网系统如何把用户流量合理分配到多台服务器上。作者从早期云计算服务商简单地将域名指向一个服务器IP出发,指出这本身并非负载均衡,进而引出高可用和扩展性带来的挑战。 文章梳理了负载均衡技术的核心演进路线。首先分析了简单DNS轮询的弊端,比如DNS缓存导致故障切换缓慢,TTL设置也令人左右为难。接着,引入了四层(L4)网络负载均衡器,通过一个虚拟IP(VIP)和基于五元组的哈希算法,快速、高效地在多台服务器间分配连接,并具备了健康检查能力。为了应对数据中心级容灾,又引入了利用BGP泛播(Anycast)将同一VIP宣告到多个站点的方案,但也面临流量控制和就近访问的难题。最终,为了支持更复杂的应用逻辑(如缓存、限速、基于Cookie的分发),七层(L7)负载均衡器被加入架构,它能解析请求内容,做出更智能的决策,但其更高的计算成本也需通过前置L4均衡器来缓解。 文章指出,负载均衡是一个随云计算不断发展的复杂课题,从L4到L7,从单站点到多站点,其演进始终围绕着高可用、灵活性和控制力的权衡。

IT 2018-07-05 13:44:37 / 累计浏览 2,572

Windows 下重定向当前进程的 stdout 到网络连接

这篇讲的是在 Windows 系统下,如何将一个正在运行的进程的标准输出(stdout)重定向到一个 TCP 网络连接中。这并非一个简单的 API 调用,作者为了解决这个需求,深入探索了 Windows 与 POSIX 在底层 I/O 机制上的根本差异。 作者指出,尽管 Windows 提供了 `_dup2` 来模拟 POSIX 的 `dup2`,但其进程标准输出句柄(HANDLE)与 C 运行时的文件描述符(fd)之间的绑定关系是静态的。在进程运行时调用 `SetStdHandle` 并无法影响 `cout` 或 `printf` 的输出流,这是解决问题的第一个关键障碍。 更麻烦的是,Windows 下的 socket 不能直接作为普通的文件句柄使用,因此无法通过 `dup2` 直接传递。作者最终采用的核心方案是:先用 `dup2` 将 stdout 重定向到一个匿名管道,然后启动一个独立的转发线程,持续从该管道读取数据并发送到目标网络连接中。这个方案还巧妙地解决了进程结束时可能丢失末尾输出的问题——通过主动关闭管道来通知转发线程结束,确保数据完整性。 整个探索过程涉及了 Windows 内核对象、句柄复制、管道 I/O 与多线程同步等多个层面的考量,最终作者将实现封装成了一个 Lua 模块,并在 GitHub 上提供了可运行的示例代码。

IT 2017-02-06 23:18:08 / 累计浏览 3,180

关于TCP可靠性的一点思考,借此浅谈应用层协议设计

这篇讲的是,作者从网络游戏开发转向网络存储、机器学习等场景后,对TCP“可靠性”的重新审视。他提出,在需要重连重试的严肃应用中,TCP的ACK机制和操作系统的发送成功通知并不可靠——比如网络故障后,应用层无法获知哪些数据丢失,已提交的缓冲区也可能被释放,导致数据无法重发。 文章的核心,是剖析了三个基于TCP的应用层协议设计陷阱:发送方无法确认接收状态、无法区分“成功”与“未失败”、以及重试可能导致数据重复。针对这些“坑”,作者给出了具体的应对方案:必须在应用层设计确认应答(ACK);对于大文件追加,应采用带偏移量的positioned write;对于重复消息,则需在应用层进行去重。 最后,文章也讨论了优雅关闭连接的原则:应由接收最后一条消息的一方主动发起关闭。整篇文章从实际场景中的问题切入,深入浅出地阐明了在设计RPC协议时,不能盲目信任传输层,而必须在应用层构建自己的可靠性机制。

IT 2016-07-17 23:52:37 / 累计浏览 2,837

一次连接超时问题排查的历程

这是一次典型的、从迷茫到顿悟的故障排查历程。作者从一个Java应用启动时偶尔发生、且目标服务器不固定的数据库连接超时问题出发,展开了一场层层深入的调查。 排查始于网络抓包,但发现了更怪异的现象:部分TCP连接的SYN包似乎从未发出,而另一些则在收到服务器SYN/ACK后被客户端立即RST。通过strace工具,作者确认了所有connect系统调用均已执行,超时发生在内核的poll等待阶段,这解释了RST的由来,但问题的源头——从系统调用到网络发包之间那段莫名的“延迟”——依然成谜。 对内核网络栈的初步探索未果后,一次未过滤ARP包的抓包带来了转机。作者发现,连接失败的IP地址对应的ARP请求首次均无响应,需等待1秒后重试才成功。这1秒的延迟,足以让设定为50毫秒的连接超时大量失败。根因在于局域网存在广播限流,导致启动时ARP请求被丢弃,而一旦应用启动成功,持续的通信就会维持ARP缓存,故运行时再无此问题。 从复杂内核栈排查到基础的ARP缓存,作者也感慨这个原因“如此操蛋没技术含量”。但这个过程生动地说明,面对诡异的系统问题,保持开放的排查思路,并扎实地追踪数据流的每一环,是定位真相的关键。

IT 2016-06-06 23:43:17 / 累计浏览 3,534

Spark性能优化——和shuffle搏斗

这篇讲的是Spark性能调优中一个最头疼的问题——shuffle。作者把shuffle比作必须击败的“大boss”,因为它会触发大量网络传输和序列化,让原本在内存中飞快的计算慢下来。 文章没有堆砌理论,而是直接切入实战技巧。比如,作者用一个从3小时缩短到20分钟的例子,说明“先各自去重,再合并”为何能大幅减少shuffle数据量;还对比了`mapValues`与`map`、`reduceByKey`与`groupByKey`,点明哪些操作会偷偷引发shuffle,而哪些能保持本地高效计算。 针对常见的大小表join,文章给出了一个巧妙思路:把小表广播出去,用`broadcast`加`filter`直接替代耗时的`join`操作,能完全避免shuffle。对于数据倾斜导致单节点过载的问题,作者也指出了改进key设计的解决方向。 整篇文章就像一位有经验的工程师在分享如何“避坑”,从原理到代码示例都很具体,最后还提醒了关于`collect`、避免RDD嵌套操作等容易忽略的细节。对于用Spark处理大数据的人来说,这些围绕shuffle的优化思路相当实用。

IT 2016-04-05 14:54:35 / 累计浏览 2,793

三种解密 HTTPS 流量的方法介绍

这篇讲的是如何从技术层面解密 HTTPS 流量,作者从三种最常规的方法入手,深入浅出地剖析了 HTTPS 并非绝对安全背后的原理。 文章首先介绍了中间人攻击(MITM)方式,Fiddler、Charles 等调试工具就是通过向系统导入自签的根证书,充当浏览器和服务器间的“中间人”来解密流量。其次,文章探讨了如何使用 Wireshark 配合网站的 RSA 私钥进行解密。不过,作者明确指出了这种方法的局限:它只能解密采用 RSA 密钥交换的流量,对于目前主流的、具备前向安全性的 ECDHE 密钥交换则无能为力。因此,它也无法解密 HTTP/2 流量。 第三种方法则依赖于浏览器自身的 `SSLKEYLOGFILE` 环境变量。设置后,浏览器会导出密钥日志,使得 Wireshark 能够解密包括 ECDHE 在内的所有流量,但这主要用于开发者调试,并非安全漏洞。 文章最后给出了切实的安全建议:网站应启用具有前向安全性的 ECDHE 算法,并部署证书透明度等机制;用户则需警惕不受信的证书导入,并关注客户端自身的安全,因为恶意扩展同样能在浏览器内部窃取数据。

IT 2016-04-02 13:16:32 / 累计浏览 1,968

移动端测试的代理服务器搭建

这篇讲的是在Unix/Linux环境下,如何用开源工具Squid为移动端测试搭建代理服务器。文章从实际场景出发:移动设备需要调试或访问局域网内某台主机上的本地服务,直接访问不通,就需要一个中间代理来转发请求。 作者以CentOS系统为例,完整梳理了从安装到配置的全流程。关键步骤包括:禁用Squid默认的缓存机制(避免干扰测试)、设置必要的主机名、开放访问权限以及指定代理端口。文章还细心地提醒了日志文件管理的必要性,提供了两种日志清理方案,一个是用crontab定时任务粗暴清空,另一个是使用Squid自带的日志滚动功能。 最终,移动端只需在Wi-Fi的HTTP代理设置中,填入服务器IP和配置的端口,就能顺利访问到目标本地服务。整个方案实用且具体,对于在Linux环境下进行移动端开发测试的工程师来说,是一个清晰可复现的搭建指南。

IT 2016-03-23 17:25:14 / 累计浏览 3,631

微信收费事件背后被广泛忽略的技术细节

这篇讲的是当年微信与运营商“对峙”背后,那些被忽视的技术账。 作者从通信和互联网两个行业的“隔阂”切入,指出双方都在“互防”,而用户承受了后果——手机耗电快、网络信令压力大。他提供了一个关键对比:Google的PUSH心跳周期在正常网络下可达28分钟,但在中移动2.5G网络上,因为空闲5分钟连接就会被释放,微信Android版被迫缩短到5分钟。这意味着你的手机每天要被唤醒近300次来“续命”,耗电15%以上只是表面问题。 更深层的症结在于:由于谷歌服务在国内不可用,每个App都得独立维护一条PUSH“长连接”,信令风暴和耗电是成倍增加的。这本质上是运营商2G网络为应对IP流量做了“聪明反被聪明误”的限制定制,而互联网行业只能在TCP层上打补丁,无法用到通信层更高效的“天然PUSH通道”。 文章最终指向一个出路:与其互相掣肘,不如让运营商开放信令通道,以“免费+增值服务”的模式,同时解决三方的痛。这或许比单纯争论“该不该收费”更能推动行业走向共赢。

IT 2016-03-23 13:49:01 / 累计浏览 3,912

移动端网络优化

这篇讲的是如何系统优化移动端的网络请求性能,覆盖 Android、iOS 和 H5。作者将整个过程拆解为连接服务器和获取数据两个阶段,并针对每个阶段提出了具体可行的优化策略。 在连接阶段,文章重点介绍了跳过 DNS 解析的 IP 直连方案,以及通过服务器多地域、多运营商部署来缩短物理链路距离。在数据获取阶段,则详细拆解了从开启 Keep-Alive 复用连接、合并请求,到对请求和响应数据进行 Gzip 压缩、使用更精简的格式(如 JSON 替代 XML、WebP 替代传统图片)等一系列手段。此外,文章还探讨了利用 CDN 缓存、实施增量更新与断点续传等高级策略。 除了这些核心方案,文中也提到了预取、分优先级延迟请求以及多连接等补充优化思路,并强调了数据监控在验证优化效果中的必要性。整篇文章从原理到实践,为开发者梳理了一套从客户端到服务端的移动端网络性能调优实用指南。

IT 2016-03-12 22:55:19 / 累计浏览 4,094

可靠 UDP 传输

这篇关于可靠 UDP 传输的文章,作者从对 TCP over UDP 的审慎态度出发,深入探讨了其可能的应用场景与实现路径。 作者首先指出,强行在 UDP 上复制一个完整可靠的传输协议往往得不偿失。其优势通常只在特定条件下显现,例如游戏状态同步等对包序不敏感、或采用一问一答请求模式的场景——这类小数据量交互正是 TCP 建立/拆除连接开销的短板所在。 核心方案上,作者认为一个可行的“可靠 UDP”模块,应专注于解决“如何利用不可靠传输实现可靠协议”这一逻辑问题,而非直接绑定 UDP 收发。他提出的 API 设计,将可靠化逻辑封装为独立层,业务层仅需调用发送与接收接口,而由底层的 `rudp_update` 函数处理数据包组序、重传请求与心跳维持。 作者分享了一个轻量级的 C 语言实现(约 500 行),采用了请求重发机制、16bit 包序号、以及可配置的发送延迟与超时策略。他强调,其实用性在于简化逻辑,并通过超时而非复杂确认来清理过期数据,为特定低延迟需求提供了一个灵活且易于修改的参考起点。