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

网络系统

共 180 篇文章

IT 2015-01-12 22:48:51 / 累计浏览 4,573

ip地址中的网络号,主机号

这篇文章讲的是IP地址的核心结构——网络号与主机号。作者开篇就用了一个很形象的比喻:如果说MAC地址是你唯一的身份证号,那IP地址就是你详细的通信地址。这个地址被分成两部分:“网络号”标识你所在的网络(好比哪个城市或街道),而“主机号”则标识该网络上的具体设备(好比门牌号)。这种层次化的设计,让互联网上的通信定位变得高效有序。 文章的重点在于“如何计算”。作者以一个具体的IP地址(192.9.200.13)和子网掩码(255.255.255.0)为例,手把手演示了计算过程:先将两者转换为32位二进制,然后通过“按位与”运算得出网络号(192.9.200.0),再将掩码取反后与IP地址“按位与”得到主机号(13)。整个过程清晰展示了子网掩码的核心作用——就像一把尺子,精准地划分出IP地址中网络与主机的边界。 此外,文章还补充了IP地址的五类分类法(A、B、C、D、E类)及其二进制特征,并解释了子网掩码的另一种简洁写法(如/24代表前24位为1)。这些知识点串联起来,能帮助读者不仅知道“是什么”,更理解“怎么算”以及“为什么这么设计”,是理解网络通信基础的一个扎实入门。

IT 2015-01-11 23:15:18 / 累计浏览 1,790

为什么 skynet 提供的包协议只用 2 个字节表示包长度

这篇讲的是 skynet 框架中一个经典设计决策:为什么它的 netpack 库坚持使用 2 字节(最大 64KB)来表示 TCP 数据包长度,而不是更“灵活”的 4 字节。 作者从游戏客户端网络通信的实际场景出发,解释了这并非简单的技术限制,而是一种有意的引导。核心原因在于,在单个 TCP 连接中允许过大的数据包(比如 100KB)是一个糟糕的设计。这会在弱网环境下长时间阻塞整个通信信道,连带心跳包等需要及时响应的小数据包也被延迟,严重影响实时性。更进一步,4 字节的长度头还存在被恶意攻击耗尽服务器内存的安全风险。 因此,作者主张正确的做法不是放宽包长度限制,而是在“长度+内容”协议之上增加一层,将大数据块分片传输。这个设计看似“绕”,但它强制开发者去思考和解决数据传输的阻塞问题,最终能实现单个 TCP 连接承载多个逻辑信道的能力,比如区分高优先级的心跳/关键指令和低优先级的聊天信息或大文件分片。 所以,skynet 这个看似限制性的选择,其实是在用简洁的接口引导使用者构建更健壮、响应更及时的网络架构。

IT 2015-01-04 23:21:53 / 累计浏览 4,627

关于FIN_WAIT1

这篇讲的是TCP连接关闭过程中FIN_WAIT1状态持续时间的问题。作者从TCPCopy社区的一个讨论切入,先通过经典的四次挥手流程图帮我们回忆TCP关闭的步骤,重点解释了主动关闭方在发出FIN包后所处的FIN_WAIT1状态。 文章核心是纠正一个常见误解:很多资料会说tcp_fin_timeout控制FIN_WAIT1的超时,但实际上这个参数控制的是FIN_WAIT2状态的持续时间。真正的关键参数是tcp_orphan_retries,它决定了当FIN包的ACK确认未收到时,系统会进行多少次重试。作者通过一个用netcat和iptables搭建的实验,清晰地展示了FIN包被丢弃后的重试行为——每次重试间隔翻倍(约200ms,400ms,800ms...),并引用了Linux内核源码来证明当tcp_orphan_retries设为0时实际生效值为8。 因此,对于线上出现大量FIN_WAIT1连接的服务器,解决方案很明确:根据网络状况适当调低tcp_orphan_retries的值。文章最后还延伸了一点,讨论了FIN_WAIT1状态可能被利用进行DoS攻击的风险,使话题更深入。

IT 2014-12-30 12:20:27 / 累计浏览 10,212

SSL证书的分类(按功能)

这篇文章系统地梳理了SSL证书的六大分类,从最基础的DV域名型证书到企业级的OV、EV增强型证书,再到功能扩展的通配符、多域名及强制加密证书。它清晰地对比了各类证书在验证严格程度、包含信息、颁发周期和价格成本上的核心差异。例如,DV证书仅验证域名所有权,一两小时内即可签发,适合个人或中小网站快速启用加密;而OV和EV证书则需严格的企业身份审查,其中EV证书还会在浏览器地址栏直接显示公司名称,为金融机构等高要求场景提供最高级别的信任标识。对于拥有多个子域名或不同顶级域名的企业,通配符证书和多域名证书则分别提供了“一张证书保护所有子站”和“统一管理多个域名”的高效解决方案。文章不仅解释了技术定义,更通过适用对象的罗列,让读者能根据自身网站的性质、规模和安全需求,快速定位到最合适的证书类型,具有很强的实操参考价值。

IT 2014-12-28 23:56:39 / 累计浏览 3,995

NAS解决方案实现多媒体文件共享播放

这篇讲的是,如何用家里闲置的台式机,自己动手搭一个家庭影音中心,让笔记本、平板也能像访问本地硬盘一样,流畅播放电脑里的高清大片。 作者从日常存储空间不足的痛点出发,尝试了HTTP、FTP等流媒体方案,但都不够完美。最终,他利用Windows系统自带的SMB文件共享功能,将台式机改造成了家用NAS。 文章的核心在于一步步打通整个共享链路。服务端需要确保Server、TCP/IP NetBIOS Helper等关键服务处于开启状态,正确设置网络属性的NetBIOS选项,并为想共享的文件夹配置好访问权限。客户端则可以映射网络驱动器,直接获得一个类似本地磁盘的盘符。 配置完成后,作者发现直接播放1080P视频仍有卡顿。根因在于顺序读取时对瞬间传输速率要求过高。通过在共享设置中勾选“启用缓存以提高性能”选项,问题得到解决,播放变得流畅。 这个方案不仅限于Windows设备间互联,通过安装相应的应用,类Unix系统或其他终端也能访问这个共享服务。它把一台普通电脑变成了家庭的多媒体文件枢纽,实用性很强。

IT 2014-12-02 23:41:12 / 累计浏览 6,595

[译]Google Chrome中的高性能网络

这篇讲的是,即便在拥有V8引擎和WebKit渲染这两大“加速器”的今天,Chrome为何仍将网络性能优化视为重中之重。文章从一个核心矛盾出发:现代网页平均加载1280KB数据、88个资源,并分散在15个以上的主机上,这些短促而爆发的请求与TCP针对大文件传输的设计初衷并不匹配。 作者深入剖析了Chrome的多进程网络架构,并将一个资源请求从诞生到完成的生命周期拆解开来。你会看到,浏览器在发出请求前是如何绞尽脑汁复用已有连接、检查DNS缓存,甚至预判网站拓扑进行预先连接的。文章强调,如果网络不畅,所有前端优化都将事倍功半,因此Chrome网络模块的许多努力(如智能缓存、连接池管理)其实都发生在用户察觉不到的幕后。 它为前端和浏览器开发者提供了一个清晰的视角,理解浏览器这个“平台”是如何在底层与网络延迟和复杂度对抗的,最终目标就是让那些“巧妇难为无米之炊”的等待时间无限趋近于零。

IT 2014-12-02 23:32:03 / 累计浏览 2,051

战斗HTTP

作者从一个棘手的线上问题出发,讲述了一场与HTTP协议“战斗”的完整经历。他的同事在使用Mock工具Moco进行测试时,遇到了连接莫名挂住的怪象,且现象时有时无,极难复现。 排查过程一波三折。从最初怀疑测试框架本身,到单步跟踪发现“挂住”发生在Netty框架层面,甚至怀疑是框架缺陷。直到作者注意到Moco代码中一句强制关闭连接的逻辑,而客户端请求却带着 `Connection: keep-alive`,才初窥门径。问题在于,当服务器不支持长连接却强行关闭,而客户端期望保持连接并继续读取数据时,双方就陷入了“死锁”。 但故事并未结束。修复后,另一个单元测试又“挂”了。通过反复比对,作者最终发现了问题的核心:当服务器支持keep-alive时,如果响应中没有 `Content-Length` 头,客户端将无法得知需要读取多少数据,从而无限等待。最终的解决方案是:在保持连接的响应中,若缺少该字段则主动补全。 这篇记录展现了排查复杂问题的典型路径:从现象到假设,再由新线索推翻假设,循环逼近真相。它不仅剖析了HTTP协议中连接与数据读取的交互细节,也凸显了团队协作与刨根问底精神的价值。

IT 2014-12-01 23:21:26 / 累计浏览 1,288

【IPC通信】基于管道的popen和pclose函数

这篇讲的是C语言中errno的使用技巧,尤其关注如何将其转换为可读的错误信息。文章对比了strerror和perror两种主要方式:strerror可以将错误代码转换为字符串,方便与其他信息组合后输出到用户界面;而perror则能直接向标准错误流输出参数字符串和对应的错误原因,操作更为简便。 作者也指出了一个需要注意的地方:并非所有C库函数都会修改errno,例如gethostbyname函数。因此,正确的做法是仅在函数返回值表示异常时,再去检查errno的值。 文章进一步探讨了errno的线程安全性。通过引用系统头文件的内容,说明在现代Linux环境下,errno通常被实现为线程局部存储,从而确保了多线程环境下的安全。作者还提供了一段简单的代码,帮助读者自行验证当前编译器是否正确设置了相关宏定义,以确保errno行为符合预期。

IT 2014-11-28 23:18:12 / 累计浏览 4,377

再叙TIME_WAIT

这篇文章从一次“被反复问到”的经历出发,全面梳理了 TCP 协议中的 TIME_WAIT 状态。作者首先用几条简单的 Linux 命令,带我们直观感受繁忙服务器上动辄数万的 TIME_WAIT 连接。文章的核心在于解释了这种状态存在的“必要性”:它通过等待两倍的报文最大生存时间(MSL),确保双向关闭握手的数据包不会在不可靠的网络上引发混乱或干扰新连接。 接着,文章深入对比了控制 TIME_WAIT 数量的几种主流内核参数调优方案。其中,`ip_conntrack` 虽能调整超时,但作者指出它带来的性能下降可能得不偿失。而广为流传的 `tcp_tw_recycle` 参数则隐藏着一个在 NAT 环境下可能导致连接失败的“时间戳陷阱”。相比之下,`tcp_tw_reuse` 被认为相对安全,但其关键限制在于仅对连接发起方(如作为客户端的 PHP)有效,且依赖时间戳递增机制。 整体来看,这篇文章不是在简单罗列解决方案,而是深入剖析了问题的成因与各种方案的权衡。它提醒我们,那些试图强行缩短 TIME_WAIT 的“快捷方式”往往伴随风险,而理解其设计原理,才能为一次连接的优雅退场赋予合理的等待时间。

IT 2014-11-28 22:54:02 / 累计浏览 4,136

OSI 七层模型和 TCP/IP 协议比较

这篇技术文章对比了网络通信中两个经典的模型:OSI七层模型和TCP/IP协议栈。作者首先分别拆解了OSI的物理层、数据链路层直至应用层的七层结构,以及每层对应的核心协议与设备,例如网络层的IP协议与路由器,传输层的TCP/UDP。随后,文章转向实际中更普遍的TCP/IP四层模型,解释了它如何将OSI的底下两层合并、并把会话层与表示层纳入应用层。 文章的核心在于剖析两者的根本差异:OSI是理论完备的通信标准,自上而下设计,强调严谨的服务质量;而TCP/IP则源于互联网实践,是自下而上为解决互联问题而生的实用协议族。这种出身区别导致了架构分野——OSI有七层,TCP/IP仅四层。文中指出,虽然OSI模型概念清晰,但因实现复杂且标准化早于实际需求,应用有限。相反,TCP/IP因其简洁、灵活且与UNIX系统早期的深度结合,最终成为互联网事实上的标准。 通篇来看,作者通过结构、设计哲学和适用场景的并列对比,清晰地勾勒出理论模型与实践协议之间的不同路径与选择。

IT 2014-11-28 22:48:05 / 累计浏览 1,508

域名随机大小写导致libevent2的异步DNS解析失败

这篇文章深入剖析了libevent2内置异步DNS解析器的一个潜在陷阱。作者从实际遇到的DNS解析失败问题出发,指出根源在于libevent默认启用了“DNS-0x20 encoding”这种防投毒机制——它会将请求域名中的字母随机大小写化,但现实中的许多DNS服务器或中间网络设备(如ISP)并不严格遵守RFC规范,会在回复中将域名统一转为小写。这导致libevent在核对请求与响应域名时因大小写不匹配而判定解析失败。 作者通过抓包实验清晰地展示了这一过程,并深入libevent源码,定位到`global_randomize_case`开关及其导致严格字符串匹配的关键逻辑。文中还对比了Google Public DNS的做法:它也使用0x20 encoding,但通过引入白名单机制,仅对兼容的服务器启用,从而避免了全面故障。最后,作者向libevent社区提交了修改默认行为的补丁请求。这篇文章不仅讲清了一个技术故障的排查脉络,也揭示了理论标准与实际实现之间的常见鸿沟。

IT 2014-11-27 13:01:44 / 累计浏览 2,893

一次DNS域名解析问题排查记录

这篇讲的是一个线上服务因DNS解析异常导致调用失败的排查过程。作者从同事反馈curl调用另一个服务接口报错“couldn’t connect to host”入手,通过strace追踪发现,连接实际指向了一台实体机的IP地址,而非预期的VIP。 问题的根源在于新安装的阿里自研DNS解析软件vipserver,它错误地将域名解析到了多台实体机IP。与对方工程师沟通后进一步发现,实体机服务端口是2087,而VIP上监听的是2088,端口不匹配直接导致了连接失败。排查中还发现了一个“隐形干扰者”——nscd的DNS缓存。清空缓存后,之前“正常”的机器也暴露出问题,这解释了为何集群内部分机器表现不一。 最终的处理是暂时关闭vipserver,等待对方完成配置修正。这个案例清晰地展示了,当引入新的服务发现组件时,对解析链路、缓存机制以及上下游端口配置进行同步验证是多么必要。

IT 2014-11-27 13:00:25 / 累计浏览 5,370

HTTPS、SSL与数字证书介绍

这篇讲的是HTTPS、SSL与数字证书三者如何协同工作,共同构筑起现代互联网通信的安全基石。作者从安全通信的基本需求出发,清晰地拆解了HTTPS(安全的超文本传输协议)的本质——在HTTP和TCP之间加入一个加密层,而SSL(或其升级版TLS)正是实现这个加密层的关键协议。 文章没有停留在概念罗列,而是深入到了实现机制。它通过一个生动的A与B对话场景,形象地演示了SSL/TLS协议的“握手”过程:如何巧妙地结合非对称加密(用于安全地协商密钥)和对称加密(用于高效地传输数据)来平衡安全性与性能。同时,详细阐述了数字证书的核心作用——它如同网络世界的“身份证”,由权威的证书颁发机构签发,用于验证服务器身份并分发公钥,从而防止中间人攻击。 对于证书的信任链,文章也给出了直观解释:客户端(如浏览器)内置了受信任的根证书列表,只有由这些机构颁发的证书才会被信任。整体而言,这篇文章将抽象的安全概念落到了具体的协议交互与文件验证上,是理解HTTPS工作原理的一篇扎实导读。

IT 2014-11-23 21:47:21 / 累计浏览 3,749

修改Linux网卡连接速度

这篇讲的是作者如何发现并解决内网Linux服务器上传速度异常缓慢的问题。服务器文件传输速度只有1MB/s,作者怀疑是网卡工作模式所致。通过 `ethtool eth0` 命令检查,果然发现网卡速度被锁定在了10Mb/s的低速模式,即使它支持100Mb/s。 针对这个问题,作者使用了 `ethtool -s eth0 speed 100 duplex full` 命令,将网卡强制设定为100Mb/s全双工模式。调整后再次检查,网卡已成功切换到新的工作状态。最终实测文件传输速度达到了10MB/s,性能恢复正常。 这篇文章简洁清晰地展示了一个常见的网络性能问题排查过程:从现象(速度慢)到诊断(查网卡模式),再到解决(调整速率参数),并验证了效果。对于运维人员或遇到类似网络瓶颈的开发者,这个用 `ethtool` 手动调整链路参数的方法,是一个直接有效的参考方案。

IT 2014-11-23 21:35:24 / 累计浏览 1,610

监控Netstat中的TCP数据

作者从实际运维中遇到的netstat报错说起:当执行netstat命令时,若版本较旧可能触发“error parsing /proc/net/netstat”错误。解决方法是通过rpm确认netstat属于net-tools包,随后用yum升级即可修复。不过,文章的重点不止于故障排查,更延伸到如何有效监控TCP连接数据。 作者指出,直接监控netstat -s输出的绝对值(如连接数、段收发量)在Graphite等工具中几乎是一条平直线——因为数值基数太大,微小波动肉眼无法识别。真正有价值的是捕捉这些数据的相对变化率。为此,他分享了一段可直接运行的Shell脚本,通过循环对比相邻时刻的TCP统计值,实时输出增量数据,让监控图表清晰反映系统的动态趋势。 这篇文章从一个具体错误入手,最终给出了提升监控有效性的实用技巧,对需要关注TCP连接状态的运维人员颇具参考价值。

IT 2014-11-19 23:26:45 / 累计浏览 2,254

HTTP 的 POST 参数提交和上传的不同与 Mojolicious 的实现.

这篇技术文章聚焦于HTTP协议中POST请求的一个常见混淆点:参数提交与文件上传的底层差异。作者从客户端(如浏览器Form表单、curl命令)和服务器端(以Mojolicious框架为例)两个视角,清晰地剖析了依据`Content-Type`区分的三种主要方式。 第一种是默认的`application/x-www-form-urlencoded`,适用于常规表单数据提交,参数会经过URL编码。第二种是`multipart/form-data`,专为上传文件或二进制数据设计,它使用随机边界来分隔内容,能有效处理大文件,Mojolicious会智能地将此类文件封装为`Mojo::Upload`对象以便高效处理。第三种则是直接以POST body发送原始内容,参数通过URL传递,这种方式简单直接,但在处理大文件时可能带来显著的内存占用问题。 文章通过具体的代码示例(如`Mojo::UserAgent`的提交方式)和真实的HTTP报文片段,直观展示了这三种方式在协议层面的实际区别,以及在Mojolicious服务器端分别如何接收与解析数据,为开发者在不同场景下选择合适的提交方式提供了明确依据。

IT 2014-11-19 23:24:32 / 累计浏览 1,809

简易云端Hosts的构建

这篇文章讲的是如何应对DNS解析故障并构建一个简单的“云端Hosts”方案。作者从之前席卷全国的DNS故障事件切入,指出一些移动应用之所以不受影响,是因为它们绕过了DNS,直接通过云端维护的域名-IP映射进行连接。 文章的核心是探讨在多机房、多线路的复杂网络环境下,如何为客户端智能地选择最佳服务器。作者没有采用需要复杂测速系统的“智能”方案,而是提出了一种更简易的思路:利用IP库判断用户地理位置,通过预存的城市经纬度数据,计算与各机房直线的物理距离,从而选出同线路中最近的机房。这个过程巧妙地通过IP直接访问谷歌地理编码API,避开了服务被墙的问题。 此外,文章在结尾还提供了一个实用的排错技巧:教你如何使用 `dig` 命令的追踪功能,通过观察DNS查询返回的层级是否完整,来判断是否遭遇了DNS污染。整个方案追求“差不多够用”的实用主义,思路清晰且可操作性强。

IT 2014-11-06 23:59:43 / 累计浏览 1,572

Xen 虚拟机的 NAT 网络配置

这篇讲的是Xen虚拟机配置NAT网络的实用指南。当只有一台物理服务器且仅有一个公网IP,却需要运行多个虚拟机上网时,传统的桥接模式就显得无能为力了——它把每个虚拟机都直接暴露在外部网络。而NAT模式能完美解决这个问题,让多个虚拟机共享这个公网IP访问外部,同时外部无法主动访问它们,形成一个更安全的内部网络。 文章从桥接模式的局限性说起,清晰对比了NAT模式的适用场景。核心配置步骤其实不复杂,但有几个关键点:需要修改Xen的主配置文件(xend-config.sxp),将网络和VIF脚本切换到NAT和vif-nat;然后为每个虚拟机指定一个自定义的内部IP。一个巧妙之处在于,Xen自带的network-nat脚本已经自动处理了IP转发和iptables规则,省去了手动设置的麻烦。 作者特别强调了初始环境要“干净”,因为Xen的脚本在复杂网络环境下可能配置失败。整个配置流程逻辑清晰,从主机到虚拟机逐层设置,对需要隔离网络或节省公网资源的管理员来说,是一份很直接的操作参考。

IT 2014-11-06 23:51:46 / 累计浏览 2,108

中国移动网络下连接的秘密

网络工程师们常常争论 TCP 和 HTTP 哪个更可靠,这篇技术心得则拨开了这些迷思。作者从底层协议的本质出发,指出 TCP 是保证顺序与完整性的数据流,而 HTTP 作为其上的应用层协议,其“可靠感”更多源于请求-应答的临时连接模式。在移动网络环境下,这种特性与网络抖动结合,会显著放大延迟。 文章更深入地剖析了中国移动网络的特殊性:CMWAP/CMNET 的历史区分、各省各异的 WAP 网关,以及其作为 HTTP 代理对连接方式的限制。最后,作者聚焦于体验不佳的根源——受制于商业分割和硬件技术的“最后一公里”,并直言在此限制下,许多 CDN 加速方案的实际效果有限。 作者并非给出解决方案,而是基于实践,揭示了从协议层到运营商策略,再到物理接入的层层现实。理解这些“秘密”,才能对移动网络下的连接问题有更清醒的认知。

IT 2014-10-21 19:35:54 / 累计浏览 5,131

网络基础:路由表、默认网关和掩码等

这篇讲的是作者从一个具体的网络故障出发,剖析了路由表、子网掩码和默认网关的核心作用。问题很简单:两台服务器IP在同一子网,但其中一台的子网掩码被误配为255.255.255.224,这导致B在ping A时,根据错误的掩码计算,认为A不在本地网络,从而将数据包发给了网关。文章清晰地拆解了这一过程,说明了只要B端网关配置无效,通信就会失败。 作者接着将问题延伸,讲解了路由决策的通用原则。比如,当主机配备多网卡时,若为每个网关都设置了默认路由,系统在回包时可能因无法决策而随机选择路径,造成网络时断时通的诡异现象。对此,文章给出的实用解决方案是:要么为特定外部网络添加精确路由,要么去掉非主要出口网卡的默认网关配置,避免路由冲突。这些细节对于理解日常网络配置中的陷阱非常实用。