IP 协议

1.前置知识

网络协议栈自上而下,分别是应用层,传输层,网络层,数据链路层,在之前的文章中,小编已经讲解了应用层http,https,传输层ucp,udp,下面我们进入网络层的IP协议的学习,使用一个故事开始IP协议的学习

假设你数学能力非常好,你具有数学考满分的能力,但是你一定能做到次次数学考试数学都能拿满分吗?不一定,你只是有很大概率拿满分,差不多是10次数学考试你可以稳定在7次都拿满分,所以今天学校考了一场数学考试,很不幸,你考了97分,距离满分还有3分,你很沮丧,十分想要拿到数学满分,所以呢?我们该如何让你次次数学都可靠的拿满分呢?

所以你找到了你的叔叔,你的叔叔是学校校长,好的,既然你在这次的数学考试中没有拿满分,所以叔叔决定,本次数学考试作废,学校重新组织数学考试,采用新的数学试卷,所以你又去进行数学考试了,本身你就有拿数学满分的能力,10次数学考试你可以稳定在7次都拿满分,所以在这一次考试中,你拿到了数学满分,你的叔叔一看,好就以本次数学考试成绩录入学校系统\n虽然例子很简单,但已经足够说明问题了,那么如何保证你次次数学考试都拿满分?你的数学能力+叔叔 = 你的数学考试次次满分,所以你有数学考到满分的能力,但是不能确保次次都考到满分,所以当你数学在考试中没拿到满分的时候,你的叔叔给你提供可靠性策略,不断的重新组织学校考试,直到你拿到数学满分为止

所以你扮演网络层IP协议,你的叔叔扮演传输层TCP协议,IP协议的本质工作就是提供一种能力,将数据跨网络从A主机送到B主机,而用户需要的是,提供一种能力,将数据可靠的跨网络从A主机送到B组织,能力由网络层的IP协议来提供,可靠性策略由传输层TCP协议来提供,例如快重传,超时重传等。

IP地址=目标网络+目标主机

如果主机B要给主机C发数据,首先主机B在IP头里填好自己的源IP和主机C的目的IP。目的IP里的"网络部分"就是主机C所在的那个子网,"主机部分"就是主机C本身。

那主机B怎么把数据送过去呢?它肯定不能直接跨网络发,得先交给自己所在子网里的路由器。这个路由器一看目的IP的网络部分,发现不是自己这个网段的,就开始按路由规则找路径,把数据转发到下一个子网。

接着收到数据的下一个路由器,也做同样的操作:检查目的网络,再往下转发。就这样一步步跳,直到数据送到主机C所在的那个子网。到了这一步,路由器再根据目的IP的"主机部分",把数据精准交给主机C。

整个过程其实也就是一个数据的传输需要"先到网络,再到主机"的逻辑:跨网络传输,必须先送到目标主机所在的网络,再从这个网络送到目标主机本身。

故事理解

假设学号是"学院号 + 个人编号",比如小帅是计算机学院123号,学号123007;小美是文学院125号,学号125005。

小帅捡到了小美丢失的学生证,小帅最开始想的是挨个问人学号,这效率太低了,学校一万多人,找不着。后来他换了个思路:先看学号125005的"学院号125",知道不是自己学院的,于是找计算机学院学生会主席。主席再在各个学院主席的群里问,最后文学院主席认出125是自己学院,让小帅把钱包给自己,文学院主席接过钱包。到了文学院主席这里,再按"个人编号005"找到小美。

这个故事里面,小帅就是计算机学院里面的一个主机,学院主席就相当于路由器,先把东西送到"目标学院(目标网络)",再在学院里送到"目标同学(目标主机)"。

我们把格局再放大一点:学校里各个学院主席在一个大群,这就像一个校园网;各个学校的校主席再组成一个大群,就变成跨校网络。对应到全球互联网,国家、省、市、县、村的各级代表,就像不同层级的路由器,而村里的人就是终端主机。通过这种层层递进的网络结构,就能实现全球任意两台主机的通信。

2.协议头格式

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.。

4位首部长度(header length): 单位为4字节,4bit表示最大的数字是15, 因此IP头部最大长度是60字节,4为首部长度为5,5*4=20说明没有选项,如果大于5,说明有选项。

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模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记.

13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).

8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由(一个数据包到达路由器一套动作), TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。

8位协议: 表示上层协议的类型,例如传输层是tcp协议,网络层是ip协议,所以tcp协议将报文向下交付到ip协议的时候,会设置宏字段6然后交给ip协议,这里的报文向下交付我们可以理解为函数调用,报文,宏字段6交给ip协议可以理解为传参,这个字段就可以标识上层协议是tcp协议,所以ip协议就会将8位协议初始化为6。

16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.

32位源地址和32位目标地址: 表示发送端和接收端.

选项字段(不定长, 最多40字节): 略

3.分片和组装

3.1 分片

16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).

在数据链路层中,也就是网卡,是有MTU限制的,通常为1500字节,在TCP协议中,我们也说过,发送一次的数据不会超过MTU的大小的。

所以TCP协议叫给IP协议,之后交给网卡的数据,如果大于了1500字节,IP协议就需要对这些数据进行分片。假设TCP交付的数据为4440字节的话,IP协议判定已经超过了1500字节,进行分片,4440/3=1480字节,之后每一个分片加上IP协议的报头20字节刚刚好为1500字节。

IP协议的对这3个分片的报头中的16位标识会采用同一个数字,来表明这3个分片组起来才是一个完整的报文,16位标识可以表示的范围最小为0,最大为65535,操作系统会维护一个全局的计数器,范围就是从0到65535,每发送一个IP数据报,全局的计数器就加1(当全局的计数器的值超过了65535之后就重新从0继续开始计数),然后将这个全局计数器加1后的值赋值给报文的16位标识。假设16为标识为1234.

IP协议的对这3个分片的报头中的3位标识字段第三位进行设置,将前两个设置为0,第三个设置为1,表示这个是分片的最后一个。

IP协议的对这3个分片的报头中的13位分片偏移,这个偏移是不算IP协议的报头的,所以第一个设置为0,第二个设置为1480,第3个设置为2960。但是13位分片偏移是以8字节为单位的,所以应该是0,1480/8=185,2960/8=371。使用0,1480,2960更好理解,所以这边就先这样子写了。

3.2 组装

当对方收到了数据,之后,交付到IP协议层,当发现有多个IP报文的16位标识一样是,就明白了数据被分片了,之后我们通过3位标识字段确定最后一段,根据13位分片偏移很轻松就可以组装在一起了。

(一)对于开头的分片丢失,首先我们是可以判断出来一个IP报文是被分片了的,所以此时我们就等待多个分片,将所有分片根据16位标识聚集起来,但是发现13位片偏移没有为0的,此时就说明开头的分片丢失了,因为在所有的分片中,只有开头的分片的13位片偏移位0,其余的分片都不为0

(二)对于结尾的分片丢失,那么将所有分片根据16位标识聚集起来,发现聚集起来的分片中的更多分片的标志位没有为0的,说明此时结尾的分片丢失,因为在所有的分片中,只有结尾的分片的更多分片的标志位为0,其余的分片都为0

(三)对于中间的分片丢失,例如此时收到了开头的分片和结尾的分片,那么对于结尾的分片来讲,它的13位片偏移此时对应的字节数为2960,但是它前面的字节数只有开头的分片所对应的字节数1480,此时就说明中间的分片丢失了,如果中间的分片没有丢失,那么此时结尾的分片前面的分片的字节数的大小应该是2960,即开头的分片去掉IP报头的大小加上中间分片去掉IP报头的大小等于结尾的分片13位片偏移对应的字节数2960

3.3 是否建议分片

不建议,因为进行了分片也就意味着发送方发送的报文的数量变多了,假设一个报文的丢包概率是百分之1,那么经过分片之后分成了10个报文,那么10个报文丢包的概率就会变大,所以将报文分片之后,丢包的概率会增加。

并且将IP报文分片之后,分片之中任何一个分片丢失,TCP的超时重传是会将这报文进行重传的,将会消耗系统资源,网络资源,网络带宽压力增大的概率就更大。

那么对于数据链路层不能一次发送过大报文,所以就要求网络层IP协议不能交给数据链路层过大的报文,可是事实是网络层IP协议也是一个办事的,它添加的IP报头仅仅占报文中的20个字节,真正的报文发送多少的控制者是处于传输层的TCP决定的,所以我们尽可能的减少分片还要从TCP这个根源入手

在网络层有MTU等于1500,要求网络层IP协议交付给数据链路层的报文最大不能超过MTU对应的1500字节,那么IP协议是始终要封装IP报头的,IP报头的大小是20个字节,所以对于一个IP报文来讲,IP报文 = IP报头 + 有效载荷,IP报文最大长度不能超过MTU对应的1500字节,IP报头为固定长度20字节,所以有效载荷的最大长度 = IP报文的最大长度 - IP报头 = MTU - 20 = 1500 - 20 = 1480

所以IP报文的有效载荷的最大长度为1480,那么此时我们就要思考IP报文的有效载荷来源于哪里?来源于传输层的tcp,所以也就意味着tcp报文的最大长度为1480,那么tcp报文 = tcp报头 + 有效载荷,而tcp报文的最大长度为1480,tcp报头为固定长度20字节,所以在tcp协议上,有效载荷的最大长度为1460,我们把tcp的有效载荷发送最大长度对应的1460叫做MSS

为了效率考虑,滑动窗口分成的段以MSS对应的1460为一个段,每次发送的最大数据位一段,所以在传输层使用tcp协议可以有效避免报文在IP协议分片。

那么如果传输层是udp呢?

无法避免,因为udp是面向数据报的,udp也没有滑动窗口,也无法分段,也无法让发送的udp的有效载荷的长度不超过MSS,所以一旦udp发送的有效载荷的长度超过MSS,那么IP协议就会对udp报文进行分片,但是udp其实也不怕分片丢失,因为udp的特性就是不可靠的,即使分片丢失,我udp也不重发,因为udp的特性就是不可靠的

4.网段划分

IP地址分为两个部分, 网络号和主机号

网络号 : 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

例如192.168.128.10,其中192.168.128是网络号,10是主机号

(一)网络号,保证相互连接的两个网段具有不同的标识,同一个网段内的网络号的值都相同

(二)主机号,同一网段内,每一个主机的主机号的值不能相同

关于路由器,我们需要有一些认识

(一)首先路由器也是特定一个子网的主机,即路由器也需要有操作系统,路由器也要配置IP地址

(二)路由器一定要至少要连接两个子网,路由器也就相当于同时在两个子网,如何做到的呢?如上图中间红色框的路由器的上下两个子网,让路由器配置多个IP地址即可,一个网卡对应一个IP,路由器配有多个网卡即可做到配置多个IP地址,所以路由器也就可以进行报文的跨网络转发了

(三)路由器一般都是子网中的第一台设备,它的IP地址一般都是网络号.1的形式

(四)我们看待路由器的功能的时候,不能单单看到路由器具有ip报文转发的功能,还应该看到路由器具有构建子网(局域网)的功能

子网中主机的IP地址中的网络号相同,不同的子网对应的主机的IP地址中的网络号一定不同,不同子网对应主机的IP地址中的主机号有可能相同

DHCP

如果在子网中新增一台主机,则这台主机的网络号和子网的网络号相同,但是主机的主机号不能和子网中的其他主机的主机号相同

通过合理设计IP地址中的主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同,那么此时问题来了,手动管理子网中的IP地址,是一件很麻烦的事情,所以如何解决呢?

通过DHCP技术即可,有一种技术叫做DHCP,能够自动的给子网内新增的主机节点分配IP地址 ,避免了手动管理IP的不便,一般路由器都DHCP功能,并且路由器也是一个子网内的主机,路由器也有操作系统,所以路由器也可以看做一个DHCP服务器

当我们使用电脑或平板连接家里的 WiFi 上网时,连接上路由器后,就可以上网来访问数据了,其实就是因为路由器在搭建好了之后,会创建一个子网,之后对于连接上来的设备会进行IP地址的分配,网络号是固定的,主机号会找一个没有被使用的编号给连接上来的设备。这个子网内的所有设备,共享同一个 网络号。每个设备的 主机号 必须唯一,否则全网寻址会混乱。

当我们关机或断开 WiFi,DHCP 会 回收这个 IP,下次新设备接入时,这个 IP 可以再次分配。

最初为了简化 IP 地址的网络号/主机号划分,人们把 32 位 IP 分成了五类。

各类地址的结构:

A 类:0 开头 → 7 位网络号 + 24 位主机号

B 类:10 开头 → 14 位网络号 + 16 位主机号

C 类:110 开头 → 21 位网络号 + 8 位主机号

D 类:1110 开头 → 多播组号

E 类:11110 开头 → 保留未用

地址范围:

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

然而随着网络的不断发展,这种划分方式的局限性很快就显现出来,由于B类网络地址的可以划分子网的数量较多,同样的子网内的主机数也较多,所以大多数的组织都申请B类网络地址,导致B类地址很快就分配完了,同样的B类地址存在浪费,A类地址也存在

例如,申请了一个B类地址,理论上一个B类网络的主机号范围最大是6万5千多,所以也就意味着一个B类地址构成的子网可以容纳6万5千多台主机,同样的A类地址可以容纳的主机数比B类地址更多,但是我们想一想,实际的网络架构中,一个子网不可能存在这么多的主机,例如,你的家里的路由器构成的WiFi其实就是一个子网,有几十台主机顶多了,一个B类地址构成的子网虽然可以容纳6万5千多台主机,但是实际用仅仅只有几十台上百台,因此IP地址存在大量的浪费,A类地址也是如此。

后续又提出了CIDR方案

CIDR

(一)核心就是引入一个子网掩码(subnet mask)来划分IP地址中的网络号和主机号

(二)子网掩码的规格大小和IP地址一样,都是32位的正整数,子网掩码通常前面以连续的1,后面以一串连接的"0"结尾。

(三)将IP地址和子网掩码进行按位与&操作得到的就是网络号

(四)网络号和主机号的划分与这个地址是A类,B类,C类无关,仅仅与IP地址和子网掩码进行按位与&有关,所以下面我们来看第一个IP地址和子网掩码按位与的

IP地址是4个字节,以.来分割,140.252.20.68的IP地址与子网掩码进行按位与&,前面的连续的1的个数为24位,所以按位与后,前面24位bit位为网络号,主机号为8个比特位,范围就为0到256了。

IP地址是4个字节,以.来分割,140.252.20.68的IP地址与子网掩码进行按位与&,前面的连续的1的个数为28位,所以按位与后,前面28位bit位为网络号,主机号为4个比特位,由于主机号起始为64,范围就为64到79了。

5.特殊的IP地址

IP地址 = 网络号 + 主机号,将IP地址中的主机号全部设置为0就成为了网络号,代表这个子网(局域网)

将IP地址中的主机号全部设置为1,那么此时这个IP地址就成为了广播地址,用于给同一个链路互相连接的所有主机发送数据包,通俗点来讲,就是当前主机构建报文,将这个报文发送给当前子网范围内的所有主机

127.*的IP地址用于本地环回(loop back)测试,这个地址通常是127.0.0.1。

6.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技术(后面会重点介绍);

IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;

7.私有IP和公有IP

IP地址被硬性分为了私有IP和公有IP

首先我们先介绍一下公有IP

一、 前置背景:

IPv4 地址是有限的,IPv4 地址是 32位(4字节) 的二进制数,理论上能表示约 42.9亿 个地址。

但这是一个巨大的"全球资源",必须进行分层管理,否则全世界的网络会乱成一锅粥。

我们可以把 IPv4 地址想象成一个全球通用的快递编号池。为了让快递能准确送到,我们必须按国家、地区来划分这个编号池。

二、 第一层划分:国家

全球有 197 个国家。

32位的地址空间,用 前 8 位 来标识国家,完全足够(因为 8 位二进制最大能表示 256 个编号)国家编号 = IP 地址的前 8 位。子网掩码: /8 (即 255.0.0.0)。网络号 = IP 地址 & 子网掩码。

假设:

美国:前8位为 00000001 (十进制 1 )。美国的网络段就是 1.0.0.0/8 。

中国:前8位为 00000010 (十进制 2 )。中国的网络段就是 2.0.0.0/8 。

俄罗斯:前8位为 00000110 (十进制 6 )。俄罗斯的网络段就是 6.0.0.0/8 。

当一个美国的用户想访问中国的服务器时,他的数据包首先到达美国的国家级路由器。路由器检查目标 IP 的前 8 位,发现是 2 ,判定这是中国的网络,于是将数据包转发给中国的国际出口路由器。

三、 第二层划分:中国的省级行政区

拿到中国的 2.0.0.0/8 这个大网段后,我们需要继续细分,对应中国的 34 个省级行政区(23省、5自治区、4直辖市、2特别行政区)。

国家用了 8 位,我们再用 6 位 来划分省份。总共用了 8 + 6 = 14 位。子网掩码: /14 (即 255.252.0.0)。可用省份数: 2^6 = 64 个,足够覆盖 34 个省。山东省:假设是第 4 个被划分的省份。那么它的网络号就是 2.00000100.0.0 (二进制),转换为十进制就是 2.4.0.0/14 。北京市:假设是第 1 个。网络号为 2.1.0.0/14 。

数据包到达中国国际出口路由器后,路由器将其转发给山东省的省级路由器。省级路由器检查 IP 地址的第 9 到 14 位,发现是 4 ,于是将数据包交给山东省内的网络。

四、 第三层划分:山东省的地级市

在山东省 2.4.0.0/14 的网段内,我们继续按城市划分。以山东省为例,地级市数量最多的广东省有 19 个,所以用 5 位 来划分城市足够用 ( 2^5 = 32 )。

之前用了 14 位,现在再加 5 位,总共 14 + 5 = 19 位。子网掩码: /19 (即 255.255.224.0)。泰安市:假设是山东省内第 3 个被划分的城市。它的网络号就是 2.4.00100000.0 (二进制),转换为十进制就是 2.4.32.0/19 。济南市:假设是第 1 个。网络号为 2.4.0.0/19 。

数据包到达山东省省级路由器后,转发给泰安市的市级路由器。市级路由器检查 IP 地址的第 15 到 19 位,发现是 32 ,于是将数据包交给泰安市的局域网。

五、 最终定位:城市内的主机

到了城市这一层,剩下的比特位就用来标识具体的主机(电脑、服务器、手机等)。

子网掩码 /19 决定了网络号是 2.4.32.0 。剩下的 32 - 19 = 13 位是主机号。泰安市内的一台主机,主机号为 5 。它的完整 IP 地址就是: 2.4.32.5 。用 2.4.32.5 & 255.255.224.0 = 2.4.32.0 ,网络号正确。

六、 全球数据传输流程(美国 → 中国泰安)

  1. 发起请求:美国的一台主机(IP 为 1.0.0.5 )想访问中国泰安的主机 2.4.32.5 。

  2. 美国路由器:美国主机的数据包到达美国路由器。路由器对比目标 IP 2.4.32.5 和自身网络号 1.0.0.0 ,发现不一致。于是将数据包转发给中国国际出口路由器。

  3. 中国国际路由器:收到数据包。对比网络号 2.0.0.0 ,匹配。将数据包转发给山东省省级路由器。

  4. 山东省省级路由器:收到数据包。对比网络号 2.4.0.0 ,匹配。将数据包转发给泰安市市级路由器。

  5. 泰安市市级路由器:收到数据包。对比网络号 2.4.32.0 ,匹配。将数据包直接交给目标主机 2.4.32.5 。

至此,全球跨网络通信完成。

看上去非常的完美,但是最后剩下13为主机号想要用来表示一个市的主机号是不可能的,2的13次方才8000多,表示一个市的主机数量,不可以的,所以就需要使用私有IP来表示。

私有 IP 是 专门用于局域网内部通信 的 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来表示,只要出了子网,私有IP就可以重复,这样子就可以使用私有IP来表示大量的主机设备了。

一个路由器必须配置两个IP地址, 一个是WAN口IP(公有IP), 一个是LAN口IP(子网IP,私有IP)。

路由器LAN口连接的主机, 都从属于当前这个路由器的子网中. 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复.,但是不同子网中的IP地址就可以重复了。

每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了.

子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地址转换)。

如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买。

8.路由

我们知道数据是一跳一跳的问路的过程,这个一跳一跳的过程就叫做路由。所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

数据包的传输过程也和问路一样。当IP数据包, 到达路由器时, 路由器会先查看目的IP;路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;依次反复, 一直到达目标IP地址;

那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

使用route指令可以查看路由表。

路由表的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

依次和路由表前几项进行对比, 发现都不匹配;

按缺省(default)路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;我们的路由器是至少连接两个子网的,一个是路由器自己的局域网,另一个就是运营商的网络了,192.168.10.1这个地址的路由器其实大概也可能是跳到运营商的路由器上面去了,运营商的局域网里面就都是家用的路由器了,我们的网络是经过精心设计的,来到运营商的网络中,运营商通过查看路由表,最后肯定会继续一跳一跳的到达目标网络。

但是要知道,私有IP是不能出现在公网里面的,所以在不同网段的传输,就需要把私有IP通过NAT技术,将私有IP转化为公有IP,之后使用公有IP进行传输。

相关推荐
9稳2 小时前
基于智能巡检机器人与PLC系统联动控制设计
开发语言·网络·数据库·嵌入式硬件·plc
倔强的石头1062 小时前
技术拆解:P2P组网如何一键远程AI
人工智能·网络协议·p2p
记忆多2 小时前
tcp的编程 三次握手 四次挥手
服务器·网络·tcp/ip
以太浮标10 小时前
华为eNSP模拟器综合实验之- ACL控制列表核心命令全解析及场景应用
运维·网络·网络协议·华为·信息与通信
yosh'joy!!10 小时前
IT/OT接口规范
网络协议·接口·modbus tcp·modbus rtu
AI+程序员在路上10 小时前
CANopen 协议:介绍、调试命令与应用
linux·c语言·开发语言·网络
江畔何人初10 小时前
kube-apiserver、kube-proxy、Calico 关系
运维·服务器·网络·云原生·kubernetes
网安Ruler11 小时前
UDS 协议分析及模拟测试
网络
weiwx8312 小时前
Nginx location 和 proxy_pass 配置详解
服务器·网络·nginx