Q: 两台服务器A和B的网络配置,
A | B | |
---|---|---|
IP address | 192.168.26.129 | 192.168.26.3 |
Subnet mask | 255.255.255.0 | 255.255.255.224 |
Default gateway | 192.168.26.2 | 192.168.26.2 |
子网掩码本都为255.255.255.0
, B的子网掩码不小心配成了255.255.255.224
。它们还能正常通信吗?
如果看到这个问题能自信回答。下文无须再看。
名词理解
IP
ip地址
不要被地址前的ip吓到,ip地址也是地址,位置的标识。
先来感受一下
IPv4地址
192.168.18.4
字面上分析:由3个点分为4组,可以是16进制也可以是10进制,32位
IPv6地址
2020:8210:242a:f270:1ca2:3f7:6ff:18af
字面上分析:由7个冒号分为8块也叫字段,16进制表示,128位
在IPv6中地址长度是128位,是IPv4的四倍。
1.在一个块中前导的零不必书写
2.全零的块可以省略,用符号::代替,为了避免歧义,一个IPv6地址中::只能用一次。
在某些情况下(例如表示一个包含地址的URL时),IPv6地址中的冒号分隔符可能与其他分隔符混淆,例如IP地址和端口号之间使用的冒号。这时候用[
和]
包围IPv6地址。例如,URL
http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/
是指IPv6主机2001:0db8:85a3:08d3:1319:8a2e:0370:7344
中的端口号443使用HTTP 、TCP和IPv6协议
增加的这些灵活性随之而来的就是会造成不必要的混淆性,同一个IP地址有多种的表示方式。
为了弥补这种情况,还要兼容特性,制定了规则,保证IP地址表示的唯一性
前导的零必须压缩。
符号
::
只能用于影响最大的地方(压缩最多的零),如果多少块中包含等长度的零,顺序靠前的块被替换为::
。- a到f的十六进制数字应该用小写表示。
互联网上的每个接口必须有一个唯一的 I n t e r n e t 地址,也称作 I P 地址
IP地址的历史演变
最初定义 Internet地址结构 = 网络号 + 主机号
网络号
: 用于识别接口使用的IP地址在哪个网络中可被发现;
主机号
:用于识别由网络部分给出的网络中的特定主机;
当时,大多数主机只有一个网络接口,因此术语接口地址和主机地址有时交替使用。
分类寻址
column
避免歧义,论证我的观点
IP地址分为A、B、C、D、E五类这是没有争议的。
但是我对E的前缀码有所怀疑
下表来自Wikipedia https://zh.wikipedia.org/wiki/IP%E5%9C%B0%E5%9D%80
A类IPv4地址 B类IPv4地址 C类IPv4地址 D类IPv4地址 E类IPv4地址 网络标志位 0 10 110 1110 11110 IP地址范围 1.0.0.0~127.255.255.255 128.0.0.0~191.255.255.255 192.0.0.0~223.255.255.255 224.0.0.0~239.255.255.255 240.0.0.0~247.255.255.255 可用IP地址范围 1.0.0.1~127.255.255.254 128.0.0.1~191.255.255.254 192.0.0.1~223.255.255.254 是否可以分配给主机使用 是 是 是 否 否 网络数量(个) 126 (27-2) 16384 (214) 2097152 (221) — — 每个网络中可容纳主机数(个) 16777214 (224-2) 65534 (216-2) 254 (28-2) — — 适用范围 大量主机的大型网络 中等规模主机数的网络 小型局域网 留给Internet体系结构委员会(IAB)使用【组播地址】 保留,仅作为搜索、Internet的实验和开发用 下图信息来自《TCP/IP详解 卷1:协议》译者: 范建华等
以上两处信息表达一致。但是我得疑问是如果E的前缀码是
11110
那么剩下的那个区间的地址算什么11111000 00000000 00000000 00000000 ~ 11111111 11111111 11111111 11111111
248.0.0.0 ~255.255.255.255
又查阅了《TCP/IP详解 卷1:协议》第二版,吴英等译 吴功宜 审校
E类的 地址范围 240.0.0.0 ~ 255.255.255.255 高位序 1111
我还是倾向于后者,所以之后的理论基于此,尽管这无关紧要。
现实中的不同网络可能有不同数量的主机,每台主机都需要一个唯一IP地址。
地址空间的划分涉及五大类,每类都基于网络中可容纳的主机数量,确定在一个32位的IPv地址中分配给网络号和主机号的位数。
由上图的信息可以算得下表数据
类 | 地址范围 | 高序位 | 用途 | 百分比 | 网络数 | 主机数 |
---|---|---|---|---|---|---|
A | 0.0.0.0~127.255.255.255 | 0 | 单播/特殊 | 1/2 | 128 (2^7) | 16777216 (2^24) |
B | 128.0.0.0~191.255.255.255 | 10 | 单播/特殊 | 1/4 | 16384 (2^14) | 65536 (2^16) |
C | 192.0.0.0~223.255.255.255 | 110 | 单播/特殊 | 1/8 | 2097152 (2^21) | 256 (2^8) |
D | 224.0.0.0~239.255.255.255 | 1110 | 组播 | 1/16 | N/A | N/A |
E | 240.0.0.0~255.255.255.255 | 1111 | 保留 | 1/16 | N/A | N/A |
百分比的计算可以 画棵哈夫曼树, 比如 0为左子树1为右子树
各类的网络数呈几何倍的递增,而网络数却呈几何倍递减,这样的分类有些脱离现实过于数字化了。
A类和B类网络号通常浪费太多主机号,而C类网络号则不能为很多站点提供足够的主机号。
比如C类网络号主机过少,而B类网络号主机又过多,如果想选择一个千为单位的网络号则十分尴尬了。
子网寻址
背负历史包袱,负重前行
为了在不改变Internet核心路由基础设施的情况下解决这个问题,人们很自然想到一种方式,在一个站点接入Internet后为其分配一个网络号,然后又站点管理员进一步划分本地的子网数。
实现这个想法需要改变IP地址的网路部分和主机部分的限制,但这样做只是针对一个站点自身而言;Internet其余部分将只能’看到‘传统的A类、B类和C类部分。支持此功能的方法称为子网寻址
。
解释一下,一个站点可能申请到了B类网络号,也就是IP地址的前16位确定了,余下16位自由位,
如果按照传统思维(分类寻址)那么剩下的16位就是主机号,
而按照子网寻址的逻辑,这16位对于Internet其他部分看来依然是主机号,对于站点自身来看,可通过子网掩码自由再划分成网络号与主机号。如下图一种可能的格式
这个例子中为一个B类地址被划分子网。它使用8位作为子网ID,提供256个子网和每个子网中254台主机(当前每个子网的第一个和最后一个地址无效,即从整个分配范围中去除第一个和最后一个地址)。这种划分可由网络管理员改变
前16位有权威机构分配。该站点的每个地址前16位固定不变,后16位由管理员分配。
注意只有划分子网的网络中的主机和路由器知道子网结构,在进行子网寻址前,Internet其他部分仍将它作为站点相关地址来看待。
下图展示如何工作
某个站点被分配一个典型的B类网络号128.32 。 网络管理员决定用于站点范围内的子网掩码为255.255.255.0,提供256个子网,每个子网可容纳256-2 = 254台主机。同一子网中每台主机的IPv4地址拥有相同子网号。左侧的局域网段中主机的IPv4地址开始于128.32.1,右侧的所有主机开始于128.32.2 。 Internet中其他站点要访问这个站点目的地址以128.32开始的所有流量直接由Internet路由系统交给边界路由器,如137.64.23.30要访问128.32.1.1 则先访问到站点边界路由器,边界路由器区分128.32网络中的不同子网。比如图中,它则要区分目的地址为128.32.1.x和目的地址为128.32.2.x的流量。这些地址分别表示子网号1和2,它们都采用128.32的B类网络号。那么路由器如何在地址中找到子网ID,这就需要子网掩码了。
子网掩码
子网掩码是由一台主机或路由器使用的分配位,以确定如何从一台主机对应IP地址中获得网络和子网信息。IP子网掩码与对应的IP地址长度相同(IPv4为32位,IPv6为128位)。它们通常在一台主机或路由器中以IP地址相同的方式配置,既可以是静态的(通常是路由器),也可以是动态的(例如动态主机配置协议DHCP)。
子网掩码表示网络号与主机号的边界,全是1的那边表示网络号全是0的表示主机号
如IPv4地址为128.32.1.14/255.255.255.0
地址(128.32.1.14) 10000000 00100000 00000001 00001110
掩码(255.255.255.0) 11111111 11111111 11111111 00000000
按位与结果 (128.32.1.0) 10000000 00100000 00000001 00000000
(网络号和地址)按位异或结果 00000000 00000000 00000000 00001110
网络号为 128.32.1.0
子网主机ID为 14
可变长度子网掩码VLSM
同一站点的不同部分,可将不同长度的子网掩码应用于相同网络号
回顾前文的问题
Q: 两台服务器A和B的网络配置,
A | B | |
---|---|---|
IP address | 192.168.26.129 | 192.168.26.3 |
Subnet mask | 255.255.255.0 | 255.255.255.224 |
Default gateway | 192.168.26.2 | 192.168.26.2 |
子网掩码本都为255.255.255.0
, B的子网掩码不小心配成了255.255.255.224
。它们还能正常通信吗?
A的地址 192.169.26.129/24 如果没有配置错则A与B在同一个子网内192.168.26.0
而现在B地址为 192.168.26.3/27
已经了解历史VLSM的原理 ,我们可以简单的绘制网络拓扑
A与B掩码不同处于不同层次的子网,但是依然处于192.168.26.x的结点下。通信是一定可以的,只是方式有所转变。
当讲解完Wireshark后,后再抓包分析这个流程
CIDR和聚合
20世纪90年代初,采用子网寻址缓解增长带来的痛苦后,Internet开始面临更严重的规模问题。有三个问题尤为重要。
- 到1994年,一半以上的B类地址已被分配。预计B类地址空间大约在1995年将被用尽。
- 32位的IPv4地址被认为不足以应付Internet在21世纪的初期规模。
- 全球性路由表的条目数(每个网络数对应一条),1995年大约为65000个条目,目前仍在增长。伴随着越来越多的ABC类路由条目出现,路由性能受到影响。
前缀
前文讲到的子网寻址方式base于分类寻址之上的。虽然对站点内的情况有所改善,但是对于整体Internet依然面临着严峻的问题(如为新站点选择网络号)
为了缓解IPv4的地址的压力,无类别域间路由CIDR
应运而生。
CIDR无类别域间路由
顾名思义,CIDR意在消除类别,即消除IP地址中网络和主机号的预定义分隔,将更细粒度的IP地址分配范围成为可能。
使用CIDR,未经过预定义的任何地址范围可作为一个类的一部分,但需要一个类似于子网掩码的掩码,有时也称为CIDR掩码。使用CIDR掩码不再局限于一个站点,而对全球路由系统都是可见的。因此,除了网络号之外,核心Internet路由器必须能解释和处理掩码。这个数字组合称为网络前缀
,它用于IPv4和IPv6地址管理。
暂且理解为 CIDR 为 子网掩码的Internet版。
聚合
通过取消分类结构的IP地址,能分配各种尺寸的IP地址块。但是,这样做没有解决问题3. 它并未有助于减少路由条目数。
路由条目:路由器发送流量的指向
从本质上来说,路由器检查每个到达的数据报中的目的IP地址,找到一条匹配的路由表条目,并从该条目中提取数据报的”下一跳“。
分层路由
20世纪70年代末,由Kleinrock和Kamoun发表的分层路由研究
如果将网络拓扑排列为一棵树,并且以对网络拓扑敏感的方式来分配地址,可获得一个非常小的路由表,同时保持到所有目的地最短路径,下图举个例子
左侧a)图中的树根是标记为19.12.4.8的路由器。为了知道每个可能的目的地的下一跳,它需要知道一棵树中在其下面的所有路由的条目,所以其存有的路由条目共9条。
右侧b)图中的树根是标记为19.0.0.1,并要求其路由表中只有3个条目(二叉树)左子树中所有路由器(节点)以前缀19.1开始,右侧的所有路由器以19.2开始。因此。路由器19.0.0.1的表中只需将19.1开始的目的地显示下一跳为19.1.0.1而将以19.2开始的目的地下一跳显示为19.2.0.1 。 任何其他的目的地址都被路由到标有”网络其他部分“的云中。结果共有3个条目(父结点,子结点)
路由聚合
通过将相邻的多个IP前缀合并成一个短前缀称为一个聚合或汇聚
前两个(190.154.27.0/26与190.154.27.64/26)数值相邻,因此可被聚合。前缀190.154.27.192/26不能被聚合,由于它们并非数值相邻。
这样原来的三个前缀和两个新增的前缀可聚合成一个前缀。
特殊用途地址
IPv4和IPv6地址空间中都包括几个地址范围,它们被用于特殊用途,因此不能用于单播地址分配。 这些特殊地址不详谈了。
还有一些单播地址被用于构建专用网络,来自这些范围的地址可用于一个站点或组织内部的主机和路由器之间的通信,但不能用于Internet中。因此这些地址有时也被称为不可路由的地址。
专用、不可路由的地址空间管理完全由本地决定。IPv4专用地址在家庭网络、中等规模、大型企业内部网络中很常见。它们经常与网络地址转换(NAT)结合使用,在IP数据报进入Internet时修改其中的IP地址。
这些构建内网的IP常称为私有IP
IPv4前缀 10/8 172.16/12和192.168/16,
IPv6前缀 fc00::/7
Private IPv4 addresses
The Internet Engineering Task Force (IETF) has directed the Internet Assigned Numbers Authority (IANA) to reserve the following IPv4 address ranges for private networks
RFC1918 name | IP address range | Number of addresses | Largest CIDR block (subnet mask) | Host ID size | Mask bits | Classful description[Note 1] |
---|---|---|---|---|---|---|
24-bit block | 10.0.0.0 – 10.255.255.255 | 16777216 | 10.0.0.0/8 (255.0.0.0) | 24 bits | 8 bits | single class A network |
20-bit block | 172.16.0.0 – 172.31.255.255 | 1048576 | 172.16.0.0/12 (255.240.0.0) | 20 bits | 12 bits | 16 contiguous class B networks |
16-bit block | 192.168.0.0 – 192.168.255.255 | 65536 | 192.168.0.0/16 (255.255.0.0) | 16 bits | 16 bits | 256 contiguous class C networks |
简化后如下图
大致感受一下中小企业的网络拓扑
IP地址结构
大多数IPv4地址块最终被细分为一个地址用于识别连接Internet或者某些专用的内联网的计算机网络接口,这些地址称为单播地址。除了单播地址,其他类型的地址包括广播、组播和任播地址,它们可能涉及多个接口,还有一些特殊用途的地址。而我们主要围绕讨论的是单播地址
广播地址 ,如果发送这个地址,所有10.11.12 网络里面的设备都可以收到
网络号, 子网掩码和IP按位与就可得到网络号
IP地址的主机号
全0:表示整个子网
全1:表示向子网上所有设备发送包,即“广播”
IP怎么来的
如何配置IP地址?
往往我们上网不会为了IP而担忧,打开wifi,IP就自动设置好了。
其实就是使用默认的DHCP
##### 第一个协议
DHCP(Dynamic Host Configuration Protocol) 动态主机配置协议, 一个自动配置的协议
有了这个协议,网络管理员就轻松多了。他只需要配置一段共享的 IP 地址。每一台新接入的机器都通过 DHCP 协议,来这个共享的 IP 地址里申请,然后自动配置好就可以了。等人走了,或者用完了,还回去,这样其他的机器也能用
DHCP 的方式就相当于租房。你不用装修,都是帮你配置好的。你暂时用一下,用完退租就可以了
#####解析 DHCP 的工作方式
1.DHCP Discover
新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包,目的 IP 地址为 255.255.255.255。广播包封装了 UDP,UDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版
Boot request 我的 MAC 地址是这个,我还没有 IP,谁能给租给我个 IP 地址!
DHCP Offer
ip
DHCP Request
ip
ACK
Socket库提供查询IP地址的功能 询问 DNS 服务器 获取IP ,端口号
Socket 存有 描述符,IP,端口号
通过“描述符”来识别socket
还没有MAC地址
ARP 通过IP找MAC
同网段广播
套接字的实体就是通信控制信息
协议栈是根据套接字中记录的控制信息来工作的。
连接是什么意思
连接实际上是通信双方交换控制信息
收据收发
数据小
首先,协议栈并不关心应用程序传来的数据是什么内容。应用程序在 调用 write 时会指定发送数据的长度,在协议栈看来,要发送的数据就是 一定长度的二进制字节序列而已。
其次,协议栈并不是一收到数据就马上发送出去,而是会将数据存放在内部的发送缓冲区中,并等待应用程序的下一段数据。这样做是有道理的。应用程序交给协议栈发送的数据长度是由应用程序本身来决定的,不同的应用程序在实现上有所不同,有些程序会一次性传递所有的数据,有些程序则会逐字节或者逐行传递数据。总之,一次将多少数据交给协议栈是由应用程序自行决定的,协议栈并不能控制这一行为。在这样的情况下,如果一收到数据就马上发送出去,就可能会发送大量的小包,导致网络效率下降,因此需要在数据积累到一定量时再发送出去。至于要积累多少数据才能发送,不同种类和版本的操作系统会有所不同,不能一概而论,但都是根据下面几个要素来判断的。
第一个判断要素是每个网络包能容纳的数据长度,协议栈会根据一个 叫作MTU的参数来进行判断。MTU 表示一个网络包的最大长度,在以太网中一般是 1500 字节。MTU 是包含头部的总长度,因此需要从MTU 减去头部的长度,然后得到的长度就是一个网络包中所能容纳的最大数据长度,这一长度叫作 MSS。当从应用程序收到的数据长度超过或者接近 MSS 时再发送出去,就可以避免发送大量小包的问题了。
另一个判断要素是时间。当应用程序发送数据的频率不高的时候,如果每次都等到长度接近 MSS 时再发送,可能会因为等待时间太长而造成发送延迟,这种情况下,即便缓冲区中的数据长度没有达到 MSS,也应该果 断发送出去。为此,协议栈的内部有一个计时器,当经过一定时间之后,就会把网络包发送出去 A。
判断要素就是这两个,但它们其实是互相矛盾的。如果长度优先,那么网络的效率会提高,但可能会因为等待填满缓冲区而产生延迟;相反地,如果时间优先,那么延迟时间会变少,但又会降低网络的效率。因此,在进行发送操作时需要综合考虑这两个要素以达到平衡。不过,TCP 协议规 格中并没有告诉我们怎样才能平衡,因此实际如何判断是由协议栈的开发者来决定的,也正是由于这个原因,不同种类和版本的操作系统在相关操 作上也就存在差异。
正如前面所说,如果仅靠协议栈来判断发送的时机可能会带来一些问 题,因此协议栈也给应用程序保留了控制发送时机的余地。应用程序在发送数据时可以指定一些选项,比如如果指定“不等待填满缓冲区直接发送”,则协议栈就会按照要求直接发送数据。像浏览器这种会话型的应用程 序在向服务器发送数据时,等待填满缓冲区导致延迟会产生很大影响,因 此一般会使用直接发送的选项。
MTU:Maximum Transmission Unit:一个网络包的最大长度,以太网中一般为1500字节。
MSS:Maximum Segment Size:除去头部之后,一个网络包所能容纳的TCP数据的最大长度。
最大分段大小。 TCP 和 IP 的头部加起来一般是 40 字节,因此 MTU 减去这个长度就是 MSS。例如,在以太网中,
MTU 为 1500,因此 MSS 就是 1460。TCP/IP 可以使用一些可选参数 (protocol option),如加密等,这时头部的长度会增加,那么 MSS 就会随着头部长度增加而相应缩短。
数据大
滑动窗口
所谓滑动窗口,就是在发送一 个包之后,不等待 ACK 号返回,而是直接发送后续的一系列包。
TCP整体流程
UDP
作为iOS出身,深受那一代人影响。所以第一个抓包工具使用的是Charles 俗称青花瓷,有免费版本,不过会定时的弹框。受限于中间人抓包法,注定无法捕获全部的包。
抓包神器 Wireshark
参考资料