chore: add
This commit is contained in:
@@ -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协议版本号,用于标识IPv4和IPv6两个版本,这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
|
||||
第一个字段是 IP 协议版本号,用于标识 IPv4 和 IPv6 两个版本,这两个版本的报文格式是不同的。上图展示的是 IPv4 的报文格式
|
||||
|
||||
## IHL(Internet 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)
|
||||
|
||||
Reference in New Issue
Block a user