# OSI七层模型


OSI 模型是从上往下的，越底层越接近硬件，越往上越接近软件，这七层模型分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层  
- `物理层`: 在媒体上传输比特，提供机械的和电气的规约 
- `数据链路层`: 将分组数据封装成帧，提供节点到节点方式的传输 
- `网络层`: 将分组从源端传送到目的端，提供网络互联 
- `传输层`: 提供可靠的端到端的报文传输和差错控制 
- `会话层`: 建立、管理和终止会话 
- `表示层`: 对数据进行转换、加密和压缩 
- `应用层`: 程序及接口 

|OSI七层模型|TCP/IP4层模型|功能|TCP/IP协议簇|
|-------|------------------|--------------------------|---------------------------|
|应用层|应用层|文件传输、邮件、文件共享、虚拟终端、web、域名服务|TFTP、HTTP、SMTP、DNS、TELNET|
|表示层|应用层|数据格式化、代码转化、数据加密|没有协议|
|会话层|应用层|解除或建立与别的节点的会话关系|没有协议|
|传输层|传输层|提供端对端的接口|TCP、UDP|
|网络层|网络层|为数据包选择路由(路由器)|IP、ICMP、RIP、OSPF、BGP、IGMP|
|数据链路层|链路层|传输有地址的帧及错误检测功能|SLIP、CSLIP、PPP、ARP、RARP、MTU(交换机)|
|物理层|链路层|以二进制数据形式在物理媒介上传输数据(光纤、普通网线、无线信号)|ISO2110、IEEE802、IEEE802.2|

{{< image src="/images/osi模型.png" caption="OSI模型" src_s="/images/osi模型.png" src_l="/images/osi模型.png" >}}


## 全流程职责

**&emsp;&emsp;当你输⼊⼀个⽹址并按下回⻋键的时候，⾸先，应⽤层协议对该请求包做了格式定义；紧接着传
输层协议加上了双⽅的端⼝号，确认了双⽅通信的应⽤程序；然后⽹络协议加上了双⽅的IP地
址，确认了双⽅的⽹络位置；最后链路层协议加上了双⽅的MAC地址，确认了双⽅的物理位置，
同时将数据进⾏分组，形成数据帧，采⽤⼴播⽅式，通过传输介质发送给对⽅主机。⽽对于不同
⽹段，该数据包⾸先会转发给⽹关路由器，经过多次转发后，最终被发送到⽬标主机。⽬标机接
收到数据包后，采⽤对应的协议，对帧数据进⾏组装，然后再通过⼀层⼀层的协议进⾏解析，最
终被应⽤层的协议解析并交给服务器处理。**  

- `链路层`: 对0和1进行分组，定义数据帧，确认主机的物理地址，传输数据；
- `网络层`: 定义IP地址，确认主机所在的网络位置，并通过IP进行mac寻址，对外网数据包进行路由转发。
- `传输层`: 定义端口，确认主机上应用程序身份，并将数据包交给对应的应用程序。
- `应用层`: 定义数据格式，并按照对应的数据格式解读数据。


## 一条消息如何发送到目标电脑上的 
1. 应用层录入消息`hello`(写信)
2. 传输层附加TCP包首部(装入信封)
3. 网络层附加IP包首部(写入地址和邮编)
    - IP数据包:首部(20字节:包含版本、首部长度、区分服务、总长度、标识、标志、片偏移、生存时间、协议、首部校验、源地址、目标地址、可选字段、填充、数据部分) + 数据(最大65515字节)
4. 数据链路层附加以太包首部(邮票和邮章)
    - 以太网协议: 一组电信号就是一个数据包，一个数据包又被称为一帧
    - 以太网包,包含目标mac、源mac地址
5. 物理层传通过光缆将数据输至目标(邮车转移) 
6. 数据链路层拆解以太包首部
7. 网络层拆解IP包首部 
8. 传输层拆解TCP包首部 
9. 应用层接收消息 

## 网络地址分类
**特殊B类地址网段: 169.254.0.0/16, 用于处理DHCP分配失败或没有DHCP服务的情况**  
### 共有地址
- `A类`: `1.0.0.0`-`126.0.0.0`,默认子网掩码:`255.0.0.0` ,第一个字节为网络号，后三个字节为主机号。该类ip地址的最前面为0,所以地址的网络号取值于1-126之间。一般用于大型网络。 
- `B类`: `128.0.0.0`-`191.255.0.0`,默认子网掩码:`255.255.0.0`，前两个字节未网络号，后两个字节为主机号，该类IP
地址的最前面为10,所以地址的网络号取值于128-191之间，一般用于中等规模网络。
- `C类`: `192.0.0.0`-`223.255.255.0`,默认子网掩码: `255.255.255.0` ,前三个字节为网络号，最后一个字节为主机号，该类IP地址的最前面为110,所以地址的网络号取值于192-223之间，一般用于小型网络.
- `D类`: 是多播地址，该类IP地址的最前面为1110,所以地址的网络号取值于224-239之间，一般用于多路广播用户。
- `E类`: 是保留地址。该类IP地址的最前面为1111,所以地址的网络号取值于240-255之间。

### 私有地址
- A类: `10.0.0.0`-`10.255.255.255` 
- B类: `172.16.0.0`-`172.31.255.255`
- C类: `192.168.0.0`-`192.168.255.255` 

## TCP 包常见标识 
- `SYN`: 表示建立连接
- `FIN`: 表示关闭连接
- `ACK`: 表示响应
- `PSH`: 表示有data数据传输
- `PST`: 表示连接重置 

### 三次握手 
客户端发送`SYN`到服务器端表示准备建立连接，服务端响应发送`SYN+ACK`于客户端表示准备建立连接请求，客户端发送`ACK`响应表示开始传输数据 

### 四次挥手 
客户端发送`FIN`请求到服务端表示准备断开连接，同时进入`FIN_WAIT_1`状态下，服务端接收到`FIN`后发送`ACK`于客户端表示接收到了准备断开的响应请求，同时进入`CLOSE_WAIT`,客户端接收到了`ACK`同时进入`FIN_WAIT_2`，服务端再次发送`FIN+ACK`于客户端表示我也准备断开请求了，同时服务端进入`LAST_ACK`,客户端在接收到`FIN+ACK`后发送`ACK`到服务端，表示我已经接收到服务端确认并准备关闭连接，服务端接收到客户端`ACK`后直接关闭，客户端在发送后进入`CLOSE_WAIT`并等待2个报文长度时间(默认30秒)后关闭连接。



---

> 作者: [0x5c0f](https://blog.0x5c0f.cc)  
> URL: https://blog.0x5c0f.cc/posts/linux/osi%E4%B8%83%E5%B1%82%E6%A8%A1%E5%9E%8B/  

