202511|技术日志

1104

计算机网络分层模型

参考

OSI七层

应用层(HTTP FTP POP3 SMTP等)

表示层(加密、protobuf等序列化协议)

会话层(Socket API)

传输层(TCP UDP是重点)

网络层(IP,ARP)

数据链路层(MAC)

物理层(网卡,光纤)

TCP/IP四层

应用层(OSI的应用层+表示层+会话层)

传输层

网络层

网络接口层(OSI的物理层和数据链路层)

封装和解包

从Source主机出发,一个网络包,从上往下,每一层都会在传输的过程中加上协议对应的Header,这一过程叫做封装。

之后经过层层设备,这中间可能会进行中间层的封装和解包操作。

到达目标主机后,从下往上,一层一层提取Header解析内容,这一过程叫做解包。

自底向上

网线直连

物理层面的端到端连接

+实现简单粗暴

-设备数量上升时布线混乱,物理线路数量几何式增长

集线器

中央设备无脑转发,通过接收方的MAC地址进行区分

类似同一个房间说话所有人都能听得到,但是每个人都会去”检查”喊的是不是自己,不是的话就不予理会

+物理层面广播,实现较为简单

-只支持单工通信。同一个时间只能有一个人在房间内说话

-带宽浪费,由于是广播因此会浪费不必要的通信成本

-性能问题,所有设备共享一个相同的集线器带宽,设备越多,网络越拥挤

交换机

“智能学习”、精确通知的集线器

相比于集线器的广播,交换机内部维护了一个MAC地址映射表,Map<MAC, portNumber>

一开始表没数据,还是通过广播的方式,收到接入设备的应答后更新表数据用于下次精准转发;

随着接入物理设备的变动,这张表会动态变更。最终实现通信数据的精准转发(指定端口)

交换机位于计算机网络模型中的数据链路层

1105

路由

随着接入设备的上升,仅靠交换机也不够了。毕竟如果1000多个人,就需要几百个交换机。数据传输开销上而言、以及网络环境复杂度而言都是极为复杂不能接受的。

要是能将1000多个人分组,组内通过MAC进行学习并精准转发指定端口;组与组之间通过某个”管理员”进行消息传递就好了。

关键是如何设计一个地址系统,让设备既知道自己属于哪个小区,管理员又能据此找到目标小组?

由于MAC地址本质上是扁平的(因为每一个设备都有唯一的MAC地址),就像是身份证号,全国所有人只靠身份证号去检索依然十分困难。而通过精确到省——市——区的层级搜索方式,能够更快且精准定位:这就是ip地址系统的设计思想。而那个根据 IP 地址在小组之间转发消息的管理员就是路由器

IP基础计算

1)IP地址构成:

  • IP地址(如192.168.1.11)是32位二进制数,分 4 段显示(四个 8 bit)
  • 每段0-255,称为”点分十进制”

在同一个小组(小区),我们一般叫做一个子网:

  • 同子网内的设备可以直接通信
  • 不同子网要通过路由器转发

2)那么怎么判断是不是在一个子网呢?这就需要提到子网掩码了:

子网掩码也是由 32 位二进制数组成,连续的 1 表示网络部分,连续的 0 表示主机部分。

如 255.255.255.0 转为二进制就是 24个1和 8 个 0,简写为 /24,表示前面 24 位都是网络部分。

判断同网段:

  • 将IP地址和子网掩码做”与”运算,结果相同的IP就在同一网段
  • 如:192.168.1.11和192.168.1.22都与255.255.255.0运算后得到192.168.1.0

3)网关:

  • 通常是路由器的IP地址,作为子网对外的”门户”
  • 不同子网之间进行通信时,数据先发给网关
  • 比如192.168.1.1常作为默认网关

需要注意的是,路由器的引入只是随着计算机网络系统复杂度上升所引入的新系统。在之前的例子中,一开始我们通过直连、然后是集线器广播,再到交换机,这些都是通过MAC寻址。而路由器最终发送数据也需要借助MAC地址通过网线。随着层次上升,对于下层的系统技术只是进行了增强,在最终依赖的路径上并未舍弃。就像寄快递:

  • IP 地址相当于城市、街道:决定包裹该送到哪个区域
  • MAC 地址相当于收件人身份信息:最后一步实际交付

由于最终上层的协议/系统技术还是需要下层来进行落地交付,因此位于分层模型中下层的数据包,数据部分总是会包含完整的上一层的header和数据。

1106

Kafka架构概念整理

Broker,Topic,Partition,Consumer Group

如果用现实例子来举例:

Broker: 相当于是快递的网点,某快递在某地有多个网点,网点之间的快件是不同的,从设计上来说增加网点数量是为了增加这一片区域的快件吞吐量

Topic: 快递分类,大件/小件,只是一个逻辑概念,并不会实际存储数据

Partition: 货架,实际存储数据的物理形式

Consumer Group: 针对快件的业务处理小队,可能有派送小队,有统计小队。小队与小队之间(消费组之间)都有某个partition全量的消息。但是同一个小队内(同一个消费者组内部)不会重复消费消息。

从原理上来说,之所以同一个消费组内部不会重复消费消息,是因为Kafka topic的消费是依靠offset来标识的。

offset指示一个partition中的消费进度。

每一个消费者组都维护一个独立的offset。也就是消费者组id-partition才能确定一个唯一的offset。不同消费组的offset互不干扰

而关联关系上来说:

  • 同一个消费组内
    • 一个消费者可对应多个partition
    • 但一个topic下的某个partition只能被一个消费组内的一个消费者消费(本质上是避免同组内重复消费)
  • 不同消费组之间
    • 一个topic下的某个partition可被n个消费组内的n个消费者消费
    • (本质是 “每个消费组独立消费该分区的全量消息”,互不干扰)

202511|技术日志
http://example.com/2025/11/04/202511-技术日志/
作者
Noctis64
发布于
2025年11月4日
许可协议