chore: add

This commit is contained in:
FallenYing
2023-10-11 23:24:20 +08:00
parent d5b500e8d9
commit c810fd1647
18 changed files with 277 additions and 264 deletions

View File

@@ -1,12 +1,12 @@
# IP协议
# IP 协议
> Author: 柏喵樱
>
>
> copyright reserved
## IP 协议数据包结构
IP 协议是网络层最主要的协议几乎所有的上层数据包都需要IP协议的承载我们网络层的第一块内容将从 IP 协议讲起。
IP 协议是网络层最主要的协议,几乎所有的上层数据包都需要 IP 协议的承载,我们网络层的第一块内容将从 IP 协议讲起。
下图展示了 IP 协议的报文头部格式,这张图每行代表 32 个 bit也就是 4 个字节byte。如果不计算 Options 这种可选项的话IP 协议的报头长度为 20 个字节。
@@ -30,13 +30,14 @@ IP 协议是网络层最主要的协议,几乎所有的上层数据包都需
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Example Internet Datagram Header
</pre>
## 版本
第一个字段是IP协议版本号用于标识IPv4IPv6两个版本这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
第一个字段是 IP 协议版本号,用于标识 IPv4IPv6 两个版本,这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
## IHLInternet Header Length
## IHL (Internet Header Length)
就是IP协议的头部部分的长度单位是 4byte由于 IP 头一般长度为 20byte所以这个值一般为 5。如果存在Options字段这个值会相应增加。
就是 IP 协议的头部部分的长度,单位是 4byte由于 IP 头一般长度为 20byte所以这个值一般为 5。如果存在 Options 字段,这个值会相应增加。
## Type of Service
@@ -46,7 +47,7 @@ IP 协议是网络层最主要的协议,几乎所有的上层数据包都需
Total Length 很好理解就是包括 IP 头在内的 IP 报文的总长度,报文长度上限就是 MTU。
## Identification & Flags & Fragment Offset
## Identification & Flags & Fragment Offset
这三个字段放在一起讲,他们都是用于控制分片的。
@@ -61,17 +62,17 @@ Total Length 很好理解就是包括 IP 头在内的 IP 报文的总长度,
对于第二个问题,引入了 Fragment Offset分片偏移量他的单位是 byte用于标识这一个分片的数据是从原来超长负载的哪个位置开始的。比如对于一个长度为 5000 bytes 的负载,他的几个分片的 Fragment Offset 依次为 0,1480,2960,4440。在收到数据后服务器只需要按照这个字段重新组装即可。
对于第一个问题,引入了 Flags标志位, Flags 里有三个 Flag其中最后一位的意义是“后面还有更多分片“这就相当于告诉服务器你要继续等待接收其他分片。而当最后的分片抵达时服务器在知道这是最后的分片的同时他也能从这个分片的 Fragment Offset里得知前面应该有多少数据如果缺失服务器也能继续等待接收。
对于第一个问题,引入了 Flags标志位, Flags 里有三个 Flag其中最后一位的意义是“后面还有更多分片“这就相当于告诉服务器你要继续等待接收其他分片。而当最后的分片抵达时服务器在知道这是最后的分片的同时他也能从这个分片的 Fragment Offset 里得知前面应该有多少数据,如果缺失,服务器也能继续等待接收。
关于Flags的其他两位最高位是目前保留不使用永远为0。后面那位的意义是不要分片这一般是不设置的他这句话是对传输过程中的路由设备讲的因为如果途径 MTU 低于当前包长度的链路可能会进行二次分片。如果设置了这个 Flag转发时再碰到 MTU 低的链路这种包会被直接丢弃同时返回一个 ICMP 包告诉源IP地址的设备发生了什么。
关于 Flags 的其他两位,最高位是目前保留不使用,永远为 0。后面那位的意义是不要分片这一般是不设置的他这句话是对传输过程中的路由设备讲的因为如果途径 MTU 低于当前包长度的链路可能会进行二次分片。如果设置了这个 Flag转发时再碰到 MTU 低的链路这种包会被直接丢弃同时返回一个 ICMP 包告诉源 IP 地址的设备发生了什么。
## TTL(Time To Live)
TTL 是一个unsigned int代表数据包的剩余生存时间指的是数据包在互联网中还能转发多少时间单位是秒。
TTL 是一个 unsigned int代表数据包的剩余生存时间指的是数据包在互联网中还能转发多少时间单位是秒。
虽然单位是秒,但是一般情况下转发耗时是远远低于一秒的,根据 IP 协议的规定无论转发耗时多少TTL 应当至少 -1所以在实践中 TTL 往往指的是转发了几次。
一般发往互联网的数据包初始 TTL 为 64 或 128你可以试试 ping 命令他会显示一个TTL这是对面服务器回复的包到自己的设备的时候的 TTL。
一般发往互联网的数据包初始 TTL 为 64 或 128你可以试试 ping 命令,他会显示一个 TTL这是对面服务器回复的包到自己的设备的时候的 TTL。
```powershell
PS C:\Users\bs> ping baidu.com
@@ -107,7 +108,7 @@ PS C:\Users\bs> ping baidu.com -i 2
traceroute 就是利用这个性质来实现的,通过从 0 开始遍历 TTL 的方式,可以拿到转发过程中的所有路由器的 ICMP 回复,从这些回复中可以读取到这些路由器的 IP。
当然 traceroute 不是万能的,真实互联网中广泛存在拦截,不响应 ,改写等等行为,会导致 traceroute 产生丢失或者藏跳等等比较迷惑的结果。
当然 traceroute 不是万能的,真实互联网中广泛存在拦截,不响应,改写等等行为,会导致 traceroute 产生丢失或者藏跳等等比较迷惑的结果。
```powershell
PS C:\Users\bs> TRACERT.EXE bilibili.com
@@ -164,8 +165,7 @@ PS C:\Users\bs> TRACERT.EXE bilibili.com
注意,由于 TTL 在每次转发中都会改变,所以实际上,每次转发都会重新计算校验和。
## IP地址
## IP 地址
正如上图的 `Source Address``Destination Address` 字段所展示的一样,一个 IP 地址占用 4 byte 的存储空间。在书面的写法上,我们用 `.` 将每一个 byte 分割开,例如 `1.1.1.1` 这样更便于人类处理和分类。
@@ -177,9 +177,8 @@ PS C:\Users\bs> TRACERT.EXE bilibili.com
可选参数Options比较繁琐一般没啥用有兴趣的可以看看下面参考资料中 RFC 791 对此的描述。
## 参考资料
- [RFC 791 - Internet Protocol (ietf.org)](https://datatracker.ietf.org/doc/html/rfc791)
- [Reserved IP addresses - Wikipedia](https://en.wikipedia.org/wiki/Reserved_IP_addresses)
- [List of IP protocol numbers - Wikipedia](https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)
- [List of IP protocol numbers - Wikipedia](https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers)