一.IP知识引入
引入:
- IP协议的本质工作是:提供一种能力,将数据跨网络从主机A送到主机B!
- 但用户真正需要的是:提供一种能力,将数据可靠地跨网络从主机A送到主机B 。而IP协议只负责尽力而为地传输 ,不保证可靠性、不保证顺序、也不保证不重复。
而我们之前学习 TCP 时所说的"C → S"通信,其实是逻辑上的端到端视角 ;而真实传送数据的时候是从上往下封装 ,然后发送给对方,然后对方再从下往上解包! 讲这个的主要原因就是说网络层它是封装应用层、传输层处理的内容 ,因为有了传输层TCP的帮助才能实现将数据可靠地跨网络从主机A送到主机B
前置知识:
**IP种类:**私有IP,公网IP
IP组成:目标网络 + 目标主机(因此所有计算机就要有IP地址)
二.IP相关知识
2.1 IP格式
基础知识讲解:
- 4位版本号(version): 指定IP协议的版本, 对于IPv4来说,,就是4。
- **4位首部长度:**和TCP那个一样的概念
- 8位服务类型: 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本.。这四者相互冲突, 只能选择一个,如今多基于 DSCP 做 QoS 策略。
- 16位总长度: IP数据包整体占多少个字节(包括报头和数据)
- 8位生存时间(TTL): 数据报到达目的地的最大报文跳数.。一般是64,每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
- 8位协议: 表示上层协议的类型
- 16位头部校验和: 使用**Internet Checksum(网际校验和)**进行校验, 来鉴别头部是否损坏.
- 32位源地址和32位目标地址: 表示发送端和接收端。
重要问题:
**报头和有效载荷如何分离:**固定长度(20)+ 自描述字段(16位总长度)
**如何将有效载荷交付给上层:**8位协议
编写socket需要IP+端口,其中端口是给传输层,而IP是给网络层
2.2 网络划分
1.引入:
IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
要点:
路由器本质也是一个子网的设备,所有需要网络通信的设备其实都要ip地址(路由器可以配置多个IP,且需要配置2个以上的ip地址)
路由器一定至少要连接2个子网,路由器也就相当于同时在两个子网。
路由器一般是子网中的第一台设备,一般他的IP地址都是:网络号.1
**路由器功能:**ip报文的转发,连接存在的子网(局域网)
2.网络划分:
A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255
随着Internet的飞速发展,这种划分方案的局限性很快显现出来
例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多。
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了。
3.CIDR:
CIDR (无类别域间路由,Classless Inter-Domain Routing)
采用 "IP地址/前缀长度" 的表示法(如192.168.1.0/24),允许网络前缀长度任意指定 ,从而彻底摆脱了传统的 A/B/C 类地址的固定划分限制。子网掩码也是一个32位的正整数
将IP地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
4.特殊IP地址
将 IP 地址中主机部分的所有位设为 0 ,得到的地址称为 网络地址 (或网络号),用于标识一个子网本身。
将 IP 地址中主机部分的所有位设为 1 ,得到的地址称为 受限广播地址 ,用于向该子网内的所有主机发送数据包。
整个
127.0.0.0/8地址块 (即127.0.0.0~127.255.255.255) 都保留用于本机环回测试;
2.3 私有IP地址和公网IP地址
1.私有IP地址介绍
10.0.0.0
~10.255.255.255172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255
其余IP皆为公网IP
2.对运营商的了解
- 用户通过互联网服务提供商 (ISP,即"运营商")接入 Internet。在光纤宽带等常见家庭接入场景中,光猫 (ONT,一种专用调制解调器)负责将光纤中的光信号转换为标准的以太网数字信号 ;随后,路由器接收该数字信号,完成内网 IP 分配、NAT 转换和路由转发,使多台设备共享上网。
3.路由器的两类账号密码
Wi-Fi 名称与 Wi-Fi密码
用于家庭无线设备连接,与运营商无关,可自行设置。
运营商认证凭证
通常是 PPPoE 账号/密码(由运营商提供,印在工单或路由器背面);用于向 ISP 证明"你是合法用户",完成身份认证后才能获得公网 IP 并上网;是你办理宽带时分配的唯一账户。
4.访问数据的场景讲解
一个路由器至少配置两个IP地址分别是: WAN口IP,LAN口IP(子网IP)。
路由器LAN口连接的主机, 都属于当前这个路由器的子网。
不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1);子网内的IP地址不能重复。但是不同子网的IP地址可以重复了
每一个家用路由器,其实又作为运营商路由器的子网中的一个节点;这样运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP一定是一个公网IP了。
子网主机访问外网时,家用路由器先做 NAT,将源 IP(如
192.168.1.100)替换为 WAN 口 IP。若 WAN 口是公网 IP,则直接进入运营商网络;
若 WAN 口不是公网IP,运营商边缘设备会再次 NAT ,将其映射为公网 IP。 原始私有 IP(192.168.x.x)不会离开家庭网络。
如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。
我们上网时,报文通过运营商网络转发至目标服务器。如果访问外网被阻断,通常是因为运营商根据国家监管要求或自身策略,对特定流量实施了过滤或路由限制(这就是所谓的墙)
2.4 路由
路由引入:
在复杂的网络结构中, 找出一条通往终点的路线!
路由的过程,就是这样一跳一跳(Hop by Hop)"问路"的过程。所谓"一跳",指的是网络层中从一个路由器到下一个路由器(或最终主机)。
在以太网中,每一跳的数据传输由数据链路层负责,通过源 MAC 地址与目的 MAC 地址完成帧的交付。
IP数据包的传输过程也和问路一样:
当IP数据包到达路由器时,路由器会先查看其目的IP地址;
路由器根据自身的路由表 判断: 如果目的IP属于本地直连子网 ,则直接通过ARP获取目标主机的MAC地址,并将数据帧发给它;否则,将数据包转发给下一跳路由器(即路由表中指定的下一跳网关);
此过程在每一跳重复进行,直到数据包最终抵达目标主机所在的网络并被交付。
路由表中通常包含一条 缺省路由 (
0.0.0.0/0),当目的地址与所有其他路由条目都不匹配时,就使用缺省路由将数据包发往默认网关 ------即与本机处于同一子网的三层设备(如家用路由器、三层交换机)。要点:
实际上,在一台主机中,IP 层并不会直接把报文"发出去",而是将 IP 数据包交给下一层------数据链路层。
而数据链路层受限于物理介质和网卡硬件,无法传输任意大的帧 ,因此定义了最大传输单元(MTU,如以太网默认为 1500 字节)。
这就要求上层(IP 层)不能交付超过 MTU 的数据包;若上层协议(如 TCP)试图发送过大的数据,IP 层会进行分片(或由 TCP 自行控制段大小,避免分片)。
所以,TCP 滑动窗口虽然可以累积大量数据,但实际发送时仍需按 MSS (Maximum Segment Size),而 MSS 正是由 MTU 减去 IP 和 TCP 首部长度决定的------根源正是数据链路层的硬件限制 (如网卡和以太网标准)。
2.5 IP报头剩余介绍
**16位标识(id):**唯一的标识主机发送的报文. 如果IP报文在网络层层被分片了, 那么每一个片里面的这个id都是相同的
3位标志字段: 保留处理 。中间(DF)为1表示禁止分片(0是允许分片) ,这时候如果报文长度超过MTU,IP模块就会丢弃报文。后(MF)表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1。类似于一个结束标记
**13位分片偏移:**是相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
原始 IP 报文:20B 首部 + 3000B 数据
→ 分片1:20B 首部 + 1480B 数据(偏移=0,MF=1)
→ 分片2:20B 首部 + 1480B 数据(偏移=185 → 1480/8=185,MF=1)
→ 分片3:20B 首部 + 40B 数据(偏移=370 → 2960/8=370,MF=0)
分片的相关知识:
- 如何组装: 接收端根据 源IP、目的IP、协议号、ID 四元组识别属于同一原始报文的所有分片,按 分片偏移 从依次拼接数据部分,直到收到 MF = 0 的最后一个分片,完成重组。
- 为什么分片: 因为数据链路层有 MTU 限制(如以太网默认 MTU = 1500 字节),因此如果超过该1500字节,那么就需要分片。
- **怎么知道一个IP是否分片:**存在分片的偏移量!= 0 || 存在分片的标志字段的MF == 1
- 丢失分片会怎么样已经我怎么知道是否丢失分片:
**丢开头:**那么你组装的时候就会发现没有偏移量为0的
**丢中间:**那么你会发现组装的时候会发现空一块(185 直接到 555 少了一个370)
**丢尾巴:**那么你会发现MF都为1,可是最后一个MF要是0
用图片来理解分片
重点:
- **分片后,只有第一个分片才会携带传输层及以上的报头,**而其他的只会携带网络层报头
- **分片的坏处:**当IP中有任何一个分片丢失,就要全部丢弃,因此不建议分片;因此是建议让TCP自己处理大小问题,这才有了我们之前在分析TCP滑动窗口的时候看到里面是有分段的,其中段是怎么分出来的就是根据MSS
今天的知识就到这里了,下一期将带来数据链路层的相关知识,本章知识都是理论部分,需要大家多多理解,最后是看完这篇继续看下篇,谢谢大家了!








