互联网刚起步时,ISO标准化了OSI协议
OSI根据互联网的功能需求划分了OSI7层模型,通过分层,复杂的网络协议更加简单化
由于各种原因,OSI没有被实现,取而代之的是TCP/IP协议族,OSI协议称为OSI参考模型
TCP/IP协议族是为了互联网通信而开发,参考OSI模型,TCP/IP也有对应的分层模型
TCP/IO分层模型
TCI/IP模型分层包括
- 应用层(DNS、HTTP、SSH等)
- 传输层(TCP、UDP、UDP-Lite等)
- 网络层(IP、ICMP、ARP等)
- 链路层
- 物理层
图解TCP/IP中有一图如下
传输层及其以下的机制由内核提供,应用层由用户进程提供
通过对应的 socket API 我们可以编写自己的应用程序
各层协议的详细说明请移步我的其他博文
封装与分用
主机间通信通过各个协议层协同完成
封装
源主机发送信息到目的主机,数据是从应用层流向物理层,到达目的主机后又流向应用层的
在从一层流向下一层的过程中,上层会根据协议添加自己的标志信息
这样一层一层对数据添加部首的过程称作数据的封装
到达目的主机后,即可将部首中的“上层协议字段”交给“上层协议”进行处理
图解TCP/IP中有一图如下
其中,数据在不同层有不同的叫法
- 传输层:段 段=传输层部首信息+应用层数据
- 网络层:数据报=网络层部首信息+段(来自传输层的数据)
- 链路层:帧=链路层部首信息+数据报(来自网络层的数据)
分用
以链路层为例
目的主机在网络层在收到链路层传上来的帧时,分析帧部首
帧的部首中有一个标志位为「类型」
类型的值说明了帧的数据是IP数据报、ARP数据报还是RARP数据报
根据该标志位,网络层就知道使用哪种协议去处理帧
这样的上层协议根据部首信息对数据分类处理的过程叫做分用
分用举例
以下以局域网内「源主机与目的主机间通信在链路层的处理过程」为例
部首与数据包
报头 | 报文 | 校验位 | ||
---|---|---|---|---|
目的地址(6byte) | 源地址(6byte) | 类型(2byte) | 数据(46~1500byte) | 校验位(4byte) |
- 地址:MAC地址
- 类型
- 值为0800:此时数据包是「IP数据报」
- 值为0806:此时数据包是「ARP数据报」
- 值为0835:此时数据包是「RARP数据报」
值得强调的是:后两种类型长度恒为28字节,因此数据包后面要补位(18byte)
链路层分用的具体例子如下
需要注意的是:
网关内的数据传输是面向无连接的,即信息不是点对点传输的
网关内所有主机都会收到数据,根据各层判断部首判断自己是否是目的主机
第一种情况:源主机知道目的主机的IP地址,但不知道MAC地址
则源主机在链路层封装的部首中信息中
- 类型:0806
- 目的地址:全为1(广播地址)
经过物理层信息的传递,每个主机都会在链路层看到该数据
主机发现目的地址是广播地址不会直接丢弃
发现类型为ARP请求类型,则将数据传递给网络层由ARP协议处理
此时又会有两种情况
- 网络层发现IP地址与本机不匹配,丢弃
- 网络层发现IP地址与本机匹配,发送ARP应答包传回源主机
第二种情况:源主机知道目的主机的MAC地址
部首中「类型」值为0800,「目的地址」值为对应MAC地址
目的主机接到信息后,地址匹配,则将数据传递给网络层
非目的主机的链路层接到信息后,发现目的地址(MAC)与本机MAC地址不一致,丢弃
RARP不再赘述
以上过程即为网络中分用的过程
则源主机在链路层封装的部首中信息中
- 类型:0800
- 目的地址:对应的MAC地址
经过物理层信息的传递,每个主机都会在链路层看到该数据
非目的主机发现目的地址与自身不匹配会直接丢弃
目的主机继续解析,发现类型为IP数据报,则将数据传递给网络层由IP协议处理
这样,根据部首信息目的主机做不同处理,即为分用