linux内核网络子系统初探—概述
一、网络模型 简单介绍
学习网络时,必定能在各种教材资料里见到以下三种网络模型:
三种模型间的差异:
- OSI七层模型是理论上的网络模型,从功能方面分成了相对独立的7个层次,由于太复杂所以仅停留在理论上,并没有实际应用。
- TCP/IP四层模型是商用的模型,是由实际应用发展总结出来的。
- 五层模型一般是教学目的,为了介绍网络原理设计的,采取折中的方法结合了OSI与TCP/IP模型的特点。
下图是七层与四层模型具体功能的对比图,可基本了解网络子系统的功能组成:
这几种模型是根据功能划分的,内核的实现代码不是按这样分层次编写的,每一模型层可能对应着许多具体的驱动接口层。
PS:本系列提及的“应用层”、“传输层”、“网络层”、“数据链路层”、“物理层”均指代的是五层模型中对应的层。
二、 网络基础知识
- 互联:在internet里,互联表示多个计算机网络在物理与逻辑上的连接。网络协议即是统一规定了互联的具体规则。
- PDU(protocol data unit):网络模型中,每一层使用自己的协议与另一系统内的对应层相互通信,每层协议在对等层间交换的信息叫PDU协议数据单元。
- 网络数据的封装、解封:
- ipv4与ipv6:ipv6被称为下一代互联网的协议,是由于ipv4地址逐渐耗尽才设计的ipv6。两者最直观的差异在于ip地址。ipv4地址共32bit,ipv6地址扩展到128bit。目前一般提到的ip协议指的是ipv4。
三、最初的linux内核网络模块
内核版本号 | 时间 | 内核版本发展情况 |
---|---|---|
v0.01 | 1991/9 | 第一个正式向外发布的Linux内核版本,此时代码里还没有网络支持 |
v0.96 | 1992/5 | 开始加入网络支持,此时linux/net里只支持本地socket处理,没有tcp/ip相关协议族,不算严格意义上的网络模块 |
v1.0 | 1994/3 | Linux 1.0版本正式发布,linux的使用逐渐广泛 |
从linux v1.0开始,内核才真正实现了网络协议栈功能。 | ||
linux v1.0代码中网络部分: |
[root@localhost linux-1.0]# ls net/
ddi.c inet Makefile socket.c Space.c unix
[root@localhost linux-1.0]# ls net/inet/
arp.c dev.h icmp.h loopback.c protocol.c README skbuff.h tcp.h utils.c
arp.h eth.c inet.h Makefile protocol.h route.c sock.c timer.c
datagram.c eth.h ip.c packet.c raw.c route.h sock.h udp.c
dev.c icmp.c ip.h proc.c raw.h skbuff.c tcp.c udp.h
[root@localhost linux-1.0]# ls net/unix/
Makefile proc.c sock.c unix.h
其中,unix子文件夹是unix域协议族的相关代码。
PS:关于unix
unix域协议族是client/server在同一台主机上通信时使用的一种机制,分为两类套接字:字节流套接字(类似于TCP)和数据报套接字(类似于UDP)。UNIX域协议特点:在同一台主机上的传输速度比tcp/ip协议栈快大概两倍。
linux内核网络子系统初探 这个系列,将对照着最原始版本 v1.0 的代码,初步系统性的学习linux内核代码中的网络部分。后续文章将主要围绕socket层(对应着应用层)、tcp+udp层(对应着传输层)、ip层(对应着网络层)、ethernet层(对应着数据链路层) 这5个网络子系统核心部分(涉及到5层网络模型中的4层,内核中没有物理层)来讲解。