网络层协议IP
IP协议
在复杂的网络环境中确定一个合适的路径.
- 主机: 配有IP地址, 也要进行路由控制的设备;
- 路由器: 即配有IP地址, 又能进行路由控制;
- 节点: 主机和路由器的统称;
理解传输层和网络层
- 传输层提供可靠性和效率以及进行流量控制
- 网络层负责根据IP地址进行我们的数据从主机A跨网络送到主机B
- 网络层就是解决长距离传输路由选择的问题
IP协议报头
4位版本Version
作用: 指明 IP 协议的版本号。
值: 对于 IPv4,这个字段的值固定为 4 (二进制 0100)。
意义: 接收设备首先检查此字段,以确定如何解释数据报的其余部分。确保发送方和接收方使用相同版本的 IP 协议。
4位首部长度
作用: 指示 IPv4 首部的长度(以 32 位字(4 字节) 为单位)。
范围: 最小值为 5 (表示 5 * 4 = 20 字节,这是没有任何选项的标准首部长度)。最大值为 15 (表示 15 * 4 = 60 字节)。包括选项在内。
意义: 接收方需要知道首部在哪里结束,有效载荷数据从哪里开始。因为首部可能包含长度可变的选项字段。就是根据改字段我们可以方便解包,进行有效载荷分离。
8位服务类型 (Type of Service - TOS)
- 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).
- 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择
一个. - 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重
要.
16位总长度 (Total Length)
指定整个IP数据报(包括首部和数据部分)的总长度(以 字节 为单位)。
范围: 最小值是 20 字节(只有最小首部,无数据)。最大值是 65535 字节 (2^16 - 1)。
意义: 接收方据此确定数据报的结束位置。在数据报需要被分片时,该字段的值也会在分片过程中被修改(每个分片都有自己的总长度值)。这样每一个分片都有自己的长度了,就可以完成分片组装了。
16位标识 (Identification)
作用: 唯一标识一个从源主机发出的原始数据报。
过程: 当源主机发送一个数据报时,它分配一个唯一的标识值。如果该数据报在传输过程中因为长度超过某个链路的 MTU 而需要被分片,那么所有属于该原始数据报的分片都共享相同的标识值。
意义: 接收方使用此字段将属于同一个原始数据报的各个分片重新组装起来。
3位标志 (Flags)
作用: 控制分片行为。
组成: 包含 3 个比特位(顺序为:保留位 | DF 位 | MF 位):
第 1 位 (最高位): Reserved (保留位): 必须置为 0。
第 2 位: Don’t Fragment (DF - 不分片位):
0 = 允许分片(如果数据报太大)。1 = 不允许分片。第 3 位 (最低位): More Fragments (MF - 更多分片位):
0 = 这是原始数据报的最后一个分片,或者是未分片的数据报。
1 = 表示该分片不是原始数据报的最后一个分片,后面还有更多分片。意义: 指示路由器是否可以分片数据报,并告知接收方当前分片是否是原始数据报的最后一个分片。
13位片偏移 (Fragment Offset)
作用: 指定当前分片所携带的数据在原始未分片数据报的数据部分中的起始位置(相对于数据部分开头)。
单位: 以 8 字节 (64 位) 块为单位。所以,实际的字节偏移量是这个值乘以 8。
范围: 最大值为 8191 (2^13 - 1),对应的最大字节偏移量为 8191 * 8 = 65528 字节。
意义: 接收方使用此字段(结合标识符和 MF 标志)将分片按正确的顺序组装回原始数据报。第一个分片的偏移量通常为 0。
8位生存时间 (Time to Live - TTL)
作用: 设置数据报在网络中允许经过的最大路由器跳数,以防止数据报在网络中无限循环。
过程: 源主机设置一个初始值(如 64, 128 等)。每经过一个路由器,该路由器在转发数据报之前会将 TTL 值减 1。如果 TTL 值减到 0,路由器将丢弃该数据报,并通常向源主机发送一个 ICMP 超时错误消息。
意义: 确保无法送达的数据报最终被清除出网络,防止网络拥塞。
8位协议 (Protocol)
作用: 标识 IP 数据报数据部分中封装的是哪个上层协议的数据。
常见值:
1 = ICMP (Internet Control Message Protocol)
2 = IGMP (Internet Group Management Protocol)
6 = TCP (Transmission Control Protocol)
17 = UDP (User Datagram Protocol)
88 = EIGRP (Cisco 路由协议)
89 = OSPF (Open Shortest Path First 路由协议)意义: 告诉接收主机的 IP 层,在剥离 IP 首部后,应该将剩余的数据(有效载荷)交给哪个上层协议(如 TCP, UDP, ICMP)处理。从而实现分用。
32位源IP地址 (Source IP Address)
作用: 指定发送该 IP 数据报的设备的 IPv4 地址。
意义: 接收方知道数据来自哪里,以便回复。方便我们进行路由。
32位目的IP地址 (Destination IP Address)
作用: 指定该 IP 数据报最终要送达的设备的 IPv4 地址。
意义: 这是路由器进行转发决策(路由查找)的关键依据,也是接收方识别数据是否发给自己的依据。拿到目的IP可以与路由器中的字码掩码看一下是不是自己子网网段的不是交给默认路由,从而进行路由查找。
网段划分
IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
-一个子网其实就是把网络号相同的主机放到一起. - 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
- 其中一个子网内IP地址的分配是有我们的路由器来进行分配的
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.因此路由器是可以工作在应用层的。
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示:
- 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类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址
- 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
- 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)(无类别域间路由):
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个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地址用于本机环回(loop back)测试,通常是127.0.0.1
私有IP和公网IP
私有IP
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有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地址就可以重复了,这样就解决了我们的IP数量不够用的难题
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.(也别称为出入口路由器)-
- 子网内的主机需要和外网进行通信时, 比如拿到源头IP地址和目的IP地址,路由器将IP首部中的IP地址进行替换(替换成WAN口IP)(替换的是源IP,保证私有IP不出现在公网中), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network AddressTranslation,网络地址转换).
- 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.
公网IP
下面我们以国家为单位进行子网划分,但实际上不是简单的以国家进行发的这里我们只需理解就可以。
路由
每一个路由器都有一个路由表,记录自己处的网络地址以及对外所有路由器的网络地址,还有对内所有路由器的网络地址,以及各个路由器的下一条地址,就是要去哪一个路由器。
- 路由表可以使用route命令查看
- 我们可以用目标IP与子网掩码进行按位与运算,接着对比路由表中记录的网络地址,如果命中就去该网路地址的下一条地址,从而完成路由。如果一个也没有命中,就去默认路由进行路由转发。
- 路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都
不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
- 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;
- eth 是 Ethernet(以太网)的缩写,eth0、eth1 等是 Linux 系统中对以太网接口的传统命名方式。