


主机发送 IP 报文时,会给每个报文分配一个唯一的 16 位编号(这就是 “标识”),用来区分不同的报文 —— 相当于给每个包裹贴了独有的快递单号。
2.分片时的作用:
数据链路层有 “最大传输单元(MTU)” 限制(比如以太网 MTU 是 1500 字节),如果 IP 报文超过这个限制,会被拆成多个 “分片”。这时候,同一个原报文拆分出的所有分片,都会用和原报文相同的 id,接收方靠这个相同的 id,就能把这些分片重新拼回原来的完整报文。
点分十进制是IPv4 地址的标准表示格式
11111111,对应十进制 255);IP地址分为两个部分,网络号和主机号
• 网络号:保证相互连接的两个网段具有不同的标识;
• 主机号:同⼀网段内,主机之间具有相同的网络号,但是必须有不同的主机号;

• 不同的子网其实就是把网络号相同的主机放到⼀起.
• 如果在子网中新增⼀台主机,则这台主机的网络号和这个子网的网络号⼀致,但是主机号必须不能和 子网中的其他主机重复.

因为公网 IP 数量有限,不够每个设备分,所以用 NAT(网络地址转换)让一个公网 IP 对应多个内网设备:
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同. 那么问题来了,手动管理子网内的IP,是⼀个相当麻烦的事情.
• 有⼀种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便.
• ⼀般的路由器都带有DHCP功能.因此路由器也可以看做⼀个DHCP服务器.
DHCP 的全拼是 Dynamic Host Configuration Protocol(动态主机配置协议),它的核心作用是:自动给联网设备分配网络参数,不用手动设置就能上网。

当手机和电脑都访问百度时,路由器会分别处理两个请求:
192.168.1.5:5000 ↔ 220.190.120.35:8080 → 180.101.49.11:80;192.168.1.6:6000 ↔ 220.190.120.35:9090 → 180.101.49.11:80。此时 NAT 表有两条完全独立的记录,核心区别在 “私网 IP + 私网端口” 和 “公网映射端口” —— 哪怕目标都是百度 80 端口,这两个维度的差异足以区分。
百度服务器收到两个请求后,会分别返回响应,响应的 “目的地址” 是路由器的公网 IP + 映射端口:
服务器不需要知道内网设备,只需要按 “请求的来源公网标识” 返回数据 —— 这两个响应的 “目的端口”(8080 vs 9090)不同,是路由器区分的 “直接钥匙”。
路由器收到两个响应后,只需要做一件事:提取响应的 “目的公网映射端口”,匹配 NAT 表中的记录:
整个过程中,路由器根本不需要 “额外判断”—— 公网映射端口是它自己分配的,且每个端口只对应一个 “私网 IP + 私网端口 + 目标服务” 的组合,只要端口匹配,就能精准找到对应的设备和应用
内网多个设备使用相同的本地端口号,只要它们访问的目标不同,NAT就可以复用同一个公网端口!
私网的IP在私网中只有一个,但是不同的设别可能他自己的操作系统分配的端口号一样,访问的公网IP是一样的,但是端口号不一样,所以说即使他们访问的同一个应用程序的服务器,服务器发送的响应也能很快的识别对应的私网设备
同一时间,一个公网端口不是只能对应「一个内网端口」,而是只能对应「一个唯一的四元组(私网 IP + 私网端口 + 目的 IP + 目的端口)」”—— 只要四元组不同,同一个公网端口可以在同一时间对应多个不同的内网会话。
公网设备 A 直接访问局域网设备 B:

核心取决于 “是否有公网可达的中转节点(含云服务器),但是云服务器是最稳定常用的方法
过去曾经提出⼀种划分⽹络号和主机号的方案,把所有IP地址分为五类,如下图所⽰。

随着Internet的飞速发展,这种划分方案的局限性很快显现出来,⼤多数组织都申请B类网络地址,导致B 类地址很快就分配完了,⽽A类却浪费了⼤量地址;
• 例如,申请了⼀个B类地址,理论上⼀个子网内能允许6万5千多个主机.A类地址的子网内的主机数更 多.
• 然而实际网络架设中,不会存在⼀个子网内有这么多的情况.因此⼤量的IP地址都被浪费掉了.
针对这种情况提出了新的划分方案,称为CIDR(ClasslessInterdomainRouting)无类别域间路由)表示法:IP 地址 + “/” + 子网掩码二进制中 1 的位数
• 引入⼀个额外的子网掩码(subnetmask)来区分网络号和主机号;
• 子网掩码也是⼀个32位的正整数.通常用⼀串"0"来结尾;
• 将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号;
• 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

可见,IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有⼀种更简洁的表示方法,例如140.252.20.68/24,表⽰IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0
特殊的IP地址
• 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
• 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同⼀个链路中相互连接的所有主机发 送数据包;
• 127.*的IP地址⽤于本机环回(loopback)测试,通常是127.0.0.1(本机IP可以当作)

往 “广播地址” 发送数据包,相当于在当前局域网内 “群发”—— 这个数据包会被转发给同一局域网里的所有设备(但只局限在当前局域网,出不了这个网段)。
虽然形式上像群聊,但技术逻辑完全不同:
手机投屏前 “自动搜索可投屏设备”,就是靠广播实现的:
广播只能用 UDP 协议 传输:因为 TCP 是 “一对一建立连接” 的,不支持 “群发”;而 UDP 是无连接的,可以直接往广播地址发数据 —— 所以广播功能都依赖 UDP 实现。
简单说:广播是局域网内的 “群发工具”,手机投屏搜设备、打印机自动发现这些场景,都是靠它实现的~


我们知道,IP地址(IPv4)是⼀个4字节32位的正整数.那么⼀共只有2的32次⽅个IP地址,⼤概是43亿左 右.而TCP/IP协议规定,每个主机都需要有⼀个IP地址.
这意味着,⼀共只有43亿台主机能接⼊网络么? 实际上,由于⼀些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每⼀个网卡都需要配置⼀个或多个IP地址. CIDR在⼀定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没 有增加),仍然不是很够用.这时候有三种方式来解决:
• 动态分配IP地址:只给接入网络的设备分配IP地址.因此同⼀个MAC地址的设备,每次接入互联⽹中, 得到的IP地址不⼀定是相同的
• NAT技术(后⾯会重点介绍);
• IPv6:IPv6并不是IPv4的简单升级版.这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位 来表⽰⼀个IP地址;但是目前IPv6还没有普及;
如果⼀个组织内部组建局域网,IP地址只用于局域⽹内的通信,而不直接连到Internet上,理论上使⽤任意 的IP地址都可以,但是RFC1918规定了⽤于组建局域⽹的私有IP地址
• 10.*,前8位是⽹络号,共16,777,216个地址
• 172.16.到172.31.,前12位是⽹络号,共1,048,576个地址
• 192.168.*,前16位是⽹络号,共65,536个地址
包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公⽹IP)

• ⼀个路由器可以配置两个IP地址,⼀个是WAN口IP,⼀个是LAN口IP(子网IP).
• 路由器LAN口连接的主机,都从属于当前这个路由器的子网中.
• 不同的路由器,子网IP其实都是⼀样的(通常都是192.168.1.1).子网内的主机IP地址不能重复.但是子网之间的IP地址就可以重复了.
• 每⼀个家用路由器,其实又作为运营商路由器的子网中的⼀个节点.这样的运营商路由器可能会有很 多级,最外层的运营商路由器,WAN⼝IP就是⼀个公⽹IP了.
• 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样 逐级替换,最终数据包中的IP地址成为⼀个公网IP.这种技术称为NAT(NetworkAddress Translation,网络地址转换).
• 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在⼀台具有外⽹IP 的服务器上.这样的服务器可以在阿里云/腾讯云上进⾏购买
在复杂的网络结构中,找出⼀条通往终点的路线
路由的过程,是⼀跳⼀跳(HopbyHop)"问路"的过程.
所谓"⼀跳"就是数据链路层中的⼀个区间.具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧 传输区间


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

• 路由表可以使用route命令查看
• 如果⽬的IP命中了路由表,就直接转发即可;
• 路由表中的最后⼀行,主要由下⼀跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不 匹配时,就按缺省路由条目规定的接口发送到下⼀跳地址。
假设某主机上的网络接口配置和路由表如下:

• 这台主机有两个网络接口,⼀个网络接口连到192.168.10.0/24网络,另⼀个网络接口连到 192.168.56.0/24⽹络;
• 路由表的Destination是⽬的网络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接 口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下⼀跳地址是某个路由 器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
转发过程例1:如果要发送的数据包的⽬的地址是192.168.56.3
• 跟第⼀行的子网掩码做与运算得到192.168.56.0,与第⼀行的目的网络地址不符
• 再跟第⼆行的子网掩码做与运算得到192.168.56.0,正是第⼆行的目的网络地址,因此从eth1接⼝发 送出去;
• 由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到⽬的主机,不需要经路由 器转发
转发过程例2:如果要发送的数据包的目的地址是202.10.1.2
• 依次和路由表前几项进行对比,发现都不匹配;
• 按缺省路由条目,从eth0接口发出去,发往192.168.10.1路由器;
• 由192.168.10.1路由器根据它的路由表决定下⼀跳地址
2.7 路由表生成算法(选学)
路由表可以由网络管理员手动维护(静态路由),也可以通过⼀些算法自动生成(动态路由). 调研⼀些相关的生成算法,例如距离向量算法,LS算法,Dijkstra算法等.