目录
2.2. 8位生存时间 ,32位源IP地址和32位目的IP地址
1.TCP和IP的关系
我们之前已经学习了TCP,当时我们在进行讲解时,是站在上帝视角直接说A主机将数据段发送到B主机,可是A主机真的是直接将数据段发送到对方吗?
其实并不是,传输层的数据段是要向下交付到网络层的,那TCP究竟在数据网络传输的过程中扮演了什么样的角色呢?网络层的核心工作又是什么呢?我该怎样理解这两层协议栈呢?
网络层能够提供将一个数据包从A主机跨网络发送到B主机的能力,但有能力一定能够做到吗?
在我们生活的世界中,没有任何一件事情是100%能够发生的,因为任何事情都是有概率的,比如你们班的数学学霸张三,他具有每次数学考150的能力,但这能代表他每次考试一定能考150吗?
这是不一定的!我们只能说它具有非常大的概率能够做到将数学考试的成绩达到150,但如果张三的父亲是学校的校长,他父亲要求张三必须每次考试都考到150,如果这次考试没到150,那他父亲就将这次考试作废,直到张三考到150为止,这叫他父亲提供给张三的策略。
同理,我们说网络层能够提供将一个数据包从A主机跨网络发送到B主机的能力,但这并不代表网络层一定能够做到!有没有可能网络出现拥塞,而数据包大面积丢失的情况呢?或者对方接受能力太小,网络层发送数据包的速度太快,导致对方来不及接收从而丢弃掉许多报文呢?或者对方迟迟没有返回报文,发送方又该怎么做呢?所以网络层不仅仅面临着只将数据包跨网络发送的要求,还有一些其他在网络传输过程中可能面临的问题,而这些问题由谁来解决呢?其实就是传输控制协议TCP来解决
所以我们说TCP提供了数据包跨网络发送的策略,比如超时重传,确认应答,流量控制,拥塞控制,滑动窗口,捎带应答,延时应答等等,这些都是数据包在网络发送时,如果出现了不可靠的问题,数据包应该怎么处理?这些都是由TCP来控制。
而IP层提供了数据包跨网络发送的能力,比如IP层会通过报头中的目的IP来查路由表,确定数据包的下一跳位置,IP层只负责将数据包交付到下一跳,至于传输过程中出现了什么问题,这是TCP层提供策略来进行解决的,IP层不关心,也不会做什么。
所以我们称,TCP提供数据跨网络传输的策略,而IP提供数据跨网络传输的能力,两者合在一起就一定能够保证数据包可靠的跨网络从主机A发送到主机B,这也就是为什么很多人叫TCP/IP协议的原因,因为这两个协议可以可靠的保证数据包跨网络送到目标主机,而这正就是网络通信的本质。
2.IP协议报文
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4
- 4位头部长度(header length):IP头部的长度,基本单位是4字节,也就是length * 4的字节数。比如length = 4,那么报头长度(包括选项)就是4*4=16。4bit表示的最大数字是15,因此IP报头的最大长度是60字节。因为20字节是固定长度,所以选项部分最大为40字节
- 8位服务类型(Type of service):3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须为0,后续发展补充)。4位TOS分别为最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个,对于ssh/telnet这样的应用程序,最小时延比较重要;对于ftp这样的程序,最大吞吐量比较重要
- 16位总长度(total length):IP数据报整体占多少字节
- 16位标识(id):唯一的标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里的标识都是相同的
- 3位标志字段:第一位保留(现阶段不用,后续发展补充);第二位为0表示禁止分片,此时如果报文长度超过MTU长度,该报文就会被直接丢弃;第三位表示“更多分片”,如果分片,最后一个分片的“更多分片”标志位为0,其他都是1
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,其实就是在表示当前分片在原报文中处于哪个位置,分片偏移的单位是8字节,即如果分片偏移是100,那么实际偏移字节数就是100 * 8 = 800。因此,除了最后一个报文,其他报文的长度必须是8的整数倍(否则报文就不连续了)
- 8位生存时间(Time of live——TTL):数据报到达目的地的最大报文跳数,一般是64。每经过一个路由,TTL - = 1,一直减到0还没到达,那么就丢弃这个报文。该字段主要用来防止出现路由循环
- 8位协议:表示上层传输层协议类型
- 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏
- 32位源地址:发送端,源主机IP地址
- 32位目的地址:接收端,目的主机IP地址
- 选项字段:不定长,最多40字节
2.1. 4位首部长度,16位总长度,8位协议
2.2. 8位生存时间 ,32位源IP地址和32位目的IP地址
至于16位标识,3位标志,13位片偏移,我们放到下面去。
3.IP地址的划分
3.1.IP地址的表现形式
事实上在计算机内部IP地址是32位比特位的数字,为了方便表示,就会采用点分十进制的形式
上面这个是万变不离其中的。但是由此先后诞生了两种划分方式
接下来来好好了解一下。
3.2.旧版IP地址的划分
3.2.1.旧版IP地址的划分思路
我们处于一个精心设计的世界里面,我们一出生就有身份证号,上线了就有学号。但是我们仔细看看这个学生证号码,它们仅仅只是一个数字吗?它里面是不是包含了我们的班级学号啊。比如23044217就代表23044217班17号,而这个230442里面的23是23届,04是4号学院,4是4专业,2是2班。 一个学号就能找到你的基本消息。这个学号和我们的IP地址也是一样的。IP地址里面包含了主机大量信息。
学校里面,会划分很多的学院,每个学院内又会细分很多专业,每个专业里面都有不同年级的学生,每个学生都有自己的学号,学校管理所有学生的前提是,先能够找到或者定位出任意一个学生,为了方便管理,学校会增设很多的职位。比如 每个学院都有一个院学生会主席,每院学生会主席会建一个群,把各专业的主席拉进群,每个专业的主席又会建一个群,把自己专业里的人拉进去。这样子就很好管理了。
比如理学院的张三同学找到了一张学生卡,因为我们知道学生卡上的学号都是经过设计的,前多少位代表院号,后多少位代表学生的专业号,后多少位代表专业里面学生的编号,入学年份等等信息,所以张三一看就知道这个学生卡不是他们学院的,
张三此时在他专业群里告诉专业主席,专业主席看到后在他们学院的专业主席群里发信息给,他们院的学生会主席看到后在校学生主席群里发一条失物招领,所以这张学生卡就被电子信息工程的学生会主席看到了,他一说这不就是我们院的学生卡吗?
他就把这个学生卡拿到他们院,然后再向下问各个专业的主席,这张卡是哪个专业的,专业的主席认领之后,在本专业的群里面吼一声,谁的学生卡丢了?赶快过来认领来,最后李四就拿到了他的学生卡。
在上面的故事中,有一个非常重要的细节,就是查找学生卡所属的学生时,所做到的排除,当学生卡交给理学院的学生会主席时,我们立马可以排除掉除电子信息工程之外的其他所有学院,同时当学生卡交到电子信息工程的各个专业主席的群里时,立马就可以排除掉李四专业以外的其他专业,最后在李四专业的群里面,通过一个个学生的确认,最后让李四拿到自己的学生卡。
其实能够做到一下子排除一大批非目标的其他元素,主要就是因为分治思想,在宏观层面上做了很多的划分,互联网里面做了网段划分,国家里面做了很多省的划分,省内又做了很多城市的划分,城市里面做了各种区或县的划分,各个现或区又会做街道的划分,为什么要划分呢?其实就是为了方便国家能够快速定位一个人,从而对国家的人民进行管理。
其实这对于互联网也是如此。
我们都先要标识每台主机,网络通信是通过源IP,目的IP来标识源主机和目的主机
事实上,我们看到的像“192.33.432.82”这种IP地址,IP地址是由两部分组成的:目标网络+目标主机
任何主机都是在一个子网里面的,子网里面有多台主机。
我们要跨网络发送给这个主机,我们就要先将消息发到该主机处于的子网,子网再将这个消息转发给主机。
- 对于互联网也是相同的,为什么要进行网段划分呢?
其实就是为了方便互联网能够快速定位一台主机,因为每次确认主机时,排查的效率高,一次能够排除多个子网,这也是为什么IP要分为目标网络和目标主机的原因。
3.2.2.分类划分法
最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。
同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。
IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。
这些类别是根据IP地址的第一个字节(8位)来划分的,其中不同类别具有不同的网络号和主机号分配方式。下面详细解释每个类别:
A 类地址:
- 范围:1.0.0.0 到 126.0.0.0
- 网络号:第一个字节(8位)用于网络标识,剩下的 24 位用于主机。
- 最大主机数:约 16,777,214(2^24 - 2,减去两个保留地址:全0和全1)。
- 适用场景:A 类地址通常分配给大型组织或互联网服务提供商,因为它们允许大量主机。
B 类地址:
- 范围:128.0.0.0 到 191.255.0.0
- 网络号:前两个字节(16位)用于网络标识,剩下的 16 位用于主机。
- 最大主机数:约 65,534(2^16 - 2)。
- 适用场景:B 类地址通常分配给中等规模的组织或网络。
C 类地址:
- 范围:192.0.0.0 到 223.255.255.0
- 网络号:前三个字节(24位)用于网络标识,剩下的 8 位用于主机。
- 最大主机数:约 254(2^8 - 2)。
- 适用场景:C 类地址通常分配给小型组织或私人网络。
D 类地址:
- 范围:224.0.0.0 到 239.255.255.255
- 特点:D 类地址用于多播(Multicast),不分配给单独的主机或网络。
- 适用场景:用于一次向多个目标发送数据包,例如视频流或音频流。
E 类地址:
- 范围:240.0.0.0 到 255.255.255.255
- 特点:E 类地址是实验性地址,不常用,保留用于特定用途。
- 适用场景:用于实验、研究或未来网络发展。
私有IP地址是在互联网上不被路由的IP地址,专门为组织内部网络(如企业内部、学校等)设计。这意味着这些地址只能在局域网(LAN)内部使用,不能直接用于互联网通信。然而,通过网络地址转换(NAT),它们可以用于互联网通信。
局域网是不直接连接到公网上的,所以理论上局域网使用任意的ip地址都可以,但RFC1918规定了组建局域网时只能使用的ip地址,我们将这些ip地址称为私有ip,之前我们说ip地址具有唯一性,指的是公网ip具有唯一性,内网ip是可以重复的,这正好能解决ip地址不足的问题,因为大量的局域网主机都使用的是重复的内网ip地址。
内网ip地址可划分为三类:
- (1)10.* ,也是10.0.0.0 - 10.255.255.255 (10.0.0.0/8),
/8
表示网络部分占据了前8位,剩下的24位用于主机部分。前8位为固定网络号用法,共1677,7216个地址,后面的24个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网的ip该类地址比较常见) - (2)172.16. *到172.31. *,也是172.16.0.0 - 172.31.255.255 (172.16.0.0/12)。
/12
表示网络部分占据了前12位,剩下的20位用于主机部分。同样的,前12位为固定网络号用法,共104,8576个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(公司内网和学校中,该类ip地址比较常见) - (3)192.168. *,也是192.168.0.0 - 192.168.255.255 (192.168.0.0/16)。
/16
表示网络部分占据了前16位,剩下的16位用于主机部分。同样的,前16位为固定网络号用法,共65536个地址,后面的16个比特位,可以通过子网掩码来划分出具体的网络号位数和主机号位数(家庭中的ip地址一般这类比较常见)
任何在此范围内的IP地址都可以被任何组织或个人在其内部网络中自由使用,而无需向全球互联网注册机构申请。每个私有IP地址可以在任何数量的网络中重复使用,因为这些网络从不直接相互通信(指的是网络与网络之间不直接相互通信,但通过网络地址转换(NAT),可以用于互联网通信)。
4.3.公网IP
公网IP(Public IP):
- 公网IP地址是可以在全球互联网上访问的IP地址,它们是唯一的,用于标识设备或服务器在互联网上的位置。
- 当您通过互联网与外部资源通信时,通常使用公网IP地址。
- 公网IP地址通常由互联网服务提供商(ISP)分配给您的路由器或服务器。
- 每个互联网连接都需要至少一个公网IP地址,以便在全球互联网上进行通信。
4.4.私有IP和公网IP的区别
2 个例子给你说明白
5.理解运营商在上网中的作用
运营商通常是指提供移动通信、互联网、有线电视等通信服务的公司或组织。这些公司负责搭建和维护通信基础设施,例如移动电话网络、互联网网络和有线电视网络,使人们能够进行语音通话、数据传输和观看电视节目。
举个例子来理解一下。
一个家庭想要能够上网,都需要做哪些准备工作呢?
- 首先肯定是有运营商,在你家附近有网络覆盖。
- 你这个家庭联系运营商进行光纤入户。
- 工作人员上门安装调制解调器(就是我们平常所说的 “猫儿”)和 无线路由器。
- 工作人员给你开户,配置路由器账号、密码(这套账号密码是运营商认证你们的账号密码)。
- 配置你自己的账号、密码(这套账号密码是你登录路由器连接网络所需要使用的,账号通常可直接设置为你的手机号)。这套账号密码是用来认证连接的成员的。
- 正常上网,正常按月按年交费。
6,路由器
6.1.路由器在局域网的作用
我们所使用的家用路由器:
- 对内:面对自己构建的子网;
- 对外:自己本身是被人构建的子网的一个主机。
6.2.路由器的结构
路由器在其物理结构上通常具有两主要类型的网络接口,分别是LAN口(局域网口)和WAN口(广域网口),我们将LAN口的IP地址叫做LAN口IP,也叫子网IP;将WAN口的IP地址叫做WAN口IP,也叫做外网IP.
它们在网络连接和数据传输中扮演着不同的角色:
LAN口(局域网口):
- 局域网接口:LAN口通常用于连接本地网络内的设备,如计算机、手机、智能家居设备等。这些设备通常位于同一个物理位置,例如您的家庭或办公室内。
- 本地数据交换:LAN口用于在局域网内传输数据包,使本地设备能够相互通信,共享文件、打印机、互联网连接等。
WAN口(广域网口):
- 广域网接口:WAN口通常用于连接到广域网,如互联网服务提供商(ISP)的网络。这是您的局域网与外部互联网之间的关键接口。
- 外部数据传输:WAN口负责将数据包从局域网传输到外部网络(互联网),并将来自外部网络的数据包传送回局域网。这是实现互联网连接的关键。
- WAN口IP,也可理解为自己所在的上级子网所分配的IP。说是广域网口也不是很准确。
- WAN口IP可能是私有IP,也可能是公有IP。一般来说,处于全球网络通信体系越靠近最顶层的路由器的WAN口IP就越有可能是1公网IP,而处于通信体系最底下的那些路由器的WAN口IP就是私有IP
- 一般来说,运营商提供的路由器的WAN IP是公网IP,这样可以让用户能够连接到互联网。而用户自己家里的路由器的WAN IP则通常是运营商分配的私有IP,用于内部网络的连接和管理。
我们使用的电脑,家用路由器,运营商路由器,广域网以及我们要访问的服务器之间的关系大致如下:
通过上图我们也能发现:
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1)。子网内的主机IP(私有IP)地址不能重复,但是子网之间的IP地址就可以重复了。
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了。
- 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的IP地址成为一个公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。这样的服务器可以在阿里云/腾讯云上进行购买。
因为有了私有IP,每个局域网内的私有IP是可以重复的,这样就大大缓解了IP地址不足窘迫。通常在局域网中使用网络地址转换(NAT)技术(本质上就是不断的将私有IP向上替换成公网IP进行通信),将多个内部设备共享一个公网IP地址,以便它们可以访问互联网。
6.3.NAT技术
- 一个路由器可以配置两类IP地址,一个是WAN口IP,一个是LAN口IP
- 路由器LAN口连接的主机,都从属于当前这个路由器的子网中
- 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),即子网的第一个IP。子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了,即两个子网允许出现相同的主机号
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了
- 子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址进行替换(将源IP地址替换成WAN口IP),这样逐级替换,最终数据包中的IP地址会成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有公网IP的服务器上,这样的服务器可以在阿里云/腾讯云等等云服务平台购买
路由器在做IP地址替换时,还会将源IP和目的IP的映射关系保存,记录在NAT转换表中。
6.3.1.NAT IP转换过程
- 在上图,10.0.0.10和10.0.0.11这两台主机都向目标地址是163.221.120.9:80发送消息
- 在NAT路由器内部,会维护IP地址+端口号转换的表——NAPT转换表
- 这两条消息到了NAT路由器,路由器会根据NAPT转换表将源地址10.0.0.10替换成全局的IP 202.244.174.37,然后再转发出去
- NAT路由器收到外部的数据,也是一样的,会根据NAPT转换表,把目标IP从202.244.174.37替换成10.0.0.10
当局域网内的主机访问公网主机时,通常情况下,局域网出口路由器会将发往公网主机的数据包进行网络地址转换(NAT),将数据包中的源IP地址修改为路由器的公网IP地址,以便公网主机能够正确地返回响应。
在进行 NAT 转换时,路由器会将源 IP 地址+端口号替换为它自己(路由器)的公网 IP 地址+端口号,并在其 NAPT 转换表中记录转换信息,以便在接收到响应数据包时,能够将目标 IP 地址从公网 IP 地址转换为对应的私有 IP 地址,并将响应数据包发送回相应的局域网主机。
具体而言,当出口路由器接收到返回的数据包时,它会检查数据包的目标 IP 地址+端口号。然后,根据NAPT转换表中的映射关系,找到对应的私有 IP 地址+端口号。接着,出口路由器会将数据包的目标 IP 地址+端口号修改为对应的私有 IP 地址+端口号,并将数据包发送到局域网内的相应主机。
总结一下,就是
6.3.2.NAT技术的使用
局域网中的数据包在发送到公网的过程中,其实是要做源ip地址替换的,像图中绿色的箭头就是数据包的流向(这里我就先不说路由选择的事情,直接先说数据报跳到下一跳后,下一步要做的工作,至于路由选择的事情,后面会详细去讲。)
当数据报从客户端主机发出去的时候,会到达自己所在局域网的出口路由器,也就是图中的家用路由器,然后数据报中的IP层的源ip字段就会被路由器替换为路由器自己的Wan口ip10.1.1.2,当路由器将数据包发送到运营商路由器时,运营商路由器会将IP报头中的源ip字段又替换为自己的Wan口ip122.77.241.4,最终由运营商路由器将报文发送给公网上的服务器主机122.77.241.4。
这样不断将数据报中的源ip替换为路由器的Wan口ip的技术,其实就是NAT技术,而ip地址不足的问题能够得以解决,主要是有两个原因,
- 一是通过局域网划分是私有ip大量重复的使用,
- 二是私有ip可以通过NAT技术访问到公网上的服务器,
如果往细说一说的话,其实能够让私有ip访问到公网上的服务器,并不是因为NAT技术,而是因为目的ip和网络中每个节点的路由表,NAT技术配套的还有NAPT技术,如果没有NAT技术就没有NAPT技术,所以说NAPT实际上解决的是数据包如何从服务器返回的问题,NAT解决的是数据包如何从内网转发到公网的问题。
6.4.众多补充知识点
由于相互连接的两个网段是会有桥接设备路由器的,当路由器收到来自外边的数据报要转发到他所管理的各个网段中的某一个网段时,如果这些网段的网络号都相同,那路由器就无法路由转发该数据报,而路由器在组建局域网的时候,是绝对不会这样组建的。
如果两个网段之间并没有任何桥接设备,他们各自用的路由器并不相同,就像下面的两个网段,两个网段的网络号都是192.168.1.0,但两个网段并没有连接,并不会出现各自的路由器不知道该将数据报发送到哪个网段的情况,因为两个路由器各自都管着自己的家庭局域网,之间并没有交集,所以这两个家庭局域网的网络号是允许相同的。
像路由器这样的设备,一定是桥接了很多的子网的,所以路由器会配有多块网卡,每个网卡对应不同的子网接口,能够与不同的网段建立连接。
图中的路由器桥接了两个网段,则路由器在这两个网段中就应该各自有该网段中的ip地址,比如下面中间的路由器,他既有在家庭局域网中的内网ip192.168.1.1,又有路由器和路由器之间所构成的局域网的内网ip10.1.1.2,前者一般称之为Lan口ip,指的是路由器对内管理的局域网中自己的ip,后者一般称之为Wan口ip,指的是路由器对外,自己作为局域网中的一台主机时,自己的ip。
像网段1右边的运营商的路由器同样也有自己的Lan口ip和Wan口ip,对内管理着其他路由器,所以Lan口ip是10.1.1.1,对外自己作为局域网中的一台主机,有着自己的对外的公网Wan口ip122.77.241.4
不同的网段,如果是相互不桥接的网段,出现相同的私有ip是一件非常正常的事情,只要保证他们各自可以访问公网就可以了,这也是一定能够做到的,因为他们是互不连接的网段,之间并不会影响。
如果是相互桥接的网段,两个网段的网络号是不能重复的,同时也不能出现相同的私有ip,比如网段1的网络号是192.168.0.0,网段2的网络号是192.168.101.0,如果两个网段出现了相同的私有ip,则会导致连接两个网段的桥接路由器在转发来自外部报文时,出现不知道发给谁的问题,比如两个网段中,同时存在192.168.101.26ip地址,那当路由器在确定该ip地址应该去的网段时,网段1和网段2都能去,因为他们各自的子网掩码是FF FF 00 00和FF FF FF 00,一旦按位与后,两个网段都应该去,这一定是错误的!
所以相互桥接的网段中,各自是不能出现相同的私有ip的!路由器是可以控制这件事情不发生的,因为路由器具有DHCP的功能。
从所有的局域网的角度来看,无论各个局域网之间是否相互桥接,我们都是可以大面积,高频率的使用那三类私有ip地址的,所以,这就可以解决ipv4地址不足的问题,因为大量的私有ip地址可以在不同的网段中被重复的使用,这样就可以省下很多的公网ip留到公网环境中去使用,比如给大型的互联网公司这些公网ip,让各个局域网的主机都能访问到公网的同一台的服务器。
一个路由器会桥接不同的子网,那路由器就会同时处于不同的网段中,在这些网段中,路由器都要有自己的ip地址,且这些ip地址都不能相同,同时路由器既可能对内管理多个网段,也可能对外同时处于多个路由器组建的局域网,所以路由器可能会维护多个Lan口ip或多个Wan口ip,在配置路由器时,只要给路由器多配几块网卡就可以实现路由器的多ip地址了。
如果不进行源ip的替换,就无法看到局域网主机的公网ip地址了,虽然源ip的替换无法解决数据报路由到下一跳的问题,因为这个问题实际上是由目的ip+节点路由表的方式来解决的,但源ip替换的价值其实并不是体现在数据包路由上的,而是解决ipv4地址不足的问题,它能够让不同的局域网主机共享一个公网ipv4地址。
多个局域网主机共享一个公网ipv4地址:这个功能是NAT最大的价值,这可以解决ipv4地址不足的问题,因为它可以让许多的私有ip共享同一个公网ipv4地址。
隐藏内部网络拓扑结构:这个作用可以算是捎带的,看一下就好,时间长了肯定也会忘,但上面的功能是NAT技术最大的价值,一定要记住!当内部设备通过 NAT 路由器访问互联网时,外部网络只能看到 NAT 路由器的公网IP地址,而无法直接获知内部设备的真实IP地址,这样就隐藏了内网的拓扑结构。
其实局域网中的所有主机都可以查到自己的公网ip,就像下面图中左侧四台客户端主机的公网ip就是运营商路由器的Wan口ip122.77.241.4/24,因为他们所处的局域网数据包最终转发到公网时,他们的源ip都会被替换成连接公网的路由器的Wan口ip,所以这些局域网的主机会共享同一个公网ip。同时右侧的两台客户端主机也是如此,他们也会共享同一个公网ip,正是右侧连接公网的路由器的Wan口ip122.77.241.5/24
这是一定会发生的!因为我们知道ipv4地址不足的问题能够得以解决,靠的就是组建局域网的ip地址是能够大量高频率被使用的私有ip地址,那么这些私有ip地址对应的主机是一定要能够访问到互联网的,那么也就是说这些主机一定要有配套的公网ip,公网ip只有大概42亿,所以许多的局域网的主机一定会共享一个公网ip的。
下面是我的移动设备手机和笔记本连接我家的局域网时,查到的公网ip,左侧是通过windows命令行curl 4.ipw.cn和一个查询公网ip的网址查出来的结果,右侧是我的手机用同样的查询公网ip的网址查出来的结果,可以看到我的移动设备的公网ip和笔记本相同,我还看了我姐的手机和我妈的手机,他们的公网ip和我的两个设备的公网ip全部相同!
两个局域网中的主机无法通过发送数据报的方式直接进行通信,因为我们说过目的ip大部分情况都得是公网ip,而局域网中的主机会存在大量重复私有ip的情况,如果数据报的目的ip是私有ip的话,那数据报其实是不知道该去哪里的,因为网络中可能很多的局域网中都有主机的地址是数据报的目的私有ip,所以我们称下面的两个局域网中的主机是没有办法直接进行通信的。
其实之前我们写过一个UDP版本的聊天室的socket通信代码,他的逻辑和QQ是类似的。
我们用的QQ的客户端和服务器端都是腾讯公司写的,当我们登录QQ时,其实就是本地的客户端进程和腾讯的QQ服务器建立了TCP连接,如果你此时给你的朋友发消息,其实你并不是直接将消息发送给你的朋友了,消息一定是先被发送到了腾讯的服务器上,然后再由腾讯的服务器把你发送的消息推送给你的朋友,如果你的朋友是在线状态,也和服务器建立了连接,那你的朋友会立刻收到由服务器转发的消息,如果你的朋友不在线,那服务器会先缓存这批消息,等下次你的朋友上线的时候,服务器会将之前你发的消息,再推送给你的已经上线的朋友。
推送的方式也很简单,只要你登录了QQ,服务器就与你建立了连接,那么你们之间就有通信可以使用的sockfd1,服务器只需要将你的消息暂存到一个buffer里面,当你的朋友与服务也建立连接之后,你的朋友的QQ客户端和服务器也会有通信时使用的sockfd2,服务器只需要将buffer中的数据通过调用send接口和sockfd2参数,就可以将消息推送到你的朋友那里。
所以我们说局域网中的客户端之间是无法直接进行通信的,必须由公网上的服务器主机来间接实现你们俩之间的通信,例如图中两台主机都和服务器建立了TCP连接,此后两台主机之间的通信,服务器就做一个消息的中转站,将消息发送给你的朋友。所以从一台客户端主机到服务器,和从服务器回到这台客户端主机,这条路径是具有唯一性的,但客户端主机之间是不具有唯一性的,因为他们的ip地址都是私有ip。
总结:
- (1)内网中的数据包能够发送到公网,靠的是目的ip和网络中每个节点的路由表。
- (2)NAT进行源ip的替换是为了解决ipv4地址不足的问题,能够让局域网中的主机共享一个ipv4地址
- (3)数据包从公网服务器返回的时候,靠的是NAPT,不仅仅做源ip的替换,同时也会做port的替换,达到数据包能够从内网发到公网上的服务器,也能够回来的目的。
6.5.路由器工作原理
- 路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程。在这个过程中负责转发或者负责路由的机器就叫做路由器。
- 路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备。
如下图所示,主机A想和B通信,主机A先产生数据包,在经过一个互联网络之后,到达主机B。
如下图所示,有两个路由器router1和router2,router1连接的是1.0网段,router2连接的是4.0网段,1.0网段和4.0网段默认是不能通信的。
现在如果主机1.1想和右边的主机4.2通信,这个过程是如何发送的呢?
首先主机1.1会先检查自己的ARP缓存表,发现自己的表中并没有4.2的MAC地址,于是它发广播,这个广播会发送给主机1.2和Router1的E0接口,1.2不会给1.1任何回复,而router1发现4.1不是同一网段所以不会帮它转发,而是把自己的IP1.3和E0接口的MAC地址回复给主机1.1,所以在1.1的ARP表中保存的是E0接口的MAC地址和其IP的对应关系。
所以主机1.1想和4.2通信的时候,它产生的数据会先以单播的形式传给router1的E0接口。
当E0接口收到数据包之后,查看数据包中的目标地址为4.2,然后router1会查找自己的路由表,发现在自己的路由表中能找到4.0这个网段,并且4.0网段在s0接口上,所以路由器就会根据路由表的指示把数据包从自己的E0接口路由至S0接口。
(这里要注意的是,如果路由表中找不到4.0这个网段,路由器不会像交换机一样执行广播,而是会丢弃这个数据包,并向1.1返回一个请求超时的结果。路由器也不会学习源目标地址。即路由器根本不关注源地址,只关注目的地址)
进而通过S0端口所连接的互联网络把数据包传递到了router2的S0接口
进而通过E0接口找到最终的目的地,把数据包转发过去,完成整个的转发过程
6.6.路由
6.6.1.见一见路由
主机A要发一个数据包a到主机C,请详细阐述传输过程中数据包a被路由的步骤。
第一步;在主机A上的封装过程
- ①主机A的应用层上向主机C发出一个数据包a
- ②主机A的应用层将数据包a传向自己的传输层,数据包a被分成数据段a。
- ③然后将数据段a传至自己的网络层,并为数据段a加上IP包头,数据包a的源IP地址为92.168.1.2,目的IP地址为92.168.3.2
- ④在封装完成后,主机A将数据包a向下送到数据链路层上进行帧的封装,为数据包a封装上帧头和尾部的校验码,源MAC地址0000.0C11.1111,目的MAC地址0000.0C22.2222。
由于主机A和主机C不在同一个IP网段,所以主机A把数据帧a发送给默认网关(路由器A接口f0/0)
第二步:路由器A的工作
- ①接收数据后,被存放在接口里进行校验,以保证数据的正确。
- ②将数据帧的二层封装拆掉,取出数据包a。
- ③将数据包送到路由器A中,然后由路由器A在路由表中寻找网段92.168.2.0
- ④在路由表里要到达网段92.168.3.0要通过路由器A接口f0/1,然后对数据包a重新进行帧封装源MAC地址0000.0C33.3333,目的MAC地址0000.0C55.5555
- 路由器A将数据帧a从路由器A接口f0/1发送给路由器B
第三步:路由器B的工作
- ①接收数据后,被存放在接口里进行校验,以保证数据的正确。
- ②将数据帧a的二层封装拆掉,取出数据包a。
- ③将数据包a送到路由器B中,然后由路由器B在路由表中寻找网段92.168.3.0
- ④在路由表里要到达网段92.168.3.0要通过路由器B接口f0/1,然后对数据包a重新进行帧封装源MAC地址0000.0C77.7777,目的MAC地址0000.0C66.6666
第四步:主机C的拆封过程
- ①核对帧封装的目的MAC地址和自己的MAC地址是否一致,否则丢弃。
- ②主机C检查帧尾的校验,是否损坏,否则丢弃。
- ③拆除帧封装,取出数据包a,传向自己的网络层。
- ④网络层核对目的IP地址无误后会拆掉IP包头将数据段向上传送至传输层处理。
- ⑤主机C会在传输层按顺序将数据包重组成数据流。
数据包a的路由过程结束
6.6.2.什么是路由
路由是IP层最重要的核心工作,路由其实就是一跳一跳问路的过程,在问路的过程中,我们要去哪里当然是最重要的,而去的地方其实就是目的ip,目的ip大部分情况下都是公网ip。
回到主题上来,报文在进行路由时,其实就相当于问节点,我要去目的主机,下一步我应该怎么走?网络中的每个节点都有自己的网络层,都会维护一张路由表,每个节点在查询路由表之后,节点就会告诉数据包怎么走,一般节点的查询结果会有两种,
- 一种是告诉数据包,你下一步到那个路由器A就可以了,后面怎么走我就不知道了,你到时候问A就可以了。
- 另一种是,我也不知道你该怎么走,但你可以去问问那个路由器B,看看他知不知道怎么走。
而这两种情况实际就分别对应了路由表的两种查询结果,
- 一种是节点确实知道数据包的下一跳位置应该在哪。
- 另一种是节点虽然不知道,但节点有默认网关,节点会自动把数据包交付到默认网关的位置。
其实IP层进行数据包的路由,最重要的两个部分就是目的ip和路由表。
我们先来看看路由表的大概组成部分和每个条目,需要说明的是,不止路由器有路由表,网络中的任何一个节点都有路由表,因为主机和路由器都有自己的网络层。
6.6.3.路由表的组成
通常情况下,路由表包含了路由器进行路由选择时所需要的关键信息.这些信息构成了路由表的总体结构.理解路由表的构成对我们进行路由维护和排错有重要意义,
下面将讲述路由表的主要结构成分.
路由表中的每一个路由项具有五个属性,在此我将它们分为四个部分:
6.6.4.路由的过程
下面来看一下,一个具体的路由表是如何将数据报进行转发的。
接下来来看一些例子
当然,以下是一些具体的例子来说明路由器处理数据报时的流程:
场景:
- 路由器收到一个目的IP地址为192.168.1.100的数据报。
- 路由器的路由表中有一条路由条目,其Network Destination为192.168.1.0,Netmask为255.255.255.0,Interface为Ethernet0/1,Gateway为空。
Network Destination Netmask Interface Gateway
192.168.1.0 255.255.255.0 Ethernet0/1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为192.168.1.100。
- 计算网络地址:将目的IP地址192.168.1.100与子网掩码255.255.255.0进行按位与操作,得到网络地址192.168.1.0。
- 匹配网络地址:将计算出的网络地址192.168.1.0与路由条目中的Network Destination192.168.1.0进行比较,发现匹配。
- 选择路由:由于Gateway为空,且Interface为Ethernet0/1,路由器将直接通过Ethernet0/1接口将数据报发送到本地网络上的主机192.168.1.100(如果它存在的话)。
场景:
- 路由器收到一个目的IP地址为10.0.0.1的数据报。
- 路由器的路由表中有一条路由条目,其Network Destination为10.0.0.0,Netmask为255.255.255.0,Interface为Serial0/0,Gateway为172.16.1.1。
Network Destination Netmask Interface Gateway
10.0.0.0 255.255.255.0 Serial0/0 172.16.1.1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为10.0.0.1。
- 计算网络地址:将目的IP地址10.0.0.1与子网掩码255.255.255.0进行按位与操作,得到网络地址10.0.0.0。
- 匹配网络地址:将计算出的网络地址10.0.0.0与路由条目中的Network Destination10.0.0.0进行比较,发现匹配。
- 选择路由:由于Gateway为172.16.1.1,路由器将数据报发送到网关172.16.1.1的IP地址,这通常意味着数据报需要被转发到另一个路由器。
场景:
- 路由器收到一个目的IP地址为203.0.113.1的数据报。
- 路由器的路由表中没有直接匹配203.0.113.1的路由条目。
- 但是,路由表中有一条默认路由,其Network Destination为0.0.0.0,Netmask为0.0.0.0,Interface为Serial0/1,Gateway为192.168.2.1。
Network Destination Netmask Interface Gateway
0.0.0.0 0.0.0.0 Serial0/1 192.168.2.1
处理流程:
- 提取目的IP地址:从数据报中提取出目的IP地址为203.0.113.1。
- 遍历路由表:路由器遍历其路由表,但没有找到与203.0.113.1直接匹配的路由条目。
- 处理无匹配情况:由于存在默认路由,路由器选择使用默认路由来转发数据报。
- 选择路由:路由器将数据报发送到网关192.168.2.1的IP地址,以便通过另一个路由器进行转发。
这些例子展示了路由器在处理数据报时如何遍历路由表、匹配网络地址以及选择路由的详细流程。
6.6.5.route命令
route 命令可以显示或设置 Linux 内核中的路由表,主要是静态路由。
这些标题的含义如下
+-----------------+-------------------------------------------------------------+
| 字段名称 | 含义 |
+-----------------+-------------------------------------------------------------+
| Destination | 目标网络或目标主机(本机的数据要发送的目的地:子网或主机), |
| | 与Genmask组成一个网段。 |
+-----------------+-------------------------------------------------------------+
| Gateway | 网关(如果是默认网关,网关的地址必须和主机的某块网卡在同一 |
| | 子网)即网关地址。如果没有就显示星号(*)。 |
+-----------------+-------------------------------------------------------------+
| Genmask | 网络掩码,如果目标网络的子网掩码为255.255.255.255,说明目标 |
| | 是一台主机;如果子网掩码为'0.0.0.0',说明该路由是默认路由。 |
+-----------------+-------------------------------------------------------------+
| Flags(旗标) | |
| U | 该路由是启动的。 |
| H | 目标是一部主机 (IP) 而非网段。 |
| G | 需要透过外部的主机 (gateway) 来转递封包(该行有gw)。 |
| R | 使用动态路由时,恢复路由资讯的旗标。 |
| D | 已经由服务或转 port 功能设定为动态路由。 |
| M | 路由已经被修改。 |
| ! | 这个路由将不会被接受(用来抵挡不安全的网域)。 |
| A | 由addrconf安装。 |
| C | 缓存条目。 |
+-----------------+-------------------------------------------------------------+
| Metric | 距离、跳数。暂无用。与目标的“距离”(通常以跳数计算)。它不被 |
| | 最近的内核使用,但可能需要路由守护进程。 |
+-----------------+-------------------------------------------------------------+
| Ref | 不用管,恒为0,对这条路线的引用次数(Linux内核已不再使用)。 |
+-----------------+-------------------------------------------------------------+
| Use | 该路由被使用的次数,可以粗略估计通向指定网络地址的网络流量。 |
| | 路线查询次数。根据-F和-C的使用,这将是路由高速缓存丢失(-F) |
| | 或命中(-C)。 |
+-----------------+-------------------------------------------------------------+
| Iface | 接口,即eth0,eth1等网络接口名,为此路由发送数据包的接口。 |
+-----------------+-------------------------------------------------------------+
7.IP协议的分片
7.1.为什么要分片
真正在路由器和之间传递的确实是IP报文,但在一个局域网内部,真正传输的是MAC帧,这也就意味着,真正在局域网内传输的是数据帧,也就是说每个局域网内都会按照数据帧的方式传输,到达局域网中的下一跳位置后,下一跳位置的网络层来决定下下一条的位置应该在哪,确定好之后,在下一个网段中继续用数据帧来传输,所以真正在网线上跑的是数据帧,而不是IP报文。
而数据链路层有MAC帧协议,常见的就是以太网协议,以太网有规定,MAC帧的有效载荷不能超过MTU(maximum transmisson unit 最大传输单元)1500字节,IP报文能够决定传输数据的大小吗?并不能,控制传输数据大小的是TCP,TCP是面向字节流的,它可以控制什么时候发送数据,发送的时候发送多少,这也就是为什么滑动窗口中有多个数据段,而不是一个数据段,因为MTU会限制单个数据包的有效载荷不能超过1500字节,所以TCP在通过滑动窗口发送数据段时,都是发送多个数据段,而不是将多个数据段合并成一个大数据段进行发送。
先通过下图与文字,我们对分片首先有一个认识:
之后我们可以对分片进行一个简单的 总结 :
- 链路层由于物理特征的缘故,无法一次转发过大的数据 。每个链路层协议有其最大传输单元(MTU),在以太网中通常为1500字节。因此,一次转发的报文大小受到MTU的限制。
- 分片是在网络层(IP层)进行的 :当IP数据包大小超过某个链路或节点的最大传输单元(MTU)时,路由器或主机会将原始数据报进行分片,使其大小适合于网络上的传输。
- 分片后的数据包会带有相同的源和目的地址 ,但是会有不同的标识符以及分片偏移字段,以便接收方能够将分片正确地重组成原始的数据报。
7.2.见见分片
我们知道: 数据包在分片之前,一定是一个独立的ip报文 :
那么,当数据包分片后,应该是 ①每个分片后的包应该是都带报头 ②不需要带报头,只要有第一个就行 ?—— 是①!
具体过程如下图所示:(该例是对上面不准确例子的扩充)
上面就是一个简易的分片示例
7.3.怎么实现分片
此时我们知道了为什么会有分片,那么分片的是如何做到的?分片行为主要由下面三个字段完成:
上文我们已经对这三个字段进行了解释,这里再次简单提及:
- 16位分片标识:如果一个报文不分片,不同报文之间的16位标识符是不同的;如果一个报文分片了,分片报文的16位标识符是一样的,说明这些分片报文原本属于一个完整的报文。
- 3位标识:1位保留、1位标识禁止分片、1位标识更多报文MF(1说明后面跟了具有16位标志符的报文,0说明后面没有)
- 13位片偏移:分片以后,各个部分在原始报文的哪个位置,即在原始报文中的偏移量。
其实解决如何要进行分片与组装,可以将这个问题细分为几个小问题,解决这些小问题之后,这个大问题自然就迎刃而解了。
3位标志中,第一个字段被保留,第二位表示禁止分片,第三位表示更多分片标志位MF。
设置第三位MF为1,则该报文被分片,分片的报文中,除了最后一个分片,其他分片都是1,只有最后一个分片的第三位是0。
所以当收到一个报文时,如果该报文的更多分片标志位MF是1,那说明这个报文是一个分片报文,如果该报文的更多分片标志位MF是0,但同时他的13位片偏移大于0,则说明这个报文是分片中的最后一个分片报文
- 得到结论, 对于一个报文,可以通过下面的方法判断是否被分片 :
- 更多分片标志为1:分片
- 13位片偏移不为0:分片
- 上面两条如果任意一条都无法满足,为独立报文
- (对于上面的结论,不能反着推,比如:分片的报文更多分片标志一定为1,通过下面一条我们可以完全对分片报文进行认识:)
16位标识,同一个数据报的所有分片都会具有相同的16位标识,因为这些分片原来都是出自一个数据报的,每个数据报都有自己的16位标识字段,自然一个数据段被分片后,每个分片的标识字段的值都是相同的。
13位片偏移,表示该报文的有效载荷在原来的数据段中的偏移量,所以我们可以通过偏移量的大小和报文自身的长度来确定分片的前后顺序以及是否收全或丢失
将受到的分片报文可以先按照偏移量的大小做一个升序排序,后一个报文的偏移量大小,应该等于之前一个或多个报文在原来数据段中的长度之和。
把收到的分片合起来之后,合起来的报文的首部有16位IP头部校验和,除此之外,去掉IP报头向上交付后的TCP报文段的TCP首部也会有自己的16位头部校验和,通过这些校验和就可以判断组装好的报文是否是正确的。
7.4.分片机制示例
分片机制 示例 :
- IP 数据报 : 首部 20 2020 字节 , 数据部分 3800 38003800 字节 ;
- 将其进行分片处理 : 每个分片不超过 1420 14201420 字节 ;
- 标识 : 666 666666 ;
- 标志 : DF = 0 , 表示允许分片 ; MF = 0 , 表示后续没有分片 ;
- 片偏移量 : 0 00
分片后的结果是 : 分成 三片 ;
片偏移量是从数据部分开始计数 , 数据部分的开始位置是 0 00 字节 , 其单位是 8 88 字节 , 片偏移量 1 11 代表 8 88 字节 ;
7.5.分片的缺点
分片有风险,只要有一部分丢了,如果对端网络层无法组装,要组装的几部分会全部丢弃,对方TCP没有收到报文,就认为是丢包了。所以一般不建议分片,分片会增加丢包概率。