> 文章列表 > 网络编程之IP协议

网络编程之IP协议

网络编程之IP协议

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!

欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心


目录

一.IP协议 (网络层)

1. IP 数据报的拆包组包

2. 8 位生存时间

3. 源 IP 与目的 IP

4. IP协议 的两个核心功能

二、IPv4 协议

 特殊地址

三、如何解决 IP地址的不够用问题

1. 动态分配 IP

2. NAT 机制

(1) 根据例子理解 NAT 机制

(2) NAT 机制对应的模型

3. IPv6 协议

四.以太网协议 (数据链路层)

五.DNS协议



 IP是一种 「不可靠」的 「端到端」的数据包 「传输服务」,主要实现两个功能:数据传输 和 数据分片。

一.IP协议 (网络层)

①IP协议的报头格式以及各部分说明:

1. IP 数据报的拆包组包

在上图中,我们可以看到:一个 IP 的数据报总长度为 16位,这看上去和 一个UDP 数据报的长度相同,最大都为 64KB.

而虽然 IP协议 看起来也是有个最大 64KB 的限制,但实际上,IP协议 内置了拆包组包的功能。如果一个数据太长了,IP协议 就会先将数据自动拆成多个数据报,再进行传输,最后接收方收到数据时,又会重新进行组包。这样一来,就没有单单的 64KB 的限制了。此外,IP协议 的拆包组包功能是内置在协议中的,不需要程序员实现这一功能,比较方便。

2. 8 位生存时间

8 位生存时间这个字段表示 一个 IP数据报 最多在网络上存活多久,而 TTL 并不是一个时间单位,它其实是一个以 " 次数 " 为单位的概念。

比方说,主机A 给距离较远的 主机B 发送数据,数据每次经过一个路由器转发,TTL 就减 1,而 TTL 一直减到 0 还未到达 主机B 目的 IP,那么就被自动丢弃。而一般情况下 TTL 的次数都较为充裕。

那么,8 位生存时间这个字段,主要是用来防止出现路由器之间的循环。( A -> B -> C -> A )

3. 源 IP 与目的 IP

这是整个 IP 协议中最核心的部分。
我们将 IP地址 比作成快递单号上的地址,源IP 就表示 " 发件人地址 ",目的IP 就表示 " 收件人地址 "。

4. IP协议 的两个核心功能

① 地址管理

地址管理:能够通过一系列的规则,将网络上设备的地址给描述出来。
地址管理中的一些重点部分在下面的 IPv4 协议中会详细介绍到,现在请继续往下看。

② 路由选择

路由选择:根据当下的源地址和目的地址,规划出一条合适的路径。

此处的 " 路由 " 指的是 IP协议 中的 " 路径规划功能 ",为什么要进行规划?
因为通过网络从某一端传输到另一端,在这个过程中,并不是 " 一站到达 ",它更多的情况下是错综复杂的路线,下图为我们展现出来了这样的情况。

 举第一个例子:小明准备从家里出发去市中心购物,那么他就得先明确起始地和目的地,起始地是家,目的地是商场。可想而知,小明在去之前,就必须得规划好路线。坐公交车、坐地铁、或坐出租车…假设他坐地铁,而坐地铁又分为很多种路线,可能先是 1号线 > 6号线 > 5号线,也有可能是 1号线 > 10号线 > 3号线 > 16 号线…他在去之前就能够规划好路线,以此来提高效率。

但是在 IP 协议中的路由选择与我们上面说的坐地铁选择路线之间有本质区别,更多的是一种 " 探索式 " 的过程。因为当数据到达某个路由器之后,路由器并不能立马为数据规划好一个整套的路线,路由器只能知晓它附近的情况,即它只知道相邻设备的情况这很好理解,毕竟路由器是一个物理层面的实体,它并不能掌控全局,它的存储空间有限,不可能通过一个路由器的路由表就保存整个互联网环境的所有情况。

举第二个例子:杰克第一次来到一个陌生的城市,他也准备去市中心购物。但这时候,他就只能向路人问路,但是路人每次只能列出一个大致的方向。

当杰克遇到第一个路人A,
路人A 说:我不知道商场在哪,但我知道你从这里坐 3号线坐到 xxx路,那里一定有购物的地方,即使没有,你也可以再问问别人…

之后杰克应了路人A 的话,坐了 3号线,当他从 3号线下来的时候,找了半天没找到商场,于是又问了路人B,
路人B 说:你从这里直走,走到头,再往左转,就能看到购物的地方。

于是杰克又应了路人B 的话,到了他说的地方,只是发现了服装专卖店,并不是商场,于是他又问了路人C

在刚刚的例子中,每一个路人,就相当于一个路由器。每个路人都有一个自己熟悉的范围,但一个路人并不知道一套完整的路线,只知道一个大致的方向。而这个例子,就类似于路由器中的一种核心数据结构:" 路由表 "。

二、IPv4 协议

在 IPv4 中,计算机主要是通过一个 32位 的二进制数来进行表示一个 IP 地址。

而为了给人们直观地观察 IP 地址,把这个 32位 整数表示成 " 点分十进制 " 的形式。三个点把32位整数分为4个部分,每个部分一个字节,每部分的取值范围是0-255(1111 1111)

例如:下面的就为人们日常使用的 IP 地址格式
192.168.1.102

 特殊地址

①网络号:

如果IP的主机号全为0,该IP就表示一个网络号(局域网中的一个正常设备,主机号不能为0)

②广播地址:

如果IP的主机号全为1,该IP就是一个"广播地址",往这个IP发送的消息,整个局域网都可以收到。

③环回IP:

如果IP地址是以127开头,就表示这是一个"环回IP",即表示主机自己

如果IP地址是10开头,或者192.168或者127.16-127.31开头的,表示该IP是一个局域网内部的IP(内网IP),剩下的IP被称为是外网IP(直接在广域网上使用的)。

注意:!!!

外网IP一定是唯一的,每个外网IP都会对应一个唯一的设备,而内网IP只在当前局域网内部是唯一的,但是在不同的局域网内可以有内网相同的IP设备。

关于 IP 地址,涉及一个较为重要的问题:IPv4 协议对应的 IP地址 够用吗?

IPv4 协议对应的 IP地址 实际上使用 32位 整数来表示的,而 32 位的二进制数最多也就只能表示 42亿9千万之多,这是因为当初设计者就是这么设计的,他们也没有想到今天这个时代,互联网发展的如此迅速。

所以说,针对一个城市、一个人口不那么多的国家,IP 地址或许已经够用了。
但如果要做到全球通信,就很困难了,因为可能我们每个人不止一个网络设备,公司也不可能按数量为员工分配刚刚好的设备。

三、如何解决 IP地址的不够用问题

1. 动态分配 IP

本质上说,动态分配 IP 的思想就是:一个设备接入网络了,就为其分配一个 IP,另一个设备没接入网络,就不为其分配 IP. 但是这种办法,终归治标不治本。
因为在当下社会,很多人手机可能就已经全天 24小时 开着网络了。

2. NAT 机制

NAT:Network Address Translation ( 网络地址转换 )

NAT 机制的思想实际上就是使用一个 全局的 IP 地址,来代表一批私有 IP 的主机。

(1) 根据例子理解 NAT 机制

在下图中,在局域网1 中,全局 IP 123.456.12.7 这个地址用来表示整个局域网内的主机地址。在局域网2 中,也是同样的操作。而由于不同的局域网可以使用重复的主机 IP,这样一来,就可以 " 重复使用相同的 IP地址了 ",以此间接达到地址复用的目的。

 在上图中,类似于 192.168.xxx.xxx 这样的 IP 是一个局域网内部的 IP,局域网内部的 IP 在同一个局域网内部不能重复,但两个不同的局域网可以使用重复的局域网 IP.

当使用局域网1 中的主机1 尝试发送请求,想与使用广域网范围的设备进行通信的时候,主机1 就要先将 IP 地址转换为路由器对应的 全局IP,通过这个 全局IP 再来和广域网范围的设备进行通信;而当广域网范围的设备返回响应的时候,也先是返回到路由器上,路由器再将 全局IP 转换为 主机1 的 私有IP,这样一来,主机1 最终才能获取响应。

简单说明通过 IP,发送与接收数据的过程:

主机1 发送数据,源 IP -> 目的 IP 的过程:私有IP 192.168.0.10 -> 全局IP 123.456.12.7 -> 广域网的目的 IP主机1 接收广域网返回响应的过程:广域网的目的 IP -> 全局IP 123.456.12.7 -> 私有IP 192.168.0.10

举个例子:大学生在学校拿快递的时候,学校附近可能不止一家菜鸟驿站,而不同的菜鸟驿站中取件码可以相同,但这些菜鸟驿站基本上是围绕着大学的学生服务的。那么某某大学就相当于是一个广域网,某个菜鸟驿站就相当于某个局域网对应的 全局IP,菜鸟驿站中的取件码就相当于各个主机,因为各个取件码依赖着所属的菜鸟驿站,而快递员送快递的时候,根据快递类型又来放入不同的菜鸟驿站中。

(2) NAT 机制对应的模型

NAT 机制是当下互联网中解决 IP 地址不够分配的典型情况,也比较的适合当下的网络。

 对上图的发送数据与返回数据进行说明:

  • NAT 路由器发送数据时,将 源IP 从 10.0.0.10 替换成全局的IP 202.244.174.37;
  • NAT 路由器返回数据时,将 目标IP 从 202.244.174.37 替换回 10.0.0.10;
  • 在 NAT 路由器内部,有一张自动生成的,用于地址转换的表,当 10.0.0.10 第一次向 163.221.120.9 发送数据时就会生成表中的映射关系。

3. IPv6 协议

IPv4 是长度为 32位的数据,而 IPv6 是长度为 128位 的数据,读者可以使用计算器计算一下,IPv6 是一个巨大的数字。

IPv6 相当于釜底抽薪,它从根本上解决了 IPv4 协议的地址不够用问题。虽然 IPv6 已经提出了很多年了,但在当下的网络时代, IPv6 的普及程度,仍然相对较低,使用 IPv6 的 IP 远远少于使用 IPv4 的 IP.

原因就是 IPv6 和 IPv4 互不兼容,所以如果你要想升级成 IPv6,得把相关的网络设备,例如交换机、路由器、服务器…都得升级成 IPv6. 而这需要很大的一笔费用才能支持更换这些设备。此外,原先使用 IPv4 的网络设备使用寿命一般较长,也无需更换。


四.以太网协议 (数据链路层)

①什么是以太网协议?

以太网协议不仅仅规定了数据链路层的内容,也规定了物理层的内容。

②认识以太网数据帧:

  1.mac地址:

很多人在这里会感到困惑,明明已经有了IP地址,那么为什么还要有mac地址呢?

这是因为,在很久很久以前,网络层协议和数据链层协议都是独立研发出来的。因此,你是否会觉得当今来看的话有些重复,然而在如今,当然又有新的见解了咯。

如今,IP地址是用来表示一次传输过程中的起点和终点。

而mac地址是用来表示一次传输过程中的两个相邻节点的地址,也就是说,一个以太网数据帧每次转发的时候,它的源mac地址和目的mac地址均会发生改变。

举个通俗的例子:

我从成都到北京,源IP地址为成都,目的IP地址为北京。

而我先从成都到河北,再从河北到北京,就涉及到两组mac地址(源mac地址:成都,目的mac地址:河北 => 源mac地址:河北,目的mac地址:北京)

2.帧尾:

帧尾的功能同UDP中一致起的是校验的作用,它是基于CRC算法的校验和。

3.MTU:(46~1500表示数据的加载范围)

MTU表示一个以太网数据帧能够承载的数据范围。

而这个范围取决于硬件设备,而以太网也是和硬件设备密切相关的,而不同的数据链路层设备对应的协议可能不同,MTU也就不同。那么要是数据报超过了MTU怎么办?这就会用到我们前面讲的IP分包,IP分包的并不是给IP报头64k准备的,更多的是用于此处适应数据链路层的MTU。

MTU与TCP协议的联系:

MSS:是TCP在IP不分层的情况下,所能搭载的最大载荷。与此同时,MTU也取决于TCP和IP的报头长度(是可以变长的)。

而MTU和MSS的联系:

 4.ARP:(ARP报文不是用来传输数据的,而只是起到简单的辅助作用)

像路由器这样的设备在转发数据的时候,首先会拿到一个目的IP,通过这个目的IP来决定接下来的路怎么去走。而我们前面也讲到了每相邻路径实际是由mac地址来决定的,而目的mac是啥?这就要根据ARP协议,建立起IP=>mac这样的映射关系。

当设备启动的时候,就会向局域网中广播ARP报文,然后每个报文收到后都会给出一个应答,这个应答中就包含了自己的IP和mac地址,然后发起广播的一方就可以根据这些回应建立起这样的映射表了。

这里建立起这样的映射表,通俗一点来讲,还是用老例子:

成都到北京。这就建立起了成都=>河北=>北京这样的映射路线表了

五.DNS协议

①什么是DNS协议?

这是一个域名解析协议,位于应用层

简单来讲,DNS相当于一个翻译官,负责将域名翻译成ip地址

②为什么会有这个协议?

这是因为就算将IP地址点份十进制的形式,但是对于我们来记忆来说还是有一定难度。为了解决这个问题,就决定使用了一串英文字母来表示这个IP地址,而这串英文字母就是域名,类似于www.baidu.com这就是一个域名,而且域名和IP地址是一一对应的关系。

  ③ DNS在全球是如何进行推广使用的?

如今host文件也不再使用了,因为全世界的域名太多了,任凭这样改的话,是非常低效的,因此就成立了一个机构专门负责维护这里的域名和IP地址的对应关系,假如你想申请一个域名的话,就可以去这个机构报备一下就可以。

这个机构维护一组服务器就会把hosts文件存到这个服务器里面(域名解析服务器),要是自己想对其域名进行解析的话,就访问一下这个总的服务器就OK。

这个时候就会有人说,那这个多麻烦,每个设备上网要是都去访问这个解析服务器,那这个服务器的压力也太大了吧。

因此就把这个总的域名解析服务器设为根域名解析服务器,另外在每个国家每个地区都有各自的网络运行商,这些运营商就会就近架设域名解析镜像服务器(定时回合根域名解析服务器进行同步),像我们平时上网的话就会访问这些就近的镜像服务器。

④DNS遇到的问题:

不知道大家在上网的时候有没有遇到这样的问题:QQ能登录上,但是打不开浏览器。这就是因为就近的域名解析镜像服务器挂了(QQ使用的是自己写死的IP来访问QQ服务器,是不需要进行域名解析的)。

既然遇到了问题,那么我们该如何解决?

手动更改自己的域名解析服务器:打开我的电脑网络设置找到更改适配器选项,点击以太网属性,选择TCP/IP将自动获取域名解析服务器改成手动获取就可以。需要获取的域名解析服务器可以在网上进行搜索。

  每当我们查询了DNS后,主机会对其进行缓存一段时间,当我们下次访问同一域名,就可以省略查询DNS的过程了,对于DNS域名和IP的对应关系是很少会改变的。