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

网络系统

共 180 篇文章

IT 2016-02-29 23:39:07 / 累计浏览 3,240

你所不知道的 HSTS

这篇讲的是HSTS(HTTP严格传输安全)这个容易被忽略但至关重要的安全机制。作者从在淘宝首页意外看到罕见的307状态码切入,揭示了HTTPS网站面临的一个实际威胁:中间人利用HTTP(80端口)的首次请求进行劫持,替换广告或注入代码。 文章核心指出,HSTS通过服务器响应头中的`Strict-Transport-Security`字段来强制浏览器使用HTTPS,能有效堵住这个缺口。一个关键细节是,HSTS触发的跳转会使用特殊的307内部重定向状态码,这与常规的302跳转不同——它不会改变请求方法(如POST不会变GET),并且跳转可以被缓存,节省了额外的请求。 同时,作者也指出了HSTS的“坑”:它对纯IP地址或非标准端口无效;最危险的是,如果HTTPS未配置好就启用了HSTS且设置了长期`max-age`,可能导致用户无法访问网站。总体而言,文章清晰阐明了HSTS的工作原理、实际价值与部署风险,对于全站HTTPS化有直接的实践参考。

IT 2016-02-29 23:28:09 / 累计浏览 3,371

简述 OAuth 2.0 的运作流程

这篇技术文章用一次具体的 GitHub 登录授权经历,拆解了 OAuth 2.0 认证流程的核心逻辑。 作者以“访客在网站上用 GitHub 账号留言”为场景,将复杂的认证流程分解为四个直观的步骤:网站与 GitHub 预先协商权限、用户确认授权并获取临时凭证 code、网站使用自身凭证换取最终访问令牌 access_token,最后用该令牌获取用户信息。文章通过“门票”、“盖章”、“绿卡”等生动比喻,把 Client ID/Secret、授权码、访问令牌这些抽象概念及其作用解释得非常清楚,特别是强调了每一步的安全考量——比如为何不能直接用 code 访问数据,以及令牌的权限范围与有效期管理。 对于想理解 OAuth 2.0 “为什么这么设计”以及“各环节如何衔接”的开发者来说,这篇短文提供了一个从理论到实践的清晰视角,能帮助快速建立对该协议运作机制的全局认知。

IT 2016-02-21 11:13:28 / 累计浏览 3,469

DLNA家庭高清视频组网方案

这篇讲的是怎么用DLNA技术,在家庭Wi-Fi环境下,让手机、平板和电视都能流畅播放电脑或硬盘里的高清视频。 作者从最常见的需求出发:视频存在PC或移动硬盘上,想在手机、iPad和智能电视上随时播放,还能控制进度,并且支持AVI、MKV、MP4等常见格式。文章先横向对比了三种主流方案:土豪用NAS一体机,折中选带USB接口的智能路由器,以及最省钱的“穷人方案”——在PC上搭建DLNA服务器。 文章的核心就是详细拆解这个成本最低的PC方案。具体来说,需要在PC端安装像TwonkyMedia server这样的DMS软件,配置好共享视频的目录;然后在手机或iPad上安装支持DLNA的播放器,比如iPad上推荐oPlayer,安卓端推荐VLC。这样,只要PC开机并处于同一网络,移动设备就能发现服务器并播放里面的影片。 作者通过具体的软件配置截图和播放器界面展示,把搭建步骤讲得比较清楚。这个方案的关键在于,它绕过了购买专用硬件的门槛,用一台常用电脑就能搞定家庭影音的无线共享,对预算有限但又想享受便利的用户来说,是个切实可行的起点。

IT 2016-02-16 21:15:15 / 累计浏览 6,176

什么是DNS劫持和DNS污染?

你可能遇到过这样的怪事:输入正确的网址却跳到运营商广告页,或者明明翻了墙某些网站依然打不开。这些问题的共同根源往往是网络层面的DNS干扰。这篇技术讲解就厘清了其中两种最常见、但原理不同的手段:DNS劫持与DNS污染。 文章的核心在于对比。DNS劫持,可以理解为“结果被篡改”。它发生在DNS服务器层面,攻击者或运营商控制了服务器,直接修改了域名对应的IP地址。你的查询请求是真实的,但收到的回复是假的,导致你被引导到错误的网站。其典型症状是首次拨号上网时总会弹出运营商的门户页面。 而DNS污染,更像“过程被污染”。它利用DNS查询基于不可靠UDP协议的特点,在数据传输的途中进行拦截和伪装。当你的查询请求途经被监控的节点时,系统会提前伪造一个虚假的IP地址返回给你,根本无需你的请求到达真正的DNS服务器。这通常用于实现对特定境外网站的封锁。 因此,它们的应对策略也不同。对于DNS劫持,修改本地DNS服务器地址为公共DNS(如文章中列举的阿里DNS、114DNS等)是直接有效的解决方法。但对于工作在传输层的DNS污染,单纯更换DNS往往无效,通常需要借助VPN或远程解析等更复杂的方式。 文章不仅讲清了原理,还给出了从选择公共DNS到Windows系统下手动修改的完整操作指南,是一篇从现象认知到动手解决都很完整的实用科普。

IT 2016-02-09 23:11:30 / 累计浏览 4,732

C++线程池实现原理

这篇讲的是C++线程池中一个核心但常被忽略的机制——闭包(Closure)是如何工作的。作者没有一开始就堆砌复杂概念,而是从一段注释丰富的简单示例代码切入,展示了使用线程池的标准写法。 然后,他带读者聚焦到那个让人困惑的`NewClosure`函数。文章的巧妙之处在于,它揭示了这个“闭包”其实是一个简单的模板对象。其核心思路是:通过模板类`ObjClosure1`,将对象指针、成员函数指针以及参数值,这三样东西打包存储起来。当线程池的工作线程取出这个任务时,调用的`Run()`方法内部,再通过`(p_->*fun_)(arg1_)`这样的C++成员函数指针调用语法,把这些元素重新组合起来执行。 文章把这个过程比作“打包”与“拆解执行”,解释得清晰直白。作者的目标是让初学者看完后,从“不明觉厉”变为“原来如此”。对于想了解线程池任务封装原理,却又对模板和函数指针感到头疼的C++开发者来说,这是一篇很好的入门拆解。

IT 2015-12-13 22:04:23 / 累计浏览 3,111

TLS 握手优化详解

这篇讲的是随着HTTPS成为主流,如何优化TLS握手带来的性能开销。作者从TLS握手需要消耗两个RTT(往返时间)的痛点出发,详细拆解了False Start优化技术——它允许客户端在握手尚未完全结束时就提前发送加密的应用数据,从而将握手延迟从两个RTT压缩至一个。文章还深入分析了证书链的优化策略,指出证书过长或中间证书缺失会导致额外开销,并推荐了使用ECC证书来显著减小证书体积。通过Wireshark抓包图,文章直观展示了这些优化前后的对比效果。对于正在部署HTTPS的开发者来说,这些关于握手流程和证书配置的实践细节,能有效帮助他们在不牺牲安全性的前提下提升连接速度。

IT 2015-11-08 22:00:18 / 累计浏览 4,498

基于漏桶(Leaky bucket)与令牌桶(Token bucket)算法的流量控制

这篇讲的是高并发系统限流中的两个经典算法——漏桶与令牌桶的核心差异和适用场景。文章以大促流量为背景,引出限流对系统稳定性的必要性。 漏桶算法被形象地比喻为一个底部有孔的桶,它强制数据以固定速率流出,哪怕输入流量是突发的,它也能起到削峰填谷、强行平滑流量的作用。 而令牌桶则不同,它以固定速率向桶中放置令牌,请求需要消耗令牌才能通过。文章特别指出,令牌桶允许桶内积累一定数量的令牌,因此能较好地应对突发流量,在平均限流的同时保留了灵活性。文中也提到了Guava的RateLimiter,其SmoothBursty实现正是令牌桶的优化,能积攒令牌应对短时高峰,而SmoothWarmingUp则实现了漏桶式的预热限流。 作者通过对比明确了二者的本质区别:漏桶强在“恒定速率”,令牌桶强在“允许突发”。选择哪种算法,关键取决于你的业务流量是需要严格平滑,还是需要在平均速率约束下应对可预测的突发。

IT 2015-10-26 22:12:16 / 累计浏览 2,186

TCP相关参数解释

这篇系统梳理了Linux内核中影响TCP连接行为的关键网络参数。它围绕连接建立、保活检测、超时重试和状态回收等环节,逐一解释了如`tcp_syn_retries`、`tcp_keepalive_time`、`tcp_fin_timeout`等参数的含义、默认值及其对网络超时计算的影响。 文章不仅停留在定义层面,更结合了实际的调优场景。例如,它指出在高负载Web服务器或NAT环境下,许多默认值(如`tcp_retries2`的15次重试、`tcp_fin_timeout`的60秒)往往偏于保守,可能导致资源被空闲连接长期占用。作者分享了在不同环境下的调整经验,如将`tcp_syn_retries`降至2以加快连接放弃速度,或将`tcp_keepalive_intvl`缩短至15秒来更快地发现断开连接。 特别值得注意的是,文章对`tcp_syncookies`、`tcp_tw_recycle`这类涉及安全或特定场景(如NAT)的开关选项给出了明确的使用建议与风险提示,强调了参数调整需结合实际攻击面与服务类型。整体上,这是一份将内核参数文档与实战调优经验相结合的参考指南,帮助读者理解参数背后的网络原理,并为优化服务器性能提供具体思路。

IT 2015-06-04 09:56:04 / 累计浏览 2,397

R u ok--客户端网络优化实践

这篇讲的是客户端网络优化中那些让人头大的真实坑点。作者从和全国用户的大量“亲密接触”中总结出,用户愤怒的根源往往是网络状态切换时,应用没能及时恢复。 比如,你以为IP地址能定位用户,但实际会遇到IP库不准甚至运营商流量劫持;DNS可能不解析或被运营商插入广告;协议和端口也可能被拦截。这些“不可靠”的因素,单纯依赖服务器端策略很难根治。 文章的核心思路是“客户端必须能适应环境”。当网络从差变好时,应用必须迅速反应过来并恢复,而不是卡在旧状态。具体解法包括:不依赖IP而用smartDNS,维护好socket的连接状态机,在WiFi和不同移动网络下设置差异化的连接与发送超时,遇到EPIPE/ECONNRESET等错误时果断重连,以及准备多套协议与端口方案作为后备。 最后作者点出关键:网络可以时好时坏,但用户体验必须能“迅速恢复”。这些基于血泪教训的实战细节,对做移动端和跨平台开发的同学非常实用。

IT 2015-03-26 13:50:18 / 累计浏览 2,945

socket消息流程介绍及其C代码实现

这篇讲的是如何用C语言完整实现一个Linux下的TCP服务器,清晰地展示了socket通信从创建到结束的全过程。作者通过一个具体的程序示例,逐步拆解了socket编程的核心流程:首先创建socket并绑定指定的IP与端口,其中还设置了SO_REUSEADDR选项来处理端口复用;接着启动监听,循环接受客户端连接;最后接收指令、执行操作并返回结果。代码中对每个环节都加入了错误处理和状态反馈,使得流程健壮且逻辑清晰。文末还附上了makefile编译脚本和通过工具测试的运行结果,让读者能直观地看到“发送-接收-响应”的完整交互。对于想要理解底层网络编程细节的开发者来说,这篇从代码到理论再到实践的梳理,提供了一个非常扎实的参考范例。

IT 2015-03-26 13:36:06 / 累计浏览 2,851

Nginx带宽控制

这篇讲的是作者如何用Nginx替代Squid来实现文件下载的带宽控制。他首先介绍了Nginx自带的 `limit_rate` 和 `limit_rate_after` 指令,可以轻松设置“下载超过500KB后限速50KB/s”的规则。 但挑战在于,这是单连接限速。如果想控制总带宽(比如总出口100M),单纯限制每个连接速度并不够灵活,无法应对用户数变化带来的动态调整。为此,文章组合使用了 `limit_conn` 模块来限制并发连接数,从而变相控制总带宽,并分析了这种方案的局限性。 文章还探讨了更根本的解决方案:使用第三方 `limit_speed` 模块,或者借助Linux底层强大的TC命令进行流量整形(尽管配置复杂)。结尾处,作者推荐了功能相关但场景不同的 `limit_req` 模块。整体来看,文章从一个实际需求出发,梳理了Nginx在带宽控制方面的多种能力与边界,提供了不同复杂度下的实践思路。

IT 2015-02-26 22:18:37 / 累计浏览 4,597

关于http代理

这篇技术文章聚焦于一个网络基础问题:当使用HTTP代理时,目标域名的DNS解析究竟发生在用户客户端,还是代理服务器上?作者从两种典型的代理工作模式展开分析,厘清了其中的关键差异。 第一种是直连模式,常用于HTTP请求,代理服务器直接接收客户端发送的完整URL并转发,因此域名解析由代理服务器完成。第二种是CONNECT隧道模式,主要用于HTTPS,客户端先与代理建立TCP通道,随后在通道内进行TLS握手,此时代理服务器同样负责解析目标域名。 为了验证这一点,作者进一步使用Golang编写了测试代码,并设置环境变量来配置代理。测试结果表明,无论是HTTP还是HTTPS请求,Golang的标准库实现与curl的行为一致,域名解析都发生在代理服务器端。文章还揭示了一个有趣的实现细节:在Golang处理HTTPS请求时,代理的CONNECT握手与后续的数据传输是在不同的线程中完成的。 通过对比和代码验证,这篇文章清晰地解释了不同代理场景下的底层行为,对于理解代理工作机制、进行相关调试或开发都有直接的参考价值。

IT 2015-02-07 21:02:18 / 累计浏览 4,474

加速WEB访问:使用DNSmasq与squid代理并过滤广告

这篇讲的是在 CentOS 上搭建一套兼具加速与净化功能的网络网关方案。核心在于结合 DNSmasq 和 Squid 这两个经典工具,实现从 DNS 解析到网页访问的全链路优化。 作者首先配置了 DNSmasq,不仅利用其缓存功能加速域名解析,还通过定制化的地址记录,将常见广告域名指向本地,从源头拦截了大量广告请求。随后,详细讲解了 Squid 代理的安装与配置,重点区分了需要客户端手动设置的正向代理,和对用户完全透明的透明代理。 文章的一个实用亮点在于,指出了透明代理默认只能处理 HTTP 协议的局限性,并提供了通过开启系统 IP 转发、并配置 iptables 防火墙规则来重定向流量的完整解决方案,最终实现了无需客户端配置即可加速 HTTP 访问。此外,文章还分享了通过外部列表自动更新 Squid 屏蔽规则来持续过滤广告的脚本方法。 整体而言,这套方案能为小型网络提供 DNS 加速、网页缓存和广告过滤的多重效果,对于希望低成本提升内部网络体验和纯净度的读者来说,是一个步骤清晰、可操作性强的实践参考。

IT 2015-01-23 23:47:26 / 累计浏览 5,012

记一次LVS/Nginx环境下的访问控制

作者从一次监控异常出发,揭示了LVS/Nginx架构下访问控制的典型陷阱。他在Graphite上发现服务器网卡流量

IT 2015-01-21 23:38:40 / 累计浏览 17,339

HTTPS, SPDY和 HTTP/2性能的简单对比

这篇翻译文章源于作者对抗运营商网络劫持的关注,借此机会详细对比了传统HTTPS、SPDY/3.1以及新兴的HTTP/2协议在性能上的具体差异。 测试以Google英国首页为例,在相同条件下对比三者。一个关键区别在于报头压缩:HTTP/2采用的HPACK算法,在报头大小上显著优于SPDY所使用的DEFLATE压缩,使得HTTP/2的空请求报头体积最小,优势明显。 在响应信息大小方面,情况则更为复杂。对于图片资源,三者表现相近。但对于文本内容,虽然HTTP/2报头更小,但其数据帧的可选填充字节,使得最终响应信息反而大于SPDY。文章解释,这种填充机制主要是为了对抗如BREACH等特定安全攻击。 总体来看,HTTP/2在连接初期的数据传输效率上建立了优势,尤其是在报头处理上更为高效。而SPDY在某些特定内容的传输中依然保持着竞争力。文章通过具体的截图和数据,清晰地展示了下一代网络协议在优化性能与保障安全方面的不同设计权衡。

IT 2015-01-20 23:24:52 / 累计浏览 19,690

网络数据包调试利器之wireshark

网络调试中,Wireshark 是不少工程师离不开的“瑞士军刀”。这篇文章没有停留在概念介绍,而是直接带你走进 Wireshark 的实际操作现场。从如何在不同系统上安装开始,重点讲解了软件的核心使用流程。 文章细致拆解了 Wireshark 的主界面,并逐步演示了捕获数据包的关键设置。比如,如何选择网卡接口、理解混杂模式的用途以捕获局域网全部流量,以及如何设置像“port 80”这样的捕获过滤条件来提前筛选 HTTP 流量。 更实用的部分在于捕获后的分析环节。作者详细说明了如何使用显示过滤器,通过构建表达式来精确定位目标数据包。同时,介绍了着色规则和 IO 图表等可视化功能,这些都能帮助用户快速识别网络中的异常流量或性能瓶颈,比如通过 IO 图表直观发现 TCP 重传的低谷点。整篇文章像一份简洁的操作手册,让复杂的工具使用变得清晰可循。

IT 2015-01-19 23:42:28 / 累计浏览 6,917

TCP 的那些事儿(下)

这篇讲的是TCP协议核心机制中的“动态调整”与“流控”部分,聚焦于RTT算法演进和滑动窗口原理。作者从一个实际问题切入:重传超时时间(RTO)为何不能固定设置?由此引出RTT(网络往返时长)的测量难题。 文章清晰对比了三代算法。经典算法依赖加权平均,但容易掩盖网络抖动;Karn算法为解决重传采样矛盾选择“忽略重传”,却又用粗暴的“超时翻倍”来应对网络突变;最终,Linux内核采用的Jacobson/Karels算法则更胜一筹,它引入“偏差”因子,能敏锐感知RTT的波动,计算出更精准的RTO。 另一重点是滑动窗口。文章用生动图示拆解了接收端如何通过Advertised-Window告诉发送端“我能收多少”,从而实现流量控制,并详细说明了Zero Window的处理机制及潜在的DDoS风险。整篇内容扎实,用“不适合在厕所中阅读”幽默地暗示了其思维深度,将抽象算法与网络稳定性的现实关联讲得透彻明白。

IT 2015-01-19 23:41:13 / 累计浏览 22,570

TCP 的那些事儿(上)

这篇讲的是TCP协议的核心机制,作者从一个经典却复杂的网络协议出发,试图用清晰的方式梳理其设计原理。文章开篇就点明了学习TCP的挑战,并直接切入重点:TCP头格式。它解释了序号、确认号、窗口和标志位这四个关键字段如何分别解决网络包乱序、丢包、流控和状态控制这些实际问题。 接着,文章用两张图——TCP状态机与建连/断连流程——对照着讲解,把三次握手为何必要、四次挥手的本质说透了。它特别分析了ISN序列号初始化如何避免旧包干扰,以及TIME_WAIT状态存在的双重意义。更有价值的是,作者深入到了实战细节:比如Linux下SYN超时的重试策略(默认63秒),并警示了SYN Flood攻击的原理与tcp_syncookies的应对方式及其局限性。 这不是一篇面面俱到的协议手册,而是聚焦于TCP最根本的“连接”幻觉与可靠传输的实现,通过状态机和具体参数(如MSL、tcp_max_syn_backlog)的剖析,展现了这个30多年协议在精巧设计与现实妥协之间的平衡。读下来,能对那些看似理所当然的网络行为,建立起更扎实的认知。

IT 2015-01-17 00:06:49 / 累计浏览 3,290

关于请求被挂起页面加载缓慢问题的追查

这篇讲的是前端工程师在内部系统里遭遇的一个棘手怪问题:页面请求在 Chrome 中频繁出现 “Pending” 状态,加载耗时数十秒甚至超过一分钟,却能最终成功返回,不触发超时错误。问题偶发且难以复现,给排查带来极大困难。 作者团队从几个常见方向入手,逐一排除了 Angular 框架性能、内部封装库、Chrome 插件干扰以及杀毒软件的可能性。排查的核心手段是借助 Chrome 开发者工具和 `chrome://net-internals` 捕获网络日志,通过对比正常与异常请求的详细信息来寻找线索。 经过大量搜索和尝试,最终在 Chrome 网络栈的源码中发现了关键点:问题与浏览器对域名的并发连接数限制以及 “CACHE LOCK” 机制有关。当多个标签页同时请求同一域名下的资源时,后续请求会被前置的 DNS 预解析锁住,从而陷入长时间等待。文章最后给出的解决方案是在服务器端启用 HTTP/2 协议,有效缓解了这一问题。整个追查过程展现了从现象分析到源码层面深挖的完整技术排查路径。

IT 2015-01-12 22:50:58 / 累计浏览 3,499

调试利器之tcpdump详解

讲的是网络排查必备的工具tcpdump。文章开篇点明其“dump traffic on a network”的本质——一个功能强大、可扩展的包分析工具,能深入到网络层、协议、端口进行过滤和抓取。 安装部分是这篇文章的一个重点。作者详细拆解了三种途径:最省心的yum命令安装、稍麻烦但直接的rpm包安装,以及最繁琐但能获取最新源码的编译安装。对于源码编译,还贴心地提示了可能遇到的libpcap依赖问题及解决方法,比如需要先安装flex、bison和m4等,这对新手排坑很有帮助。 工具的基本使用也是核心。文章列举了tcpdump纷繁复杂的命令行参数,并对其中常用的选项,如`-A`(ASCII码查看)、`-i`(指定接口)、`-w`(写入文件)等,配合具体命令示例解释了它们在不同场景下的用途。例如,用`-A`参数可以直观看到MySQL通信的SQL语句原文,用`-w`抓包后配合Wireshark分析则能解决更复杂的问题。 整体来看,这篇文章从安装到实战,为初学者搭建了清晰的tcpdump入门路径,强调了它在网络诊断和安全分析中不可替代的作用。