# IP


# IP及其相关协议

## ***网络层***

1. ***网络层介绍***
   
   *IP(IPv4 IPv6) 相当于OSI7层模型中的第三层-网络层 在这一层 IP和ICMP是主角*

2. ***网络层的作用***
   
   *实现点对点通信* *在第二层 数据链路层中 我们知道了在同一链路中 是通过"mac地址"来确定目标主机 进行包传递* *那在不同的链路中 就是通过第三层的"IP地址"来实现包传递*

# ***IP基础知识***

***IP总共分为三大作用模块 分别是 “寻址” “路由” “分片与组包”***

## ***IP地址的定义***

1. *ipv4由32位正整数来表示*
2. *TCP/IP要求将IP地址分配给每一个通讯的主机IP地址在计算机内部由二进制表示 但是人类社会并不习惯二进制 所以每8位分开 隔一个"." 将每组数以十进制来表示每一台主机上的每一张网卡都需要设置IP地址 所以IP地址越来越不够用*

## ***IP地址由网络和主机两部分标识组成***

1. *IP地址是由**网络地址**和**主机地址**两部分组成*
2. *实现了唯一性，网络地址在不同的数据链路中也是不相同的，如果网络地址相同则说明在同一个网段中，接下来就是通过主机地址来区分不同的主机*

## ***IP地址的分类***

***IP地址分为4类 分别为 A类 B类 C类 D类 它根据IP地址中从第1位到第4位的比特对其网络标识和主机标识进行区分***

1. ***A类地址***
   - *A类地址是首位以 "0" 开头的地址，代表着从第1位到第8位是他的网络地址，后24位为主机地址*
   - *十进制表示为：0.0.0.0 - 127.0.0.0 是A类的网络地址*
2. ***B类地址***
   - *B类地址是前两位为 "10" 的地址 代表着从第1位到第16位是他的网络地址 后16位为主机地址*
   - *十进制表示 128.0.0.0 - 191.255.0.0 是他的网络地址*
3. ***C类地址***
   - *C类地址是前三位为 "110" 的地址 代表着从第1位到第24位是他的网络地址 后8位为主机地址*
   - *十进制表示 192.0.0.0 - 223.255.255.0 是他的网络地址*
4. ***D类地址***
   - *D类地址是前4位为 "1110" 的地址 代表着从第1位到第32位是他的网络地址*
   - *十进制表示 224.0.0.0 - 239.255.255.255 是他的网络地址*
   - *D类地址没有主机标识 常被用于多播*
5. ***PS：分配IP地址 要用比特位表示主机地址时 不能全为0 或者 全为1***
   - *全部为0 代表对应的网络地址或者IP地址不可获知的情况下使用*
   - *全部为1的主机地址通常作为广播地址*

## ***广播地址***

1. ***什么是广播地址***
   - *广播地址用于在同一个数据链路层中的互相连接的主机之间发送数据包*
2. **怎么设置广播地址**
   - *将IP地址的主机位全部设置为1 就成了广播地址*
   - *比如 `172.20.0.0/16`*
     - *二进制：`10101100.00010100.00000000.00000000` -> `10101100.00010100.11111111.11111111`*
     - *十进制：`172.20.255.255`*
3. ***本地广播***
   - *在本网络的广播叫做本地广播*
   - *比如在172.20.0.0/24的情况下 广播地址为172.20.0.255*
   - *因为这个广播地址的IP会被路由器所屏蔽 所以不会到达172.20.0.0/24以外的其他链路上*
4. ***直接广播***
   - *在不同的网络的广播叫做直接广播 但是由于直接广播具有安全性的问题 所以大多数不会采用直接广播*
   - *例如网络地址为 192.168.0.0/24的主机向 192.168.1.255/24的目标地址发送IP包    收到这个包的路由器，将数据转发给192.168.1.0/24 从而使得 192.168.1.1 ~ 192.168.1.254的主机都能收得到这个包*

## ***多播***

1. ***什么是多播***
   - *多播用于将包发送给特定组的所有主机 因为是直接使用IP协议 所以也不存在可靠传输*
2. ***为什么不使用广播 而使用多播***
   - *广播会将包发送给所有的终端主机 然后由主机的上一层去判断这个包是不是他要的 所以会造成不必要的流量    而且广播无法穿透路由,想给其他的网段发送同样的包 就不得不采取另一种机制*
   - *所以多播可以穿透路由器 又可以实现只给那些必要的组发送数据包的技术就成为必选之路了*
3. ***多播的特点***
   - *多播采用D类地址 因此 如果前4位为"1110"的就可以认为是多播地址 而剩下的28位可以成为多播的组编号从 224.0.0.0 到 239.255.255.255 都是多播地址的可用范围*
   - *其中 224.0.0.0 ~ 224.0.0.255 的范围不需要路由控制 在同一个链路也可以实现多播而在这个范围之外设置多播地址会给全网所有组内成员发送多播的包对于多播，所有的主机(路由器以外的主机和终端主机)必须属于 224.0.0.1 的组，所有的路由器必须属于 224.0.0.2 的组利用IP多播实现通信*
   - ***除了地址之外 还需要IGMP等协议的支持***

## ***子网掩码***

1. ***为什么需要子网掩码***
   - *一个IP地址只要确定了其分类 也就确定了他的网络标识和主机标识    网络标识相同肯定就代表着在同一个链路内 所以对于B类地址 允许有6多万台计算机连接 实属浪费*
   - *所以一个更为灵活的组合方式 子网掩码诞生了*
2. ***子网掩码的优点***
   - *IP地址的网络地址和主机地址就并不是分的那么严格    而去由子网掩码去通过子网网络地址细分出比原来分类更小粒度的网络所以这种方式其实就是将原来的分类中的主机地址部分用作子网地址 可以讲原网络分为多个多个物理网络的一种机制*

## ***CIDR/VLSM***

```go

```

## ***全局地址与私有地址***

```go

```

# 路由控制

## ***路由控制表***

1. ***引出***
   - *我们已经在前面学习了IP地址，并且知道了靠网络地址和主机地址让每个主机都具有唯一性，那么问题就来了，我们在传递数据的时候，我咋知道目标的IP在哪里，我怎么才能去找到目标IP地址？*
   - *所以我们还需要一个类似于 "车票"的东西，那就是路由控制表*
2. ***什么是路由控制表***
   - *路由控制表记录者网络地址与下一步应该发送至路由器的地址*
3. ***维护路由控制表的方法***
   - ***静态路由控制：*** *由管理员手动去管理*
   - ***动态路由控制：*** *依靠路由器与其他路由器相互交换信息时靠路由协议去自动更新自动去更新这张表(路由协议先不讲述)*

## ***IP地址与路由控制***

*在发送IP包的时候 首先要确定IP包首部的目标地址 然后在路由控制表中找到相同网络地址的记录 然后转发至下一个路由如果有多个相同 则找一个最相同的 随后转发至下一个路由*

## ***默认路由***

1. ***引出***
   - *如果一张路由表存放着包含所有网络及其子网的信息 将会造成无端的浪费，如果只有部分 那么也有可能IP数据包的目的地址找不到*
   - *所以当我们找不到目的地址的时候 就会走默认路由*
2. ***什么是默认路由***
   - *默认路由一般标记为 "0.0.0.0/0" 或者 "default"*
   - *注意 这里的 "0.0.0.0" 并不是IP地址 因为后面是 "/0" 所以并没有标识IP地址*
   - *"0.0.0.0"的IP地址应该被标记为 "0.0.0.0/32" 而且默认路由的子网掩码也是 "0.0.0.0"*

## ***主机路由***

*"IP地址/32" 也被称为 主机路由，他的意思是整个IP地址的所有位都将参与路由主机路由，多用于不希望通过网络地址路由的情况*

## ***环回地址***

*这个就是老朋友了 127.0.0.1 或者是 localhost，环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址，数据包不会流向网络*

## ***路由控制表的聚合***

*利用网络地址的比特分布可以有效的进行分层配置对内，即使有多个子网掩码，对外呈现出的也是同一个网络地址，所以通过路由信息的聚合可以有效的减少路由表的数目 提升效率*

# IP分割处理与再构成处理

## ***数据链路不同 MTU则相异***

1. ***引出***
   - *在数据链路层，其实每次传过来的MTU是不一样的（因为每个不同类型的数据链路的使用目的不同），所以IP要为每一个数据链路还专门去适配吗?*
   - *所以IP就用了一个分割处理和再构成处理*

## ***IP报文的分片与重组***

1. ***引出***
   - *任何一台主机都需要将IP分片进行相应的处理 要不然在比较大的报文无法一下子发送出去*
2. ***分片和重组的过程***
   - *在路由器上会将IP数据包分成分片发送出去，随后在目标主机而且也只能在目标主机上重组*
3. ***为何只能在目标主机上重组***
   - *这么设计是有理由的：现实中无法保证IP数据报是否经由同一个路径传送，IP数据报拆分后是否会丢失，在当中路径中重组的话 可能在后面的路由器又会拆分，所以只能在目标主机上重组*

## ***路径MTU发现***

1. ***引出***
   - *分片拆分是在路由器上面进行拆分 但是随着科技的发展 路由器要求性能越来越高 其次如果拆分的时候 其中一个分片丢失 则所有的数据报会作废*
   - *所以诞生了路径MTU发现*
2. ***UDP 路径MTU发现工作原理***
   1. *在发送端主机发送IP数据报时将其首部的分片禁止标志位设置为1 根据这个标志位, 途中的路由器即使遇到需要分片才能处理的大包也不要分片 而是直接丢弃，随后 通过一个ICMP的不可达消息将数据链路上MTU的值给发送主机*
   2. *下一次 从发送的同一个目标主机的IP数据报获得ICMP所通知的MTU值以后 将它设置为当前MTU，然后对数据报进行分片处理 如此反复 直到没有收到ICMP 就认为MTU是一个合适的值*
   3. *ps：MTU最多可以缓存10分钟 如果超过了 就会在去路径MTU发现*
3. ***TCP 路径MTU发现***
   - *根据路径MTU的大小计算出最大段长度 然后再根据这些信息进行数据报的发送，所以在TCP上 IP不需要进行分片*

# IPv4首部

## ***IPv4首部***

***教你如何通过理解去背诵***

***`首先肯定要记录发送端主机和目标段主机IP地址`***

1. ***源地址***
   - *32bit构成，记录者发送端主机的地址*
2. ***目标地址***
   - *32bit构成 记录者接收端主机的地址*

***`IPv4首部长度肯定会有记录`***

1. ***首部长度***
   - *4bit构成 表明IP首部的大小 单位是4个字节(32bit) 对于没有可选项的IP包, 首部长度则设置为"5" 也就是说 没有可选项的IP时 IP首部为20byte*
2. ***总长度***
   - *16bit 标识IP首部与数据部分合起来的总字节数 所以说IP包最大长度 为 65536字节*

***`记录不同的数字来标识一些不同的情况`***

1. ***版本***
   - *4bit 构成*
   - *标记IP的版本号 /"4 -> ipv4" "5 -> ST" "6 -> ipv6"/ 等等*
2. ***区分服务***
   - *8bit 构成*
   - *用来表明服务质量 一般这个值都是应用指定也应该是由应用指定，但是现在一般都无视这个字段 因为在符合质量的要求的情况下按其要求发送本身的功能实现起来非常的难，现在有人提出将这个字段分为两个字段 - DSCP & ECN*
3. ***协议***
   - *8bit 构成*
   - *表示的是IP包传输层的上层协议编号，具体编号可以从特殊网站获取*

***`分片重组相关`***

1. ***标识***
   - *由16bit组成，用于分片重组，同一个分片标识相同 不同的分片标识不同*
   - *通常 每发送一个IP包 他的值也逐渐递增，此外 即使ID相同 如果目标地址 源地址 协议不同 也会被认为是不同的分片*
2. ***标志***
   - *3bit 组成 表示包被分片的相关信息*
   - *第0个bit -> 未使用 现在必须是0*
   - *第1个bit -> 表示是否进行分片  "0" 可以分片 / "1" 不能分片*
   - *第2个bit 包被分片的情况下 表示是否为最后一个包  "0" 最后一个分片的包 / "1" 分片中段的包*
3. ***片偏移***
   - *由13bit组成 用来表示被分片的每一个分段相对于原始数据的位置*
   - *第一个分片对应的值为0*
   - *由于片偏移占13bit 所以最多可以表示8192个相对位置*
   - *单位为8字节 因此最大可以表示原始数据为 "8 x 8192 = 65536"字节的位置*

***`IP包的生命周期`***

1. ***生存时间***
   - *由8bit构成 他最初的意思是以秒为单位记录当前包在网络上应该生存的期限，然而 在实际中他是指可以中转多少个路由的意思*
   - *每经过一个路由 生存时间就会-1 直到变成0则丢弃该包*
   - *可以避免IP包在网络内无限传递的问题*

***`校验和`***

1. ***首部校验和***
   - *由16bit构成 也就IP首部校验和*
   - *该字段不会校验数据部分 只会校验IP数据包不会被破坏*

***`其他`***

1. ***可选项***
   - *长度可变 通常只在进行试验或诊断时使用*
2. ***填充***
   - *再有可选项的情况下 首部长度可能不是32比特的整数倍 所以填充就是保证是整数倍的*
3. ***数据***
   - *存入数据 将IP上层协议的首部也作为数据进行处理*

# ICMP

## ***ICMP是个啥玩意***

1. ***引出***
   - *我们在架构IP网络的时候 最注意两点:    **1. 确认网络是否工作  2. 遇到异常时进行问题诊断ICMP正是提供这类功能解决这些问题的一种协议***
2. ***ICMP的功能***
   - *确认IP包是否成功送达目标地址*
   - *通知在发送过程当中IP包被废弃的具体原因*
   - *改善网络设置*
   - *...*
3. ***ICMP所以其实就是一个传递消息的***
   - *在IP通信中如果某个IP包因为某种原因未能达到目标地址 那么这个具体的原因将由ICMP负责通知ICMP这种通知消息会使用IP进行发送ICMP的消息*
   - *大致可以分为两类    **1. 通知出错原因的错误消息    2. 用于诊断的查询消息***

## ***主要的ICMP消息***

1. ***ICMP目标不可达消息***
   - *IP路由器无法将IP数据包发送给目标地址时, 会给发送端主机返回一个不可达的ICMP消息 并在这个消息显示具体原因*
2. ***ICMP重定向消息***
   - *如果路由器选择次优路径发送数据, 那么他会返回一个ICMP重定向的消息给这个主机    在这个消息中包含了最适合的路由信息和源数据*
3. ***ICMP超时消息***
   - *在IP包字段中有一个记录着IP的生存周期的字段 如果这个字段为0 则会发送一个ICMP消息给发送端主机 表示该包已经丢弃*
4. ***ICMP回送消息***
   - *用于进行通信的主机或路由器之间，判断所发送的数据包是否已经成功到达对端的一种消息    "ping" 命令就是由ICMP实现的*

## ***其他的ICMP信息***

1. ***ICMP原点抑制消息***
   - *在使用低速广域线路的情况下，连接WAN的路由器可能会遇到网络拥堵的问题    ICMP原点抑制消息可以缓和这种拥堵情况    但是会造成不公平的网络通信 所以一般不使用*
2. ***ICMP路由器探索消息***
   - *主要用于发现与自己相连网络中的路由器    当一台主机发出ICMP路由器请求时 路由器则返回ICMP路由器公告消息给主机*
3. ***ICMP地址掩码消息***
   - *主要用于主机或路由器想要了解子网掩码的情况*

## ***ICMPv6***

1. ***引出***
   - *有了ICMP 为啥还要有一个ICMPv6*
2. ***ICMPv6的作用***
   - *IPv4中的ICMP仅作为一个辅助作用支持IPv4 也就是说没有了ICMP 其实也是可以实现IP通信的*
   - *在IPv6中 ICMP的作用被扩大 如果没有ICMPv6 IPv6则就无法进行正常通信*
3. ***ICMPv6的消息***
   - *错误消息*
   - *信息消息*
   - ***邻居探索***
     - *邻居探索消息在ICMPv6中很重要    用于查询IPv6与MAC地址的关系 并由邻居宣告消息得知MAC地址*
     - *邻居探索消息利用IPv6的多播地址实现传播*

