/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
1. 先把网络原理的框架搭起来:分层模型和数据流动
网络原理这个话题,说大不大,说小不小。我最初做后端开发的时候,以为网络原理就是背一背OSI七层、记一记TCP三次握手,直到后来线上服务出问题、抓包排查碰了一鼻子灰,才意识到理解网络原理不是应付面试,而是每一个写网络应用、做接口联调、排查线上故障的人的核心基本功。
这篇笔记不是教科书,是我自己从理论到抓包、从写爬虫到硬件工程折腾下来整理出的“网络原理地图”。你可能是刚入行的开发、运维,或者做嵌入式、硬件设计的朋友,都可以从这里面找到自己需要的部分。
1.1 为什么要把网络原理完整过一遍
很多人对网络原理的印象是“理论多、实操少”,学的时候觉得抽象,工作里遇到问题又不知道从哪下手。我踩过的坑是:出了问题先怀疑代码,结果问题在DNS缓存;先翻应用日志,结果问题在网络超时重传。
把网络原理完整过一遍,最大的收获不是记住多少协议名称,而是建立起一张能定位问题的心智地图。比如浏览器输入一个URL到页面显示,中间经过多少次网络交互,每层做了什么,每一层的典型故障特征是什么。有了这张地图,遇到问题你就能顺着链路逐层排查,而不是瞎猜。
关键词其实是“链路”。网络原理的核心不是孤立的协议,而是数据从一端到另一端经历的完整链路。这条链路串起来的,就是分层模型、IP寻址、路由转发、TCP可靠传输、DNS解析、HTTP协议这些点。
1.2 TCP/IP四层模型,比OSI七层更贴近实战
教科书喜欢讲OSI七层模型,但实际工程项目中,大家天天打交道的还是TCP/IP四层模型:应用层、传输层、网络层、链路层。OSI七层可以了解,但排查问题按四层走就够了,分太细反而容易迷路。
为什么分层这么重要?我觉得最生活化的类比是公司分工。产品经理提需求、研发做实现、行政管后勤,各干各的,只要接口约定好就行。TCP/IP也一样:应用层只关心数据内容,传输层只关心数据能不能可靠到达对端,网络层只关心数据从哪里送到哪里,链路层只关心物理介质上怎么传帧。每一层都只管自己负责的事,上层不关心下层的实现细节。
这个设计的直接好处是:传输层可以用TCP跑在以太网上,也能跑在Wi-Fi上;应用层的HTTP请求既可以在有线网络发出,也可以在蜂窝网络发出。下层换了,上层感知不到。
1.3 数据从网卡到应用的“包裹传递”流程
分层模型理解了,实际的数据流动还是要亲手走一遍才踏实。我用一个HTTP请求为例,把数据从浏览器发出到服务器处理的过程拆开:
应用层:浏览器构造HTTP请求报文,包含请求行、请求头、请求体,交给传输层。
传输层:TCP协议把HTTP报文当作应用数据,切割成合适大小的数据段,加上TCP头。TCP头里有两个关键字段:源端口(浏览器随机分配的,比如54321)和目的端口(服务器固定监听,比如80或443)。加上端口号,网络上的数据才能知道到达服务器后交给哪个应用程序处理。
网络层:IP协议给每个TCP段加上IP头,里面有源IP地址和目的IP地址。路由器就是靠着这层的目的IP做转发决策。这里注意一个容易混淆的点:TCP段加了IP头之后叫“数据报”,在IP层传输。
链路层:数据报传到网卡后,被封装成以太网帧,加上源MAC地址和目的MAC地址,还有帧头和帧尾的校验字段。MAC地址解决的是“局域网内下一跳给谁”的问题,IP地址解决的是“整个互联网上终点在哪”的问题,两者一个也不能少。
接收端做的是逆过程:网卡收帧、IP层解包、TCP层重组、应用层拿到完整HTTP报文。整个过程像寄快递:你写好内容(应用层)、填上收件人和电话(传输层)、写清地址(网络层)、快递员按站点转运(链路层),最后送到收件人手里再逐层拆开。
我在这个过程中受益最大的一件事是学会了用抓包工具对照看。开一个Wireshark抓包,再访问一次网站,你能亲眼看到每一个TCP段的源端口、目的端口、序列号,看到IP头的TTL字段,看到链路层的MAC。理论和实物的对应一旦建立起来,很多东西就不再抽象了。
2. 核心原理拆解:IP、TCP与DNS这些躲不掉的概念
网络原理笔记如果只能留三个主题,我一定会留IP寻




