一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
前言
TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成包发送给通信对象,在接下来的学习中,我们将探索 IP 模块时如何将包发送给对方的。
在开始这个话题之前我们先来了解下数据传输需要经过哪些设备,以及这些硬件如何转发请求信息。
数据传输过程经过设备概览
包结构
首先我们先来看一下关于网络包的结构,包是由头部和数据两部分构成的,头部包含目的地址等控制信息,头部后面就是委托方要发送给对方的数据。
网络包的传输即通过包头部中的控制信息。

传输过程经过设备概览
数据传输的过程如上图所示。
首先,发送方的网络设备会负责创建包,创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据。
这时数据经过网络到达 集线器,集线器的作用是无脑将电信号转发到所有出口(广播),不做任何处理,这时数据可能会被发送给 终端 B、交换机 A 等等。
由于转发到了所有出口,那么这些终端如何确定数据包是不是发送给自己的呢?很简单,通过一个 全局唯一标识:MAC 地址,这个 MAC 地址 是存储在 以太网头部中,通过比较 MAC 地址 来验证下这个包是不是发给自己的,如果不是,则将这个请求丢弃掉。
上面这个图中,只有一个集线器,当存在多个集线器时,网络包会按顺序逐一通过这些集线器进行传输。
但是集线器有一个小缺点,就是会把请求转发给连接的所有的设备、终端,那么能不能只把请求发给目标 MAC 地址指向的那台设备呢?答案是可以的,通过 交换机 就可以实现。
交换机内部维护了一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。
然而交换机也有一个小小的限制,就是随着终端、设备的越来越多,交换机需要维护的映射关系越来越多,维护起来越来越困难。那么应该怎么办呢?
这个时候路由器就派上场了,让路由器帮忙把数据做一次转发。注意,路由器的每一个端口,都有独立的 MAC 地址。
那么我们如何来判断这个请求是交给路由器转发还是通过交换机直接发送出去呢?这个时候就需要用到数据包头部中的 IP header 了。如果 源 IP 和 目的 IP在同一个子网中,则直接将包通过交换机发出器,否则就交给路由器来处理。
网络包会通过路由器到达下一个路由器,这个过程不断被重复,最终网络包就会被送到目的地,当目的地设备成功接收之后,网络包的传输过程就结束了。
参考文档
- 如果让你来设计网络
- 《网络是怎样连接的》—— 户根勤
往期文章
- 网络是怎样连接的(一)—— 浏览器访问 Web 服务器过程概览
- 网络是怎样连接的(二)—— 浏览器生成 HTTP 消息
- 网络是怎样连接的(三)—— 通过 DNS 服务器查询 IP 地址
- 网络是怎样连接的(四)—— DNS 服务器工作介绍
- 网络是怎样连接的(五)—— 委托操作系统进行收发消息过程概览
- 网络是怎样连接的(六)—— 协议栈内部探索步骤
- 网络是怎样连接的(七)—— 协议栈的内部结构
- 网络是怎样连接的(八)—— 探索套接字
- 网络是怎样连接的(九)—— 连接连的到底是啥
- 网络是怎样连接的(十)—— 连接操作的实际过程
- 网络是怎样连接的(十一)—— 协议栈发送数据特性
- 网络是怎样连接的(十二)—— 数据收发操作中重要标志位 ACK
- 网络是怎样连接的(十三)—— 从服务器断开并删除套接字