2.IP协议的核心功能:能够在两点之间规划出来一条合适的路径
1)地址管理:通过一系列的规则,可以把网络上设备的地址给描述出来
2)路由地址:根据当下的源IP和目的地址,规划成一条合适的路径,啥叫合适?关键是看咱们的TOS是怎么选的?是选择最大吞吐量,还是最小延时??
--------------------------------------------------------------------------------------------------------------------------
本来咱们的预期IP是表示网络上面的同一个位置,但是这怎么同一个内网IP可以表示不同的设备了呢?
当前咱们的IPV4协议,使用的IP地址是表示32位的整数,32为可以表示的数据的范围是42亿9千万,如果我们尝试给每一个设备都分配一个唯一的IP地址,就意味着世界上的设备不超过42亿9千万,但是实际上已经超过了,每一个设备都保证有一个唯一的IP地址,显然是根本不现实的
1)动态设备,并不是所有的设备都在连接网络,哪个设备联网了,就给他分配IP地址,没有连接网络就不分配(这种方法治标不治本),同时把这个IP地址给其他人用;---设备没有减少,IP地址没有增加
2)NAT机制:网络地址替换,本质上是使用一个外网IP地址,来表示一批主机或者设备;
1)我们把网络分成了内网(局域网)和外网(广域网),我们就要求外网IP必须表示唯一的设备,同时内网中的若干个设备,可以同时用一个外网IP
2)我现在的这个电脑是一个局域网IP,我还对应着一个外网的IP,这个外网IP不是指给我一个人用的,而是所有接入这个设备的局域网,都在共用这这同一个外网IP
3)我们的每一个外网IP都可能代表着几千个,甚至上万个设备,这时候IP地址的压力就少了很多
1)此时直接连接到广域网(外网)的路由器设备,就叫做外网IP,实际上这些局域网里面的设备有很多,网络结构也有可能很复杂;
2)一个局域网里面的若干设备都在使用着同一个外网IP,先通过路由器的外网IP来确定把这个数据交给哪一个局域网,再通过局域网中的内网IP来确定把这个数据交给局域网中的哪一台主机
3)一个外网IP可能就包含着,几百,几千,甚至几万个网络设备;
4)如果局域网内部的数据尝试往广域网上发送的时候,此时的路由器就会悄悄地把其中的源IP给换了;例如上面的192.168.0.10向外面发送数据,通过路由器转发,就被替换成了外网IP;
5)一个局域网中的所有设备,共同使用一个外网IP;当我们在电脑端输入IP地址的时候,所展现出来的IP地址就是我这个电脑对应的接外网的路由器设备的外网IP,这个设备具体管理多少个内网设备,不从得知;
6)我们不在意局域网里面的IP是否重复,那么只要外网IP不重复即可;
7)下面三种IP都表示局域网IP 10.*,172.16.*-172.31.*, 192.168.*;
8)NAT机制虽然解决了IP地址不够用的问题,但是也引入了新的问题,比如说我想要在自己的机器上面搭建一个服务器,此时想要让其他用户通过外网来访问你的服务器这个时候是做不到的,我们自己的机器,只是一个局域网IP,内网IP是可以进行重复的;其他主机是无法通过一个内网IP来查询到你的服务器,除非是在同一个局域网里面
问题1:但是一个路由器所控制的局域网的一台机器不可以访问另一个路由器所控制的局域网的一台机器(除非是在局域网里面),怎么办呢?
除非通过内网穿透(只是穿透某个窗口,不是把整个IP传过去了)
内网穿透:
1)现在咱们有一个内网IP,叫做192.168.0.10,咱们还有一个云服务器使用有外网IP的,内网IP访问不到,但是外网IP咱们是可以访问到的
2)咱们可以在80端口搞一个服务器,咱们把内网IP的主机和云服务器通过TCP建立连接
问题二:一个路由器的所管辖的一片局域网中的一台主机访问广域网的流程是怎么样的?
答:路由器本身是有自己固定的内网地址和外网地址,这个设备的源IP地址经过路由器后会转变成路由器的外网地址(因为这个局域网的所有设备经过路由器后都会转变成相同的路由器外网地址,所以为了区分,就用端口号进行区分)
当数据发送回来的时候,曾经路由器的外网地址会转变成具体的路由器的内网地址,此时再通过端口号来区分具体是哪台主机维护一个转换机制;
1)实际在NAT路由器内部,有一张自动生成的,用于地址转换的表。
2)该转换表中维护的就是局域网中主机的私有IP,与其对应访问的外网当中的某个公网IP之间的映射关系。
3)局域网中的主机第一次向外网发起数据请求时,就会生成表中的映射关系。
4)比如在TCP建立连接时,会建立对应的映射关系,在TCP断开连接后,就会删除对应的映射关系。
咱们再进行举一个详细的例子来进行分析一下:
咱们的CCTALK现在有两个连接:
NAT机制:把IP分成了内网和外网
1)对于一个外网IP,在互联网上面的任何位置都是可以访问到的
2)对于一个内网IP,只能在当前的局域网内部进行访问,局域网1的设备,不能使用内网IP访问局域网2的设备,因为局域网1的IP和局域网2的IP都是一样的怎么办?
3)NAT的设备也是存在极限的,那就是端口号的个数是65535,,如果一个局域网里面的连接数超过了65535,这个时候NAT就不一定好使了,端口号就不够用了,用端口号保证是哪一台主机
4)我自己家里面的电脑IP,这个IP只能在我自己家里面的局域网才可以进行访问,别的地区的人想要跨越局域网想要访问我的这个IP是做不到的
5)咱们要想进行通信怎么办?我们就需要共同使用一个带有外网IP的机器,我这边的机器访问了抖音,把我自己直播的画面推送到抖音服务器上面,你们也可以访问抖音,拿到我的直播画面
6)假设没有NAT机制,所有的IP都是唯一的,那么我就可以在自己的电脑上面搭建一个直播服务器,别人直接访问我的电脑就可以了
NAPT技术
这就是网络地址端口转换:
1)如果局域网中的多台主机同时访问同一个外网服务,当路由器收到外网发来的响应数据时,路由器无法判断该响应数据应该转发给局域网中的哪台主机,因为该局域网中所有主机的数据包都由路由器代替发送了,因此发来的响应数据包的目的IP地址都是路由器的WAN口IP地址。
2)于是NAPT在建立转换表的映射关系时,除了建立局域网中私有IP与其对应访问的公网IP之间的映射关系外,还会加上一个由NAT路由器选定的端口号。
3)此时当局域网中的多台主机同时访问同一个外网服务时,虽然外网发来的响应数据的目的IP地址都是路由器的WAN口IP,但发给局域网中不同主机的响应数据对应的目的端口号是不同的,此时路由器就能通过IP+Port的方式来区分发给不同主机的数据包。
比如局域网中的主机A和主机B都在访问同一个服务器,并且它们访问服务器时采用的端口号都是1025。4)假设主机A发送的数据包先到达路由器,此时路由器将数据包的源IP地址替换成自己的WAN口IP地址,由于路由器用于访问该服务器的1025号端口没有被使用,因此该数据包的源端口号可以不变。
5)当主机B发来的数据包到达路由器时,路由器同样将数据包的源IP地址替换成自己的WAN口IP地址,但此时路由器用于访问该服务器的1025号端口已经被主机A使用了,因此路由器会重新选定一个端口号对数据包的源端口号进行替换。
6)此时转换表中就会建立如下两队映射关系:此时这张转换表既能保证从左到右的唯一性,也能保证从右到左的唯一性。
7)当服务器发来的响应数据到达路由器时,虽然服务器发给主机A和主机B的数据包对应的目的IP地址是一样的。
8)但路由器是用自己的1025号端口代替主机A进行数据请求的,而用的是1026号端口代替主机B进行数据请求的。
9)因此现在路由器可以继续根据数据包的源端口号,来判断应该将该数据包转发给主机A还是主机B,进行对数据包中的目的IP地址和目的端口号进行替换,然后转发给局域网内对应的主机。
1)路由器是工作在网络层的一个设备,负载将数据包从一个网络转发到另一个网络,但不能狭义的认为路由器只能工作在网络层。
2)NAT路由器在进行数据转发时,不仅有能力替换数据包的源和目的IP地址,而且在必要的情况下还可能会替换数据包的源和目的端口号,而端口号实际是传输层的概念。
3)转换表的生成和销毁都需要额外开销。
4)通信过程中一旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开。
NAT不能从根本上解决问题端口号成为了限制
IPV6机制
1)这是用16个字节来表示端口号的问题,他从本质上解决了IP地址不够用的问题,但由于我们之前使用过的是IPV4(大部分的路由器都是不支持IPV4),所以要把所有路由器改成IPV6,所以要花钱(IPV4和IPV6都是不兼容的)
2)IPV6使用了一个更长的字段来进行表示IP地址,IPV4,4个字节 32 位(2的32次方)但是IPV6是16个字节,128位(2的128次方),1B(byte)=8b(bit);
3)咱们的运营商设备支持IPV6地址,要保证你的路由器和光猫也要支持IPV6地址(需要改设备)(硬件支持+软件配置)
IP协议其他知识的补充,IP地址本质上是做两件事:
1)地址管理:
网段划分,我们在组建局域网中非常重要的要点;
1)例如在同一个局域网里面的主机,网络号要相同,主机号不可以相同;
2)两个相邻的局域网,通过同一个路由器连接的局域网,网络号必须不相同,主机号可以相同
下面的路由器1左边是一个局域网范围,右边是一个局域网范围;
那么具体从哪里来区分那部分是网络号呢 ?
子网掩码非常有特点:左面全是1,右面全是0,将子网掩码和IP地址进行按位与操作,得到的就是网络号
如果主机号是255,就表示这个IP是广播IP,如果你搞一个UDP数据报,把目的IP写成主机号为255的IP,此时这个数据包就会发给每个局域网中的设备;假设手机里面装遥控器APP,也是可以操作电视的,但是前提是手机和电视必须在同一个局域网中,手机APP发送一个UDP数据报,把目的IP改成主机号是255的IP,此时电视就会返回响应;
2)路由选择:此处的路由,表示的是IP地址的数据规划功能,在我们的两个设备之间要找出一个通道,能够完成传输的过程
1)此处的路由规划指的就是IP协议中的路径规划功能,路由选择的过程,其实就是在A和B之间选择一条合适的路径,这个选择其实不要是一个容易衡量的事情,环境比较复杂,要综合考虑路径的长短,通信的速度,设备开销的大小;
2)IP协议中选择具体的过程,和地图中的路径规划还有一定的区别;地图这里是知道整体的路况,综合进行会考虑
3)事实上在数据到达某个路由器后,这个路由器并不知道网络整体的环境(这个太复杂了),这个路由器只是知道它附近的情况(它了解他邻近的设备的情况),IP协议寻路过程,其实就是一个探索式启发式的过程;
例如我想要去内蒙古工业大学,假设没有地图,但是我可以去问路
1)一出门,我就抓住一个路人去问路,我怎么去内蒙古工业大学,如果他知道,就直接告诉我具体路线了,如果不知道,就会告诉我,你先去公交站牌上面问问路
,但是唯一确定的是你必须先去坐公交,先去公交站上去问问;
2)如果到达公路牌,在抓到一个路人,继续问内蒙古工业大学怎么走;如果他知道怎么走,他就直接告诉我的具体路线,如果她不知道,他就会说,虽然我不知道工业大学怎么走,但是你得先坐车,到下一个公交站到了小吃街问问;
3)到了小吃街之后,我继续问人,在抓住一个人,他说,你再继续向东走走,应该就到了;
在这个过程的推移当中,我就逐渐靠近了内蒙古工业大学,当我逐渐靠近之后,此时我抓住一个路人,就直接知道学校在哪里,一旦他知道了路线,我就可以按照他说的路线,直接找到学校;
上面是一个最简单的情况,但是事实上,远比这更复杂,也许你问的路人啥也不知道,告诉你的方向也不是正确的方向;他有可能知道目标在哪里,但是他知道好几条路线,你必须做权衡;
这里我们举例的每一个路人,都相当于是一个路由器,每个路人都有一个自己熟悉的范围,在这个范围内,他知道自己怎么走,或者只知道一个大概的方向;这个事情就相当于是路由器中的一个核心的数据结构,路由表;
路由器的存储空间有限,不可能通过一个路由器的的路由表就知道整个互联网的环境的所有节点情况,路由表里面大致描述了啥样的IP从啥样的网络接口WAN/LAN传输;
1)咱们IP数据包的目的地址,如果路由器认识,就直接告诉你路了,如果说当前路由器不认识,那么就会告诉你一个大致的方向,让你走到下一个路由器的时候再问问
2)依次往后走,其实本质上也是和目标越来越近,在此过程中,我们总会遇到一个认识这个地址的路由器,就可以具体的转发过去了
3)有的时候,你甚至不光遇到了一个认识这个地址的路由器,而且还认识多个路,这个时候就可以选择一个更合适的路了
啥叫路由器认识这个IP地址?
1)在路由器内部我们维护了一个数据结构叫做路由表,路由表里面就记录了一些网段信息(网络号,目的IP就是在这些网络号中进行匹配),以及每一个网络号对应的网络接口(网络接口其实本质上就是对应着路由器里面具体的端口,是接下来走LAN口还是WAN口?)
2)思路上就是某一个路由器上线之后(接入网络之后),就会和相邻的设备进行通信,认识一下,路由器就来构造一下路由表了(把这个LAN口对应一个网段,那个LAN口对应哪一个网段),路由器是可以更多的设备的设备,就可以更快的找的路了
3)咱们的路由表中的一个默认表项起到的效果就是当前咱们的IP地址在所有的表项都匹配不上的时候,此时就会告诉IP数据包,你问问别的路由器
为什么说TCP面向字节流?UDP面向数据包?
1)UDP:
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对由应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。也就是说,无论应用层交给UDP的报文有多长,UDP都会照样发送,即一次发送一个报文。2)TCP:
不论应用层发送的报文长度如何,到了传输层后,TCP总是把收到的报文看作一串字节流,并且把每一个字节都进行编号。TCP会根据当前网络的拥塞程度和对方接收缓存的大小,决定现在应当发送多长的报文段。TCP关心的是:必须保证每一个字节都正确无误的传输给对方,并不关心传输了多少个报文段,和每个报文段有多少个字节。这就表明了TCP是面向字节流的。TCP(传输控制协议,Transport Control Protocol、UDP(用户数据报协议,User Data Protocol)