IP 协议
1)地址管理 针对网络上的各种设备,所在的位置,进行描述和区分 => IP 地址
2)路由选择 网络结构非常复杂 挑选出合适的路径
先认识 IP 协议的报文结构
有点像 TCP/UDP 的报文结构

ipv4,ipv6 其他版本没有大规模推广使用

IP 协议中,报头也是变长的(包含选项的)
0 - 15单位 4 字节, IP 报头的最大长度 60 字节

其中只有 4 位是有效的
最小延时: 发送时间和收到数据的时间尽量短
最大吞吐量: 单位时间内传输的数据尽可能的多
最高可靠性: IP 本身并不考虑可靠性在 IP 层面上尽量减少丢包的概率
最小成本: 消耗的系统资源最少

IP 数据包, 报头 + 载荷 总长度
对于单个 IP 数据报来说,是的.但是,如果需要在 IP 数据报中携带超过 64KB 的载荷数据的时候, IP 协议也是可以做到的
IP 协议自身也是支持拆包/组包
如果传输层数据包太长了,IP 自动拆成多个,每个 IP 数据报,负责携带一部分传输层数据包
UDP 来说,载荷太大了,G了,除非应用层,自己写代码实现拆包和组包

长度超出64KB 一个IP 数据报就自动拆包
接收方收到这些IP数据报就能把载荷组装到一起,拼接成完整的 TCP 数据报
上述的拆包组包的过程是如何实现的呢?

16位标识位:拆出来的多个 IP 数据报标识是相同的
3位标识位:有一位不用,有一位表示当前是否触发了拆包,有一位表示这个IP数据报是否是最后一个数据包

当前的 IP 数据报能够在网络上存活多久
初始情况下是一个 32/64/128单位不是"时间"而是"次数"
数据报每次经过路由器转发一次,TTL -= 1,如果TTL为 0 了,要没有到达对方,就可以认为包永远也到不了了,就可以丢弃了。
tracert www.xxx.com 通过这个命令可以追踪,中间的转发节点都有哪些
进行 IP 数据报转发的时候,必须要根据目的 IP,进行转发,万一数据报中的目的 IP 是错误的,此时这个数据包是不可能到达对方的,也不应该在网络中被"无限的转发"
六度空间理论

类似于 TCP/UDP
描述的是当前的 IP 数据报,载荷部分,是使用的那个协议(传输层协议)
协议类型
接收的时候,分用的时候,就需要知道当前数据包载荷是使用那种协议
传输层的协议中,"目的端口"就解决了这个问题(解决了 传输层的数据包载荷,交给应用层的哪个协议(应用程序)来处理)
网络层的协议中,"8位协议"区分载荷交给传输层的哪个协议来处理

计算校验和,本身都是需要有开销的,IP协议只关心 IP 报头自身是否出现传输错误,载荷部分的传输层数据,自然有 TCP/UDP负责校验

IP 地址,标识了网络上某个设备所处的位置
IP 地址采用点分十进制的标识,通过 三个点,把一个 IP 地址分成 4 个部分,每个部分 1个 字节,每个部分的取值 0-255,站在计算机的角度,识别/存储 IP 地址,直接使用 32 位的整数进行
理论来说,需要给不同的设备分配不同的 IP (IP 地址应该是唯一的)
32位的整数,表示的范围有多大?(0 - 42亿9千万)
IP 地址不够用怎么办?
1.动态分配 IP 地址(上网在分配,不上网就先不分配)
早期,IP 地址不是很紧张的时候,是可行的
后来,IP 地址紧张程度进一步提升了
2.NAT 机制(网络地址映射)【核心方案】
把所有的 IP 分成两个大类
1)外网 IP / 公网 IP
1)内网 IP / 私网 IP
a)10.*
b)172.16 - 172.31.*
c)192.168.*
家用路由器,一般都是 192.168 开头的内网 IP,局域网内部使用的(保证内网 IP 在一个局域网中不重复即可)
不再是每个设备都有唯一的 IP 地址了,允许不同的局域网,设备的 IP 地址相同
在 NAT 机制下网络转发的情况,有 两个设备 A B
1)如果 A 和 B 都在同一个局域网中
直接按照 IP 地址进行转发即可(同意个局域网,即使是内网 IP,也不会重复)
2)如果 A 和 B 是在两个不同的局域网中,禁止直接传输
3)如果 A 是内网 IP 设备,B 是外网 IP 设备
A 主动访问 B 是可以的
B 不能主动去访问 A(但是如果 A 已经去访问过 B 了,此时 B 就沿着原来返回的路找到 A)
4)如果 A 是外网 IP,B 也是 外网 IP,也不涉及 NAT 直接转发即可

红色的方框:转发的过程中,涉及到的某个路由器是带有公网 IP 的(NAT 设备,运营商提供的路由器)

NAT 相当于把网络传输分成两个阶段
1)局域网内部的转发(使用局域网 IP 进行)
2)公网上的转发(使用公网 IP 进行)
NAT 解决了 IP 地址不够用的问题
这样的替换,本质上是让一个局域网内部的所有设备,公用同一个 外网 IP(本来是一个外网 IP 代表一个设备,现在是一个外网设备代表数以千计个设备(和真实世界的地址类似))
比如我的电脑现在在访问CSDN的服务器,我的平板也在访问CSDN,这两台设备是在同一个局域网,公用一个外网 IP(运营商路由器)
CSDN 的服务器,如果区分,收到的数据,是我电脑这边的客户端数据,还是我的平板的客户端数据,返回响应的时候,运营商路由器,怎么区分,把正确的包转发给正确的设备???
解决上述的问题,引入端口号作为区分(引入端口号辅助映射的过程,称为 NAPT,NAT 补充)
之前端口号是用来区分同一个主机上的不同程序,也可以让端口号来区分不同主机上不同程序
NAT 主要出现在内网设备和外网设备交互过程中,必须内网设备(客户端)主动去访问外网设备(服务器)
想让外网设备(客户端)来访问内网设备(服务端)也是可以做到的(内网穿透)