目录
一、IP协议
1.1 基本概念
1.2 IP协议报头
1.3 如何将报头和有效载荷分离和分用
1.4 分片与组装
1.5 如何减少分片?
1.6 分片和封装的具体过程
二、网段划分
2.1 再次理解IP地址
2.2 了解DHCP
2.3 网络划分方案
2.4 为什么要进行网络划分
2.5 特殊的 IP 地址
三、IP 地址的数量限制
四、私有IP地址和公网IP地址
4.1基本概念
4.2 运营商
4.3 路由器
4.4.1路由的概念
4.4.2 路由的具体过程
一、IP协议
1.1 基本概念
IP(Internet Protocol)即互联网协议,是计算机网络中用于数据通信的一套规则或标准。它是TCP/IP(传输控制协议/互联网协议)协议族中的核心协议之一。
- IP协议:负责在网络层将数据(通常是数据包)从源设备传输到目标设备
- 网络层:在复杂的网络环境中确定一个合适的路径.
IP地址可以标识互联网中唯一的一台设别,它提供了一种可以将一台主机的数据跨网络发送到另一台主机的能力,而传输层的TCP协议提供了数据的安全和可靠性。我们常见的IP格式通常为网络号+主机号,例如197.128.128.5,其中197.128.128.0就是该IP地址的网络号,5就是主机号。这样设计的原因是可以大大减少网络路由的时间,例如我们知道了一个学生的学号,我们可以根据学号的前几位找到他所在的院系班级,在通过后几位确定具体是班级里的哪一个人。
- 主机: 配有 IP 地址, 在前几年,主机一般都不进行路由控制,但是如今的主机大多数都是支持路由的
- 路由器: 即配有 IP 地址, 又能进行路由控制
- 节点: 主机和路由器的统称
1.2 IP协议报头
- 4 位版本号 (version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4.
- 4 位头部长度 (header length): 表示IP报头的长度,单位是4字节,可以表示的最大长度是 60 字节.
- 8 位服务类型 (Type Of Service): 3 位优先权字段(已经弃用), 4 位 TOS 字段, 和 1 位保留字段(必须置为 0). 4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于 ssh/telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要
- 16 位总长度 (total length): IP 数据报整体占多少个字节.
- 16 位标识 (id): 唯一的标识主机发送的报文. 如果 IP 报文在数据链路层被分片 了, 那么每一个片里面的这个 id 都是相同的.
- 3 位标志字段: 第一位保留.,暂时不会用到, 第二位置为 1 表示禁止分片, 这时候如果报文长度超过 MTU, IP 模块就会丢弃报文,第三位表示"更多分片", 如果分片了的话, 最后一个分片置为 0, 其他是 1,类似于一个结束标记,如果没有分片该位会置为0
- 13 位分片偏移 (framegament offset): 是分片相对于原始 IP 报文开始处的偏移(不带IP报头). 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文 就不连续了).
- 8 位生存时间 (Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是 64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
- 8 位协议: 表示上层协议的类型
- 16 位头部校验和: 使用 CRC 进行校验, 来鉴别头部是否损坏.
- 32 位源地址和 32 位目标地址: 表示发送端和接收端.
- 选项字段:不定长, 最多 40 字节
1.3 如何将报头和有效载荷分离和分用
如何分离:
IP报头的分离过程与TCP的报头分离过程类似,由于IP报头的基本长度是20个字节,所以我们可以先读取报文的前20个字节,从中提取出4位首部长度和16位总长度,如果首部长度大于20个字节,那 首部长度 - 20 就是选项的长度,剩下的就是有效载荷。
如何分用:
在报头中存在一个8位协议号,它表示了传输层采用的是TCP协议还是UDP协议,这样目标主机在传输层就可以解析了
1.4 分片与组装
在数据链路层,他会将网络层中传下来的IP报文封装成帧,在通过网络发送出去,而数据链路层一次性发送的数据是有限的,通常这个大小称为MTU(Maximum Transmission Unit,最大传输单元),通常是1500个字节。
当IP报文超过这个长度时,数据链路层可能就会丢弃这部分数据,所以为了避免这样的情况就需要在IP层对报文进行分片。
在学习TCP协议时,我们了解到一个叫滑动窗口的知识,而滑动窗口中的数据是可以暂时直接发送的数据,在发送时通常是分为一块一块的发送的而不是一整块全部发送,这样设计的原因就是为了满足数据链路层最大传输单元的问题。
而在实际数据发送时,分片并不是主流做法,因为将报文分片发送会提高报文的丢失概率。因为接收端需要将所有的分片都收到才能拼装成一个完整的数据,如果在传输过程中其中的一个分片丢失了,就会导致发送方超时重传,所以对于传输层来说,丢失一个分片的影响是与丢失整个报文的影响相同的。分片会使丢包的概率增加,尽可能需要减少分片。
1.5 如何减少分片?
如何减少分片就需要通过产生分片的原因来解决,造成分片的根本原因是传输层交付到网络层的数据太大了,所以可以通过控制传输层交付下来的数据大小来解决。MSS(Maximum Segment Size,最大报文段长度)是TCP/IP协议中的一个概念,它指的是TCP数据报(Segment)中的数据字段的最大长度。MSS的值决定了TCP传输层每次能够传输的最大数据量,这个值在TCP连接建立时通过三次握手过程中的SYN和SYN-ACK报文段协商确定。
MSS的大小对TCP性能有重要影响。如果MSS设置得太小,会导致网络传输效率低下,因为每次传输的数据量太少,需要更多的报文段和更多的网络开销。如果MSS设置得太大,又可能会因为网络中的MTU(Maximum Transmission Unit,最大传输单元)限制而导致报文段被分片,同样会增加网络开销,并可能增加数据包丢失的风险。
MSS的值通常基于网络的MTU来设置。在以太网环境中,由于以太网的MTU通常是1500字节(不包括以太网帧头和帧尾),而IP头部和TCP头部通常占用40字节(IPv4头部20字节+TCP头部20字节),所以MSS的默认值通常为1460字节(1500 - 40 = 1460)。但是,这个值可能会因为各种因素(如VPN隧道、IPSec加密等)而减少。
1.6 分片和封装的具体过程
假设网络层要发送的数据大小是3000个字节。
分片的过程
由于他超过了MTU的大小,所以需要将他进行分片,而每个分片必须要有IP报头,因为每个分片都需要知道自己由哪来到哪去,由于只有第一个分片拥有IP报头(假设报头是20个字节,不带选项),通常的做法是将第一个分片的报头拷贝一份,在修改一下里面的某些属性。MTU最多支持一次性发送1500字节,因为我们要给其他分片添加报头,所以我们至少需要分为三片
问题:
在报头中的片偏移字段为13为,可以表示的最大长度为2^13个字节,但是IP报文的最大长度字段是16为,最大长度时2^16个字节,所以这就存在一个问题,当IP报文过长的话,一些分片的片偏移可能无法表示。再实际填写数据时,我们将实际的片偏移大小右移三位,在使用数据时,我们左移三位
- 大致分片情况如上图所示,接下来处理报头
- 假设所有分片的16位标识为1234
- 分片1的其他分片为1,片偏移为0
- 分片2的其他分片为1,片偏移为185( 1480 / 8 )
- 分片3的其他分片为0,片偏移为370( (1480+1480)/ 8 )
封装的过程
要明白封装的过程我们只需要明白这几个问题即可
接收端如何区分接收到的数据是否是分片?
如果数据时分片的话,我们接收到的无非可能是第一片,第二片或者第三片,通过上面的图我们可以知道如果分片的话,其他分片或者片偏移至少一个不为0。所以如果没有分片的话,其他分片==0&&片偏移==0
如何保证接收端接收到了所有的分片?
将所有收到的分片依据片偏移按升序排列,并且判断
下一个分片的片偏移是否==上一个分片的片偏移+上一个分片的数据大小/8
如果全部都满足的话说所有的分片都接收到了
解决了上述问题,拼装的过程就很简单了,去掉所有分片的报头,并且依次尾插即可
二、网段划分
2.1 再次理解IP地址
IP 地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
- 不同的子网其实就是把网络号相同的主机放到一起.
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复.
2.2 了解DHCP
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同,但是手动管理子网内的 IP, 是一个相当麻烦的事情。
有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免 了手动管理 IP 的不便,DHCP允许网络中的设备动态地从DHCP服务器获取IP地址、子网掩码、默认网关、DNS服务器地址等网络配置信息,而不需要手动设置。这样做不仅简化了网络管理,还使得设备能够更容易地移动到网络中的不同位置而不需要重新配置网络设置。
如今一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器,当我们输入WIFI的账号密码后,他就会给我们的主机分配一个IP地址,我们就可以根据这个IP地址上网了。
2.3 网络划分方案
过去曾经提出一种划分网络号和主机号的方案, 把所有 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 类却浪费了大量地址;
例如,
一个企业想申请自己的局域网,由于A类网络号只有7位,也就是说A类网络最多可以划分2^7个子网,一般申请比较困难,所以大多数组织都愿意申请B类网络
随着互联网的快速发展,传统的分类方法逐渐暴露出一些问题,如IP地址的浪费和分配不均匀。特别是在大型企业和ISP中,一个C类网络可能无法满足需求,而分配一个B类网络又会造成大量地址的浪费。
针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):
- CIDR引入了一种新的表示IP地址的方法,即使用网络前缀长度来表示网络,而不是传统的类别划分。这种方法打破了固定的类别限制,允许更灵活的地址分配。CIDR还引入了可变长度子网掩码的概念,使得网络管理员可以根据实际需求来划分子网,进一步提高了IP地址的利用率。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾;
- 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关;
举个例子:
假设一个IP地址的前24位表示主机号,那它的子网掩码前24位就都是1,也就是 255.255.255.0,我们假设IP地址为 192.168.1.1 ,IP地址与子网掩码做按位与运算,得到的就是网络号192.168.1.0,IP地址与子网掩码按位与的本质就是将IP地址的主机号置为0,而主机号可以表示的范围就是该子网可以表示的范围,在这个例子中,这个子网的范围是主机号全0~全1,即
192.168.1.0 ~192.168.1.255,但是在实际中,有两个IP地址是不能用的,主机号全0表示该子网的网络号,主机号全为1表示广播地址。
IP 地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为 140.252.20.68, 子网掩码的高 24 位是 1,也就是 255.255.255.0
2.4 为什么要进行网络划分
网络产生的根本原因是要进行设备间的远程通信,如果我们不对网络划分的话,想要在茫茫的网络中找到一个主机,无异于大海捞针,需要检索每一个IP地址。如果存在网络划分的话,我们就可以先找到该IP地址所在的网络号,在找到具体的主机。寻找的本质就是排除,例如我们减到一张学生卡,根据他的学号,我们就可以确定他是哪一个专业的,这样我们就不需要到其他的专业寻找了,这样可以大大增加网络性能,并且有利于管理。
要注意在实际过程中网络可能会被划分很多次,这与地理位置、功能和部门等等因素有关,在划分更小的子网时,其网络号位数是增加的,而主机号是减少的。所以数据在路由时,可能是从一个很小的子网逐步路由到大的子网,再由大的子网逐步向下路由,最终在一个小的子网中找到对应的主机。
2.5 特殊的 IP 地址
- 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网
- 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
- 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1 ,这个地址代表设备的本地虚拟接口,用于将数据包从同一主机的一个网络应用程序传输到另一个网络应用程序,而不需要经过实际的物理网络接口,由于流量不经过任何外部网络,因此可以用于安全地运行和测试一些敏感的应用程序或服务。
三、IP 地址的数量限制
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP 地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址.
这意味着, 一共只有 43 亿台主机能接入网络么?
实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主 机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址.
CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP 地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
- 动态分配 IP 地址: 只给接入网络的设备分配 IP 地址. 因此同一个 MAC 地址的设备, 每次接入互联网中, 得到的 IP 地址不一定是相同的;
- NAT 技术:NAT技术是一种将私有网络地址(如局域网内部地址)转换成公共网络地址(如互联网地址)的技术。它通常部署在连接私有网络与公共网络之间的路由器或防火墙上,以实现多台计算机共用一个公网IP地址上网。
- IPv6: IPv6 并不是 IPv4 的简单升级版. 这是互不相干的两个协议, 彼此并不兼容,IPv6 用 16 字节 128 位来表示一个 IP 地址; 但是目前 IPv6 还没有普及;
四、私有IP地址和公网IP地址
4.1基本概念
如果一个组织内部组建局域网,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);
例如,我们在电脑Cmd中输入 ipconfig ,我现在连接的是校园网,可以发现显示的IP地址是以10开头的私有地址
我们在来看看服务器上的IP地址
4.2 运营商
我们平时上网明明使用的是互联网公司的服务,为什么却要向移动、联通等运营商交钱呢?
- 例如我们平时网购,这些数据不并不是直接发送给了对方的服务器,而是需要经过运营商建设的基站、路由器等设备,最终发送给对方的服务器
- 运营商做这些工作的成本很大,所以我们上网需要向他们交钱,申请上网的权限
- 如今的互联网公司的出现是基于运营商的这些设备的,没有运营商做这些工作,互联网就不会发展起来
- 甚至我们的网络划分都是运营商精心策划的
4.3 路由器
路由器能够连接两个或两个以上的个别网络,并根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。它是互联网的主要结点设备,也是互联网络的枢纽,可以称为“交通警察”。
路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:
- LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
- WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。
我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。
由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,直到数据包中的源IP地址替换为一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换)。
所以NAT技术在某种程度上缓解了IP地址不足的问题:通过路由器可以维护多个子网,子网内又可以维护多个设备,这样大量的个人设备使用私网IP即可,不占用有限的公网IP。
两个局域网当中的主机不能不跨公网进行通信
- 两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。
- 即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
- 当这一台主机发送数据时将目的IP地址填成和自己相同的IP地址,操作系统就会认为这个数据就是要发给自己的,而不会向外进行发送了。
- 所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。
- 但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。
4.4 路由
4.4.1路由的概念
路由就是在复杂的网络结构中, 找出一条通往终点的路线;
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程. 所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源 MAC 地址到目的 MAC 地址之间的帧传输区间.
IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。
路由器的查找结果可能有以下三种:
- 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
- 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
- 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。
4.4.2 路由的具体过程
每个路由器内部会维护一个路由表,我们可以通过 route命令查看云服务器上对应的路由表。
- Destination : 代表的是目的网络地址。
- Gateway : 代表的是下一跳地址。
- Genmask: 代表的是子网掩码。
- Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。