作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

目前几乎所有的应用都会跟网络打交道,所以我们了解和熟悉网络对我们后续的排错是很有必要的,我这里讲解的部分主要是我个人理解来进行讲解。
上个小节介绍的OSI7层模型,在实际上可能只有面试的人会问到(属于面试八股文),在实际环境中,我们一般是TCP/IP五层模型或者TCP/IP四层模型,这里四层就是把数据链路层和物理层合并。因为TCP/IP是我们整个协议的最核心协议。
下图来源于网络

数据链路层&物理层
数据链路层通信是内网通信的关键,他们不依赖网络设备,最简单的连接方式就是2台电脑可以通过网线直接组网。在早期的电脑和电脑通信使用的交叉线,电脑和其他网络设备则使用直连线(线都是不通用),当然目前新设备已经没有这个问题。在这里传输的数据是帧&比特流。
报文格式
核心是MAC地址
+-------------------+-------------------+-------------------+-------------------+-------------------+
| 目的MAC地址 (6B) | 源MAC地址 (6B) | 类型/长度 (2B) | 载荷 (46-1500B) | FCS校验 (4B) |
+-------------------+-------------------+-------------------+-------------------+-------------------+
例: 00:11:22:33:44:55 例: AA:BB:CC:DD:EE:FF 0x0800=IPv4 承载IP报文 循环冗余校验网络层
网络层的核心就是IP地址,包括源IP地址,就是发起请求方,目标IP地址,就是响应方,简单理解就是机器对机器。
+--------+--------+-----------+----------------+---------------+
| 版本(4b)| IHL(4b)| 服务类型(8b)| 总长度(16b) | 标识(16b)|
+--------+--------+-----------+-----+----------+---------------+
| 标志(3b)| 片偏移(13b) | TTL(8b)| 协议(8b) | 头部校验和(16b)|
+---------------------+--------+--------+--------------------+-+
| 源IP地址 (32b) (例: 192.168.1.1) |
+--------------------------------------------------------------+
| 目的IP地址 (32b) (例: 10.0.0.1) |
+--------------------------------------------------------------+
| 选项 (0-40B) | 数据 (载荷,承载TCP/UDP报文) |
+--------------------------------------------------------------+传输层
传输层的核心IP+端口+协议,也是我们常说的5元组(源端口,源IP,协议,目标IP,目标端口),如果去掉协议就是4元组。这里就是进程对进程(比如我用curl命令请求某个网站)。
传输层的协议核心就是TCP协议/UDP协议。
TCP报文
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口(16b) | 目的端口(16b) |
| (例: 54321) | (例: 80) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号(32b) |
| (例: 123456789) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号(32b) |
| (例: 543210987) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移(4b)| 保留(6b)| 标志位(6b)| 窗口大小(16b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和(16b) | 紧急指针(16b) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(0-40B) |
| (如MSS、时间戳、窗口缩放等) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
| (上层应用数据,可变长度) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+UDP报文
udp协议简单,所以他的效率比tcp高,但是他是不可靠协议。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口(16b) | 目的端口(16b) |
| (例: 54321) | (例: 53) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| UDP长度(16b) | UDP校验和(16b) |
| (头部+数据的总字节数) | (可选,0表示不校验) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
| (上层应用数据,可变长度) |
| (例: DNS查询、DHCP请求、视频流) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+应用层
应用层协议最简单的就是具体应用,比如下面的http请求和返回。
请求报文
+---------------------------------------------------------------+
| 请求行(Request Line) |
| +-----------------------------------------------------------+ |
| | 方法 | 空格 | URL | 空格 | 版本 | 换行符(\r\n) | |
| | (GET) | |/index.html| |HTTP/1.1| | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| 头部(Headers) |
| +-----------------------------------------------------------+ |
| | Host: www.example.com\r\n | |
| | User-Agent: Mozilla/5.0\r\n | |
| | Accept: text/html,application/xhtml+xml\r\n | |
| | Accept-Language: zh-CN,zh;q=0.9\r\n | |
| | Accept-Encoding: gzip, deflate\r\n | |
| | Connection: keep-alive\r\n | |
| | 空行(\r\n) | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| 消息体(Body) |
| +-----------------------------------------------------------+ |
| | (GET请求通常没有消息体) | |
| | POST请求时会有: | |
| | username=admin&password=123456 | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+返回报文
+---------------------------------------------------------------+
| 状态行(Status Line) |
| +-----------------------------------------------------------+ |
| | 版本 | 空格 | 状态码 | 空格 | 状态描述 | 换行符(\r\n) | |
| |HTTP/1.1| | 200 | | OK | | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| 头部(Headers) |
| +-----------------------------------------------------------+ |
| | Server: nginx/1.18.0\r\n | |
| | Date: Mon, 04 Mar 2024 10:00:00 GMT\r\n | |
| | Content-Type: text/html; charset=UTF-8\r\n | |
| | Content-Length: 1234\r\n | |
| | Last-Modified: Mon, 04 Mar 2024 09:00:00 GMT\r\n | |
| | Connection: keep-alive\r\n | |
| | Content-Encoding: gzip\r\n | |
| | 空行(\r\n) | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+
| 消息体(Body) |
| +-----------------------------------------------------------+ |
| | <!DOCTYPE html> | |
| | <html> | |
| | <head> | |
| | <title>Example Page</title> | |
| | </head> | |
| | <body> | |
| | <h1>Hello, World!</h1> | |
| | </body> | |
| | </html> | |
| +-----------------------------------------------------------+ |
+---------------------------------------------------------------+