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

网络系统

共 180 篇文章

IT 2014-09-17 13:37:30 / 累计浏览 4,055

Windows与Linux文件系统互访的几种方法

这篇讲的是如何让Windows和Linux像使用本地磁盘一样直接互访文件系统。作者从实际开发中的痛点出发:Windows编辑代码、Linux编译运行,来回拷贝太麻烦。文章指出,虽然Windows有CIFS、Linux有NFS,但二者不互通,好在Linux上已有CIFS的实现。 文章主要介绍了两种通过CIFS协议实现互访的具体方法。一种是用开源的Samba软件在Linux上搭建服务端,配置共享目录并设置用户后,Windows资源管理器就能像访问局域网共享一样,直接访问Linux文件系统,甚至可以映射为本地盘符。另一种方法是让Linux作为客户端,去挂载Windows已经共享出来的目录。作者以Windows XP为例,详细展示了如何开启共享,并在Linux下使用mount -t cifs命令将远程共享挂载到本地目录。 文章最后简单对比了两种方式的适用场景:Samba方案更适合需要频繁、便捷地从Windows侧访问Linux文件的工作流;而从Linux挂载Windows共享,则更适合那些主要工作空间在Windows,偶尔需要在Linux环境下编译或调试的场景。

IT 2014-09-17 12:21:22 / 累计浏览 8,587

使用Fiddler对手机应用进行抓包测试

这篇指南聚焦于如何解决手机应用抓包测试相对PC端更为麻烦的问题。作者从实际QA工作流程出发,详细拆解了使用Fiddler工具实现这一目标的完整步骤。 核心方案在于让手机与电脑处于同一局域网,并将手机流量代理至电脑。文章逐步说明了Fiddler的关键配置(如开启“允许远程计算机连接”)、如何获取电脑IP地址,并分别给出了iOS和Android手机进行网络代理设置的具体路径。其中,将代理端口统一设置为8888是一个贯穿始终的关键点。 整个过程清晰地将“手机抓包”这个可能让人无从下手的任务,分解为一系列可操作的明确步骤,为移动端调试提供了非常实用的落地指引。

IT 2014-09-15 14:12:28 / 累计浏览 4,651

网关协议学习:CGI、FastCGI、WSGI

这篇讲的是Web服务器与后端程序如何对话的几种核心协议。作者从最传统的CGI讲起,它每次请求都要“fork-and-execute”一个新进程,这种简单粗暴的模型在面对高并发时会迅速耗尽服务器资源。 于是FastCGI登场,它采用了“常驻进程”的设计,将解释器进程保持在内存中,性能据称能提升5倍以上。文章接着剖析了PHP生态中与此相关的几个工具:PHP-CGI的先天不足、Spawn-FCGI的古老与脆弱,以及PHP-FPM作为现代解决方案提供的平滑重启、慢日志等实用功能,形成了一个完整的技术栈演进图景。 最后,文章将视线转向Python的WSGI。它并非一个具体的程序,而是一份让Web服务器与应用程序解耦的“契约”。通过中间件层的设计,WSGI能够实现请求路由、负载均衡等高级功能,极大地提升了Python Web应用的灵活性和可移植性。 从CGI到FastCGI再到WSGI,这条技术演进的线索清晰地展示了一个核心诉求:如何在保证功能的前提下,不断提升Web交互的性能与架构的优雅度。

IT 2014-03-20 22:58:48 / 累计浏览 2,026

分地区访问解决方案

这篇讲的是如何通过部署Nginx反向代理,来实现高效、精确的网站分地区内容访问。文章开篇直击痛点:传统的动态页面或DNS劫持方案,要么资源消耗大,要么因用户使用第三方DNS而误判率高。作者提出,在Web服务器前加一层Nginx负载均衡器是更优选择。 具体方案利用了Nginx的GeoIP模块。配置的核心是定义一个`geo`映射表,将不同的客户端IP段(如192.168.70.64/26)映射到特定变量值(如“cnc”)。接着,通过`upstream`为每个变量值定义一组后端服务器。当请求到达时,Nginx会根据来源IP自动选择对应的变量,并将请求代理到相应的后端服务器组,实现了透明的流量分流。 文章强调了该方案的最大优点:判断精确,且对后端应用完全无侵入。同时,也客观指出了代价——需要额外的代理服务器,且单台Nginx的并发处理能力存在上限(文中实测可达4.5万/秒)。因此,作者在文末建议,在生产环境部署前,务必使用LoadRunner等工具进行全面的压力与功能测试,确保方案稳定可靠。

IT 2014-03-19 23:03:04 / 累计浏览 13,013

自建DNS以防止GFW干扰

这篇讲的是如何通过自建本地DNS服务器,来规避GFW对DNS查询的干扰,从而恢复部分网站的访问。文章首先解释了问题根源:GFW会拦截并污染常见的UDP协议DNS请求,导致解析结果错误。而一个有效的对策是利用TCP协议的DNS查询,因为它目前不易被干扰。 作者推荐的具体方案是,使用开源软件Unbound在本地搭建一个DNS服务器。该服务器监听本地,接收程序发出的UDP请求,并将其转换为TCP查询转发给上游公共DNS(如8.8.8.8),从而绕过污染。文章给出了在Windows系统上的详细配置步骤,包括安装、修改配置文件、重启服务,并最终将系统DNS指向本地127.0.0.1,操作性很强。 对于更进一步的安全需求,文章末尾还提到了一个升级思路:可以结合SSL加密,在境外服务器上部署Unbound作为上游,实现查询流量的端到端加密,提供了更彻底的解决方案。

IT 2014-03-19 22:40:30 / 累计浏览 4,394

域名DNS相关术语

这篇讲的是域名与DNS世界里那些让人头大的术语。作者把 Registrant、Registrar、Registry 和 Registry Operator 这四个核心角色及其相互关系梳理得很清楚:一个是所有者(注册人),一个是代理服务商(注册商),一个是权威数据库(注册局),还有一个是运营方(注册局运营商)。这个链条一明确,很多配置和管理上的困惑就能迎刃而解。 文章接着把目光投向了域名层级本身,详细拆解了顶级域名(TLD)这个概念。它特别对比了通用顶级域名(如.com)和国家或地区顶级域名(如.cn)的根本区别:前者由 ICANN 全球协调,后者则与具体国家或地区的法律和管理体系紧密绑定。 读下来,感觉像是跟着一张清晰的架构图,走了一遍域名系统的基本骨架。对于需要与海外服务商打交道,或者想弄明白“.com”和“.cn”背后管理逻辑不同的技术人来说,这篇文章提供的准确定义和对比,是厘清思路的好帮手。

IT 2014-03-19 22:27:10 / 累计浏览 1,684

DNSv6和DNS64简单配置

这篇讲的是如何在Linux系统上配置IPv6环境下的DNS服务,特别是DNSv6和DNS64功能。作者从上一篇DHCPv6的部署延伸出来,直指DNS作为互联网入口在IPv6时代的重要性。 文章以Bind服务为例,给出了清晰的实操路径。它从最简单的源码安装开始,然后聚焦于核心配置:如何让DNS监听IPv6地址(`listen-on-v6`指令是关键),并配置了测试用的IPv6地址段。配置过程还包括了关闭防火墙、设置SELinux等便于测试的准备工作,同时提醒线上环境需合理配置安全策略。 最终,文章提供了一个精简的主配置文件(`/etc/named.conf`)示例,让读者能快速抓住启用IPv6 DNS服务的配置要点。整体而言,这是一篇步骤明确、重点突出的配置指南,适合需要快速上手IPv6 DNS服务搭建的运维人员参考。

IT 2014-02-18 12:34:38 / 累计浏览 4,124

TCP网络协议以及其思想的应用

这篇深入探讨了TCP协议核心思想的文章,跳出了单纯的网络协议讲解,聚焦于如何将TCP在不可靠网络上构建可靠传输的智慧,活用到更广泛的系统设计中。 作者从大多数程序员对TCP的熟悉但未必精通的状态切入,明确指出TCP的精髓是在IP层的不可靠传输之上建立可靠机制。其核心技术如滑动窗口、慢启动、指数退避等,目的都是优化传输。但更重要的,是它提供的设计范式。 文章强调,TCP的“可靠”是相对自身协议栈而言的,一旦跨越不同系统边界(比如从一个应用到另一个应用),就需要重新审视可靠性。因此,任何涉及通信与交互的场景,都可以借鉴TCP的思想。 作者提炼出了在任何通信系统之上构建可靠传输所必须的三要素:确认、重传和顺序。这为我们设计自定义可靠协议(例如在UDP之上)或解决复杂交互问题,提供了清晰且根本的思路。

IT 2013-11-21 23:08:20 / 累计浏览 11,031

浅谈TCP优化

这篇讲的是TCP性能优化背后的原理与可操作的调优方法。作者以《High Performance Browser Networking》一书为依托,将看似晦涩的流量控制、慢启动和拥塞避免机制,用通俗的比喻讲得清晰明白。例如,用“吃几碗饭”比喻接收窗口(rwnd)的限制,用拳击试探比喻拥塞窗口(cwnd)的增长。 文章深入浅出地解释了网络吞吐量受限的核心逻辑:传输性能由rwnd和cwnd中较小的值决定。针对百兆网络却跑不满速的常见问题,作者给出了具体解决方案——根据带宽延迟乘积(BDP)来计算合理的rwnd大小,并介绍了Linux内核中的自动调优机制与关键参数。 对于网页加载等短连接场景,文章通过生动的类比(博尔特百米起跑)和数据对比,揭示了cwnd初始值设置对效率的巨大影响,并引用了Google的研究结论,建议将其调整为10个MSS大小。从原理到实践,文章提供了一套可落地的优化思路。

IT 2013-10-08 12:38:25 / 累计浏览 2,271

在LVS上实现SNAT网关

这篇技术文章详细记录了作者为LVS负载均衡器添加SNAT网关功能的实战过程。目标很明确:让LVS在承担4层反向代理的同时,还能为内网机器提供访问外网的能力。 作者先分析了常规方案的局限——使用iptables虽能实现SNAT,但会严重影响LVS性能。因此,他决定直接修改LVS源代码。文章核心梳理了两种实现路径:一是修复小米已有的dsnat项目,使其兼容NAT和FULLNAT转发模式;二是在官方内核的NAT模式上,以最小改动直接添加SNAT功能,无需依赖额外的FULLNAT补丁。 实现过程颇具细节:从获取内核源码、打补丁、编译调试,到使用tcpdump抓包分析,作者逐步解决了dsnat与原生NAT的兼容性bug,以及其与FULLNAT的配置冲突。最终产出的补丁和配置示例,为有类似需求的读者提供了可直接参考的完整方案。文章也坦诚指出了当前实现的局限,如暂不支持ICMP协议转发。

IT 2013-10-08 12:15:24 / 累计浏览 2,794

防火墙的目标地址转换和源地址转换

作者从一起防火墙故障出发,探讨了目标地址转换与源地址转换的配置逻辑。故障表现为外网用户能成功发送请求到内网网站,却始终收不到响应。排查发现,根源在于内网服务器配置了两块同网段网卡且均设置了网关,导致返回数据包的源地址与请求进入时的目标地址不一致,防火墙因此无法将响应数据正确关联到原有会话。 要解决这一问题,需要理解防火墙的数据包处理流程。在常规的“外网访问内网”场景中,通常只需配置目标地址转换。但在上述网卡配置错误的特殊情况下,必须同时配置源地址转换,强制让内网服务器的返回流量经过防火墙,从而维持会话的对应关系。同样,当“内网通过域名访问另一内网服务器”时,源地址转换也是必需的,它避免了内网主机间直接通信导致防火墙无法跟踪连接状态的问题。 文章通过实例拆解了两种地址转换在不同场景下的必要性,核心在于确保返回数据包的路由路径能被防火墙正确识别和管理。作者最后指出,虽然具体防火墙机制各异,但基本原理相通:在规划地址转换时,必须考虑数据包返回的路径,否则可能导致通信失败或应用获取不到真实客户端IP。

IT 2013-09-23 23:16:43 / 累计浏览 3,467

深入理解 GRE tunnel

这篇讲的是 GRE 隧道,作者从一个常见误区出发:很多人以为 GRE 和 SIT、IPIP 一样是端到端的隧道,其实根本不是。核心差异在于,GRE 隧道不是建立在通信的主机上,而是建立在中间的路由器上,这对端点主机完全透明。 文章通过对比 SIT 隧道(包在出入口主机封装解封)和 GRE 隧道(由路由器负责封装解封)的原理图,清晰揭示了这一关键设计。这种设计让 GRE 解决了 IPIP 无法处理的多播等问题。随后,作者深入 Linux 内核,剖析了 GRE 隧道的实现:发送时路由将包导向隧道设备,内核添加外部 IP 头;接收时内核先识别 GRE 协议,交给 `ipgre_rcv()` 函数剥去外层头,再像普通 IP 包一样处理。 理解 GRE 是中间节点而非端点的特性,是掌握其工作原理和应用场景的关键。这篇文章从原理到内核实现,把这一点讲透了。

IT 2013-09-07 15:16:53 / 累计浏览 1,607

网络传输协议AMF初探

这篇讲的是 AMF(Action Message Format)协议,一种专为高效数据传输设计的二进制格式。与传统的 SOAP/XML 文本传输方式不同,AMF 采用二进制编码,能高度压缩数据,特别适合传递大量资料——数据量越大,传输效率优势越明显。文章梳理了 AMF 的核心特点:它可以直接传输 Flash 内置对象(如 Object、Array、Date),服务器端能自动解析,大幅简化开发流程。 作者从 Flash Remoting 的实际选择出发,对比了 AMF 与 SOAP 的关键差异。AMF 不仅比冗长的 XML 更高效,而且因为它专注于支持 ActionScript 数据类型,在浏览器中体积仅需约 4KB(压缩后),而 SOAP 则庞大得多,且存在头部请求不支持的问题。文章还列举了 AMF 协议支持的数据类型及其对应的十六进制值,展示了其结构的紧凑性。 在实现层面,文章介绍了 AMF 基于 HTTP 的典型处理流程:从客户端请求、反序列化、服务处理到响应序列化,并提及 PHP、.NET、Python、Ruby 等主流语言都已拥有成熟的 AMF 框架(如 AMFPHP、FluorineFx),开发者可以快速实现 Flash 与后端数据库的通信。 总的来说,这篇文章清晰地说明了 AMF 如何通过二进制优化和对 Flash 生态的专注,在特定场景下(尤其是需要高效、轻量交互的 Web 应用中)成为比 SOAP 更具优势的选择。

IT 2013-07-28 15:43:45 / 累计浏览 5,514

TCP洪水攻击(SYN Flood)的诊断和处理

这篇讲的是作者团队如何应对一场猛烈的SYN Flood攻击。当网站业务曲线大跌、Web服务器CPU高企、SSH登录困难时,他们从系统日志的“possible SYN flooding”警告和netstat命令中高达数万的SYN_RECV连接状态,迅速锁定了TCP洪水攻击这一元凶。 文章没有停留在原理层面,而是给出了从应急到根治的实战路径。初期用iptables粗暴封禁IP段是救火但易误伤;借助F5设备让客户端先完成三次握手再转发后端,被证明效果显著。但作者更分享了无需昂贵设备的内核参数调优方案:将tcp_synack_retries从默认的5次改为0,能让“半连接”的保持时间从180秒骤降至3秒,避免资源耗尽。同时配合调大tcp_max_syn_backlog、文件句柄数等参数,实测后即使在攻击下服务也能保持响应。 这是一篇典型的“踩坑”复盘,它清晰地展示了从发现问题、诊断根因,到尝试不同解决方案并最终沉淀出一套可用参数配置的全过程。对于运维和后端开发者而言,文中关于网络状态的判断命令和sysctl.conf的具体配置具有很高的参考价值。

IT 2013-06-02 20:23:56 / 累计浏览 4,972

http keepalive

这篇讲的是HTTP KeepAlive机制的工作原理与正确配置。作者从早期每个HTTP请求都需要单独建立TCP连接的性能瓶颈出发,解释了KeepAlive如何允许在一个TCP连接上持续传输多份数据,从而显著减少连接建立开销、降低服务器内核调用与TIME_WAIT状态连接数。 不过,文章也明确指出KeepAlive并非“免费午餐”,配置不当的长连接反而会导致系统资源被无效占用,其损失可能超过重复建立连接。因此,正确设置`keepalive_timeout`参数至关重要。 作者通过编写脚本与`tcpdump`抓包,细致地分析了三种场景:关闭KeepAlive、开启KeepAlive(超时300秒)、以及在同一连接上发送多个请求(超时180秒)。测试清晰地揭示了TCP连接从建立、数据传输到最终释放的完整生命周期。一个关键发现是,`keepalive_timeout`的计时器是在最后一个HTTP响应发送完毕后才开始启动,并在每次收到新请求后重置。这意味着合理的超时设置需要在复用连接提升性能与避免资源长期占用之间取得平衡。

IT 2013-05-29 22:37:00 / 累计浏览 4,509

如何诊断CDN故障

这篇讲的是当使用第三方CDN出现文件下载报错时,如何一步步锁定问题节点并诊断根源。作者从实际项目遇到的、节点众多导致排查困难这一痛点出发,分享了一套可操作的方法论。 核心步骤很清晰:先借助阿里测或Just-Ping等服务获取CDN的节点IP列表,然后利用一条结合xargs的shell命令并发测试所有节点的下载情况,通过对比下载文件的MD5值来精准定位异常节点。最后,再用淘宝IP库反查问题节点的地理位置,与用户反馈对照,就能确诊是哪个区域的网络或服务出了问题。 文中不仅给出了具体的命令示例,还贴心地列举了国内外常用的Javascript CDN地址作为参考。整篇文章从工具准备到执行验证,逻辑链条完整,对于运维和后端开发人员来说,是一份在CDN排障时能直接上手的实用指南。

IT 2013-05-29 22:34:16 / 累计浏览 3,911

HTTP的升级产品:SPDY

这篇讲的是Google推出的SPDY协议如何试图解决传统HTTP协议在现代Web下面临的性能瓶颈。文章从对比出发,清晰地指出HTTP的三大痛点:每个请求需要单独TCP连接导致的低效、服务端无法主动推送内容、以及重复的头部信息造成带宽浪费。 SPDY的核心思路是“增强而非取代HTTP”,它通过在一个TCP连接上实现多路复用,允许并行处理多个请求;引入服务器推送,让服务器能预加载资源;并压缩头部信息,从而大幅减少延迟和带宽消耗。同时,SPDY强制使用SSL加密传输,提升了安全性。文中特别指出,这使得现有服务端应用无需大改,只需增加SPDY传输层即可升级。 对于不同角色,SPDY的价值立竿见影:普通用户感受到更快的加载速度和更高的安全性;前端工程师可以利用请求优先级优化页面渲染;运维人员则能减少服务器连接资源消耗。文章最后也点明了SPDY作为HTTP 2.0重要候选者的背景,其目标就是让整个网络“快”起来。

IT 2013-05-17 13:49:09 / 累计浏览 6,010

gen_tcp发送缓冲区以及水位线问题分析

这篇讲的是一个线上 Erlang 服务器遇到的具体困惑:为什么按预期,客户端发送第 4 字节就该阻塞,实际上却到了第 7 字节才阻塞?作者从这个问题出发,深入剖析了 gen_tcp 的发送缓冲区与水位线(high_watermark/low_watermark)机制。 文章指出,理解的关键在于 ERTS 内部 port 的消息队列模型。发送数据(send)实质是向 port 发消息,当队列数据达到高水位线时,port 进入“忙碌”状态,调用者进程会被挂起,直到数据降至低水位线。文章结合参数设置详细推演了缓冲区与水位线的实际交互过程,并澄清了一个常见误解:高水位线更多是一个“软”限制,用于流程控制,而非精确的阻塞点;最终发送端的阻塞,很大程度上取决于接收端的 recv 行为。 作者通过源码与机制分析,将配置选项、内部数据流与观察到的行为串联起来,为理解 Erlang 网络编程中的流量控制提供了清晰的视角。

IT 2013-05-15 22:56:33 / 累计浏览 3,374

gen_tcp如何限制封包大小

这篇讲的是如何在Erlang的TCP服务器(基于gen_tcp)中,从底层实现上来限制单个数据包的大小,以防范潜在的安全风险和资源耗尽问题。 文章从两种包接收模式入手。对于同步接收({active, false}),作者指出,当使用gen_tcp:recv时,实际上内核会为接收分配一个缓冲区。通过源码可以看到,这个缓冲区大小存在一个硬编码的上限:TCP_MAX_PACKET_SIZE(64MB),一旦请求超过此限制,就会直接返回ENOMEM错误。这可以看作是系统级的防线。 而对于更常见的异步消息投递({active, true}),控制则发生在协议解析层面。通过inet:setopts设置的packet_size选项,会在数据解析时被检查。文章通过追踪tcp_remain等函数的源码揭示了这一机制:当解析器发现包头声明的长度超过了设定的psize值,这个数据包就会被判定为无效。 核心巧妙之处在于,这两种机制一个在缓冲区分配时卡住,一个在协议解析时拦截,共同构成了对包大小的纵深防御。文章通过解读底层C驱动代码,让读者清晰地看到这些看似简单的应用层选项是如何被严格实现的,对于需要定制或深入理解Erlang网络编程的开发者来说,提供了扎实的内部视角。

IT 2013-05-01 22:34:51 / 累计浏览 5,034

HTTP 正向代理与反向代理

这篇讲的是代理技术中正向与反向的核心区别。作者从大家最熟悉的“翻墙”场景切入,解释了正向代理由客户端主动设置(比如配置VPN),用于突破访问限制或进行网络管控,就像通过一台能上网的“网管”机器连接外部世界。 而反向代理则完全不同,它部署在服务器端,用户毫无感知。文中特别指出,反向代理主要用于两件事:负载均衡,以及通过地理位置优化提升性能——比如电信用户通过代理服务器经内部光纤访问网通资源,速度会快得多。 文章用电信用户获取文件的对比例子,清晰说明了反向代理如何通过服务器端的资源整合来改善用户体验。最后总结道,两者最根本的差异在于:正向代理由客户端配置,反向代理则由服务端对服务器间通信进行代理,实现负载分配与访问加速。 文末提到作者参考了《HTTP权威指南》,其个人对“防火长城”作用的理解也为我们提供了一个观察网络代理不同角色的有趣视角。