云计算百科
云计算领域专业知识百科平台

ENSP学习记录(8)

/* 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;
}

上一篇讲分层。这一篇讲"封装的完整过程"。

说实话,光看"数据被一层层加上头部"这句话,我完全没感觉。直到我在纸上把五层的图默画了一遍,才第一次有画面感。


一、从敲下网址到网线发出信号,中间被裹了四层

假设我在浏览器里访问 www.huawei.com,请求数据要发出去。PPT 给了十步,我压成五步:

应用层 [ HTTP头部 | 网页请求数据 ] → Data
↓ 交给 TCP
传输层 [ TCP头(源端口/目的端口/序号) | Data ] → Segment
↓ 交给 IPv4
网络层 [ IP头(源IP/目的IP/协议号) | Payload ] → Packet
↓ 交给以太网卡
链路层 [ Eth头(源MAC/目的MAC) | Payload | FCS ] → Frame
↓
物理层 01100101 01101100 ……(电信号/光信号/电磁波) → Bit

每一层干的事其实非常明确:

这一层加这个头是为了
应用层 告诉对方的应用程序:我请求的是哪个页面、用什么方法(GET)
传输层 告诉对方:数据给哪个程序(端口)、第几个字节(序号)
网络层 告诉路由器:从哪台机器到哪台机器(源/目的 IP)
链路层 告诉交换机:这一跳交给哪块网卡(源/目的 MAC)
物理层 把 0 和 1 变成能在线缆上跑的电压/光脉冲

注意一个层次感:IP 管的是"从哪台到哪台"(端到端),MAC 管的是"这一跳交给谁"(点到点)。

同一个数据包一路上 IP 头基本不变,但 MAC 头每过一台路由器都会重写一遍——因为下一跳换了,收件人就换了。这个区别在学路由的时候特别重要。


二、FCS 为什么在尾部

这是我第一次觉得"细节里藏着设计"的地方。

所有层都在前面加头,只有链路层在尾部还加了 4 个字节的 FCS(帧校验序列)。

为什么?因为校验必须等整个帧都发完才能算完。发送方一边发一边算,最后把结果贴在帧屁股上;接收方收到整帧后再算一遍,对不上就整帧丢掉。

如果 FCS 放头部,发送方就得先把整个帧算一遍才能发第一个字节,等于要多缓冲一次,没必要。

所以链路层是唯一"头尾都加"的一层。 这个小细节能直接秒杀一类选择题。


三、到了对面,一层层剥开

接收方做的完全是反向操作:

  • 物理层把电信号还原成比特流;
  • 链路层校验 FCS,对得上就剥掉 Eth 头,交给网络层;
  • 网络层看目的 IP 是不是自己,是就剥掉 IP 头;
  • 传输层看目的端口,剥掉 TCP 头,按序号把数据拼回去;
  • 应用层拿到干净的 DATA,交给浏览器渲染。
  • 整个过程叫解封装(Decapsulation)。

    一句话记:发的时候"从里往外裹",收的时候"从外往里剥"。


    四、一个我一开始想不通的问题

    既然封装会让数据变大(一个 100 字节的网页请求,加上各层头尾可能要 150 字节),为什么还要这样折腾?

    后来想明白了:这些"浪费"换来的是每一层都能独立工作。

    • 没有 MAC 头,交换机就得去看 IP,慢且没必要;
    • 没有 IP 头,路由器就不知道往哪送;
    • 没有 TCP 头,接收方就不知道数据给哪个程序、有没有丢。

    换句话说,这些头部就是"给不同角色看的分工说明书":交换机只看第一页,路由器看到第二页,主机全看。

    多花的那点字节,换来的是每一层都能被独立替换、独立排错。这笔账很划算。


    五、一个实用的副产品:抓包时该看哪里

    理解了封装,抓包就不慌了。看到一堆字段时先问自己一句:这个字段是给谁看的?

    • 给交换机看的 → 在帧头(源/目的 MAC、VLAN Tag)
    • 给路由器看的 → 在 IP 头(源/目的 IP、TTL)
    • 给主机程序看的 → 在 TCP/UDP 头(端口、序号)和更上层

    按这个思路分层看,一屏密密麻麻的字段立刻分成了三块,各管各的。


    六、一点学习心得

    这一篇知识点不多,但我花了整个晚上在纸上画。

    我画了五遍:第一遍照着书抄,第二遍不看书画,第三遍只画头部不画数据,第四遍标出每个头部"给谁看",第五遍把中间设备插进去画"在哪一层拆"。

    画到第五遍的时候,我突然意识到:原来"网络"不是一堆设备,是一堆"只看自己那一段"的角色在配合。

    这个认知比记住"TCP 头 20 字节"有用得多。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » ENSP学习记录(8)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!