目录
IP协议格式

4位版本号: 4/6 表示:ipv4、ipv6。
开发阶段一般用的是IPV4,IPv6 的近几年才多起来的
**4位首部长度:**以 4 字节为单位描述报头大小,IP 报头最大为 60B,最小为20B。
**8位服务类型:**决定了 IP 协议的工作方式
3位优先权字段(已经弃用),1位保留(暂未使用),4位服务类型。
4位服务类型:最小成本,最高可靠性,最大吞吐率,最小延时。
**16位数据报长度:**一个IP数据报长度 = 报头 + 载荷的长度,最大为64kb
与UDP不同的是,IP协议内置了拆包组包功能
比如,IP携带一个比较大的TCP数据报,IP协议就会自动拆成多个,通过多个IP数据报共同传输一个TCP数据报
**16位分片标识:**标识当前分片属于哪个原始报文。
拆包:把拆出来的多个包,设为相同的标识
组包:把相同标识的数据包组合到一起
**3位标志:**1位保留,1位表示是否触发了拆包操作,1位表示当前包是否是最后一个
**13位分片偏移:**标识当前分片在原始报文中相对起始的偏移量,用于描述先后顺序(偏移小的放前面,大的放后面)
通过这三个属性就可以完成拆包和组包
如果基于UDP实现传输超过64KB的数据,该怎样设计??
参考IP的方案:在应用层协议中,指定标识符,指定片偏移,指定标志位
**8位TTL:**一个IP数据报,能够在网络上传输的最大时间(报文生命周期)单位是 "次"
IP 数据报每次经过一个路由器转发一次,TTL的值就 -1。TTL减到 0,就说明数据包到不了,就要被丢弃掉
比如发了一个错误的数据包(目的IP写错了)这个包是注定不可能到达的
**8位上层协议类型:**标识上层(传输层)使用哪种协议
传输层到应用层 => 端囗号
网络层到传输层 => 8位协议
数据链路层到网络层 => 也有一个类似的协议编号的
**16位首部校验和:**校验首部数据的一致性
载荷部分自然由 tcp / udp 自行校验
**32位源端IP&32位对端IP:**描述通信的起点与终点主机
IP地址本质上是通过32位的整数来表示的
由于32位整数不方便阅读,通常会把IP写作点分十进制表示方式。用三个点,分出四个部分
例如:192.168.100.98
**选项字段:**不定长,最多 40 字节,此处不作介绍
NAT技术
希望IP地址是唯一值,但 32 位IP地址,只能表示42亿9千万个不同的IP,IP不够用了怎么办呢?
- 动态分配:IP上网再分配,不上网就不分配
有所缓解,但不能根本上解决问题
- NAT机制网络地址转换 [当前网络世界的最主要的方式]
把所有的IP分成两个大类
1)公网IP / 外网IP(是唯一的)
2)私网IP / 内网IP(私网IP在不同的局域网中,可以重复)
10.*
172.16-172.31.*
192.168.*
这三种情况的IP地址都是私网IP,其他情况都是公网IP
- IPv6 [终极方案]
IPV4是使用4个字节作为IP地址;IPv6是使用16个字节作为IP地址
128 个 bit -> 2^128 天文数字
哪怕把整个地球,每一粒沙子分配一个IPv6地址,都是绰绰有余的
目前的现状:全世界,IPv6的普及程度,非常低
中国是IPv6普及程度最高的国家(没有之一),达到80%左右的覆盖程度
NAT背景下,网络通信如何进行的?
- 同一个局域网下,设备A访问设备B
由于IP本身不允许重复,自然不受任何影响,NAT不起到作用
- 公网设备A访问公网设备B
由于公网IP本身也不重复,也不受到影响,NAT不起作用
- 不同局域网,设备A访问设备B
NAT机制禁止这样的访问方式
- 局域网设备A访问公网设备B
通过网络地址映射的方式
- 公网设备A,尝试访问内网设备B
NAT机制禁止这样的访问方式
网络地址映射

- NAT路由器将源地址10.0.0.10替换成全局的IP 202.244.174.37
- 在NAT路由器内部,会维护IP地址+端口号转换的表------NAPT转换表
- NAT路由器收到外部的数据,会根据NAPT转换表,把目标IP从202.244.174.37替换成10.0.0.10
- 当10.0.0.10第一次向163.221.120.9发送数据时就会产生NAPT转换表中的映射关系
当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(NAT),将数据包中的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。
在进行 NAT 转换时,路由器会将源 IP 地址+端口号替换为它自己的公网 IP 地址+端口号,并在其 NAPT 转换表中记录转换信息 ,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。
具体而言,当出口路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址+端口号。然后,根据NAPT转换表中的映射关系,找到对应的私有 IP 地址+端口号。接着,出口路由器会将数据包的目标 IP 地址+端口号修改为对应的私有 IP 地址+端口号,并将数据包发送到局域网内的相应主机。
为什么转换表中不仅转换IP地址,还转换端口号?
这是因为可能存在同一局域网不同主机访问同一外网服务器的同一端口号服务
正如上图,10.0.0.10和10.0.0.11同时想访问202.244.174.37:80。
如果只转换IP地址,那么这两台主机转换后的数据包其中源IP地址都是NAT路由器的IP地址。当服务器返回响应时,只有NAT路由器的IP地址吗,两台主机的端口号又相同,无法区分这个响应是给哪台局域网主机的。所以还需要转换端口号来区分不同主机
端口号不止用来区分,同一个主机上的不同程序,也可以用来区分不同主机上的不同程序
内网穿透(NAT穿透)
NAT技术保证内网主机的安全性
**NAT技术不仅极大程度缓解了IP地址不足的问题(甚至解决了),还保证了局域网主机的安全性。**如果想从外网访问内网主机,如果内网主机没有对该外网IP进行过数据通信,那么NAT路由器的NAPT转换表中没有响应的映射关系,即使外网主机将数据发送给NAT路由器,NAT路由器也不会将该数据转发给局域网主机,因为NAPT转换表没找到映射关系
但这并不代表无法从外网访问内网主机。从外网访问内网主机的方式就是内网穿透(NAT穿透)
内网穿透是一种网络技术,内网穿透通常用于实现两个不同局域网之间的通信,或者公网向内网的通信。当两个局域网之间由于网络隔离或安全限制而无法直接通信时,可以使用内网穿透技术来建立一条安全的通道,使得两个局域网中的设备可以相互访问和通信。
常见的内网穿透技术包括端口映射、反向代理和虚拟专用网络(VPN)等。
- 端口映射:通过在路由器或防火墙上设置端口映射规则,将公网上的某个端口映射到私有网络中的设备,从而实现对该设备的访问。
- 反向代理:在公网上搭建一个反向代理服务器,当公网用户请求访问时,反向代理服务器会将请求转发到内网中的目标设备上,并将响应返回给公网用户。
- 虚拟私人网络(VPN):通过建立加密隧道,将公网用户连接到私有网络中,使得公网用户可以像在内网中一样访问内网设备或服务。
- 第三方工具:一些第三方工具提供了方便的内网穿透功能,例如ngrok,frp等。这些工具通过建立安全的通道,将公网请求转发到内网服务
这些技术都可以实现内网穿透,但具体选择哪种方式取决于实际需求和网络环境。需要注意的是,在使用内网穿透技术时应确保网络安全,采取适当的安全措施来保护内网设备和数据的安全性。
网段划分
网络号和主机号
IP 地址分为两个部分,网络号和主机号:
网络号:保证相互连接的两个网段(子网)具有不同的标识。
主机号:同一个网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
同一个局域网中,网络号必须相同,主机号必须不同;两个相邻的局域网中,网络号必须不同,主机号无限制
子网(Subnet)是通过子网掩码将一个IP网络划分为多个逻辑子网,目的是优化地址管理和提升网络性能。

如上图所示,上半张图主机的 IP 地址前半部分都是 192.168.128,叫做该网段的网络号(网络标识),表示这些主机属于同一个子网中, 在该子网中增加主机,则这台主机的网络号和该子网的其他主机网络号一致,但是主机号必须不能和子网中的其他主机重复。
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。手动管理子网内的 IP 是一个相当麻烦的事情。
有一种叫做 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一种基于 UDP 的应用层协议,主要是用于自动为网络中的设备分配 IP 地址及相关网络参数,避免手动配置的繁琐和地址冲突问题。通常由路由器或专用服务器担任。
当一台主机接入网络之后,使用该技术使其自动获取 IP,断开网络之后 IP 地址可回收再利用。
子网掩码
IP地址中哪个部分是网络号,哪个部分是主机号是可以配置的。子网掩码是当前网段划分的方式
子网掩码也是一个32位的整数
左半部分都是1,右半部分都是0,不会出现 0 1 交错的情况,1 的部分就表示了哪些 bit 位是网络号
例如:255.255.0.0 表示前16位是网络号
家用网络,一般都是 255.255.255.0 也可以简写作 192.168.100.98/24(24表示前24位是网络号)

特殊的IP地址
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网(例如 192.168.100.0)
所以在局域网中,不能直接把主机号设为0,因为这个号是特殊的,不能分配给主机
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包(例如 192.168.100.255)
往广播地址上发送数据包就会被转发给局域网中的所有设备
- 127.* 的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
环回IP,无论本机真实的 IP 是多少,都可以写作127.0.0.1作为代表
在实际组网中,我们一般习惯把主机号为1的 ip(例如 192.168.100.1)作为网关IP网关:网络的入口/出口
家庭网络中,网关一般就是路由器;大型的企业/网络结构,网关通常是单独的物理设备
路由转发
路由器是集连多个子网的设备,子网内的主机如果要访问公网的服务器,其数据需要路由器转发到公网。这就是路由转发
数据在路由过程中,实际是一跳一跳的(Hop by Hop) "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间

IP数据包的传输过程也和问路一样
- 当IP数据包,到达路由器时,路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;
- 依次反复,一直到达目标IP地址;
那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表;

路由器的查找结果可能有以下三种:
- 路由器经过路由表查询后,得知该数据应该跳到哪一个子网
- 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
- 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。
