文章目录
- 一、详细解释 IP协议
- 二、解释 TCP 和 IP 之间的联系和区别。
- 三、IP协议——地址管理
- 四、数据链路层
一、详细解释 IP协议
注:在这里我向大家描述的 IP协议是 IPv4。
如上图所示,这就是 IP 协议头的格式,下面我会分别解释他们其中每一个部位所包含的含义。
- 4位版本
这就是指定 IP 协议的版本,对于 IPv4 而言,就是4。 - 4位首部长度
描述了 IP 报头的长度。(IP 报头是一个变长的)
报头中有一个选项部分,是边长的,可有可无。 此处的单位也是 4 字节。 - 8 位服务类型
这里看似说是 8 位,但是实际上只有 4 位是有效的。这 4 位中只有 1 位可以是 1,其余均是 0 。
这 4 位就表示的是 IP 协议的 四种形态 / 四种工作模式。
上述提到的四种形态分别是:
最小延时,最大吞吐量,最高可靠性,最小成本。
对于上面的 四种形态,实际开发中可以根据不同的需求来切换 IP 的模式,以达到最优效果。
- 16位总长度(字节数)
描述了一个 IP 数据报的长度。(头+载荷)
这里的这个长度减去前面的 IP 报文长度,剩下的就是 载荷长度。(一个完整的 TCP / UDP 数据报长度)
16 位总长度,这是否就意味着一个 IP 数据报,最大只能支持 64kb?
这个限制确实是存在的,但是,IP自身就支持对包的拆分的组装。
简单举例:
发送方: 将 100kb 的数据,交给传输层(封装).网络层就把这个 100kb 的数据进行拆包,(假设拆成两份 64kb + 36kb)。
之后再将这两份数据交给数据链路层,由以太网封装成两个数据帧
接收方: 数据链路层,针对两个数据帧进行分用,得到两个 IP 数据报,交给网络层。网络层针对这两个 IP 数据报进行解析,将里面的载荷拼接成一个,再交给传输层。
-
16位标识 / 3位标志 / 13位片偏移
这三点分别表示的是:
同一个数据拆开的多个包标识相同。
结束标志。
标识了多个包的先后顺序。
总的来讲,这里的三点都是辅助 拆包 / 组包。 -
8 位生存时间(TTL)
这各代表的是,一个数据报在网络上可以传输的最大时间。
这里所说的时间单位不是 “秒” 而是 “次数”
当一个数据报被构造出来,就会有一个初始的 TTL 数值(比如 32 或者 64…) 这个数据报每一次经过路由器转发,TTL - 1
如果一直减少到 0 ,还没有到达目标,此时就认为这个包永远无法到达,可以丢弃了。
-
8 位协议
这里存放的是当前载荷部分的内容是属于那个协议的。(TCP / UDP) -
16 位首部校验和
此处只需要对首部进行校验,载荷部分(TCP / UDP 数据报)自身已经有校验和了。
假设,此处传过来的校验和不一致。
此时数据将会直接丢弃,IP 不负责重传。如果上层使用 TCP,TCP 会在没有收取到 ack 后进行重传。
- 32 位源IP地址 / 32 位目的IP地址
IP 地址,是IP协议中最重要的部分。
这两个地址,分别表示的是发送端和接收端。
在我们日常见到的 IP,就是一串数字。这里是将 32 位 4 个字节的数字给分割开来,分成四个部分。每个部分都分别使用 0~255
十进制整数进行表示。
二、解释 TCP 和 IP 之间的联系和区别。
在前面的文章中,我已经向大家解释了在网络传输中 TCP 的相关知识。我们知道,TCP 有一个特点:可靠传输。
呢么,这里就有一个问题,既然 TCP 是进行传输工作的。我们现在介绍的 IP协议,也是进行传输工作的,
呢么,这两者之间有什么不一样的地方,这就很值得探讨一下。
区别:
首先,我们先来简单的了解 TCP 和 IP 的区别:
- TCP:叫做 传输控制协议,面向连接的,端对端的,可靠的,基于IP的 传输层 协议
- IP:叫做 因特网协议,位于 网络层,IP 协议规定了数据传输时的基本单位和格式。
如上图所示,这张图是我们在初次认识到网络时就见过的 五层网络模型
通过上面的解释,发现 TCP 和 IP 分别在两个不同的层级。
联系:
对此,我们可以通过上面的信息得出两者之间的联系:IP 通过接受来自 (更低层级:数据链路层) 发送过来的数据报,并将该数据报发送到更高层(传输层)——TCP 层;反之,IP 层也可以将 TCP 层的数据报转发到更低层进行传输。
总结:
总的来看,TCP 和 IP之间有着明确的分工:
IP 提供无连接,不可靠,尽最大的可能将数据报交付的工作。进行主机间的通信。
TCP 则是对数据报进行更精细的加工,面向对应用层提供服务,确保传输的可靠性。
形象的来讲,这就像是我们在网上买快递。
这里的 TCP 就像是 “商家”,对我们的商品进行比较详细的包装 然后递交给 “快递员” ,也就是 IP。
同样的,要将这个 “快递包裹”,发送到我们用户的手中,就只需要对上述操作进行反向即可。
UDP 和 TCP 之间的区别不是很大,如果还想要了解整体工作的性质,可以看看这篇文章: JavaEE 网络原理——TCP的工作机制(初篇 包含 UDP 协议的再次阐述)
三、IP协议——地址管理
将一个 IP 地址分为两部分,一个叫网络号,一个叫主机号。
- 网络号: 标识网段,保证相互连接的两个网段具有不同的标识。
- 主机号: 标识主机,在同一个网段内,主机之间可以有相同的网络号,但是必须要有不同的主机号。
简单举例:
如,192.168.0.10 这个 IP 地址。
网络号为:192.168.0
主机号为: 10
以这个 IP 地址组建一个 局域网,呢么,当前局域网下的设备,网络号都为 192.168.0
简单展现一个典型的局域网环境,如图:
通过上图,简单明了的解释了在局域网中,网络号和主机号的用法。但是,在这里,我们又引入了一个新的信息——WAN口 和 LIN口。
其实这也不难理解,下面我就简单的解释一下两者的功能。
如图,这就是路由器上的 WAN口 和 LIN口。
WAN口: 主要是用来联系局域网。(往大了将就是连接互联网)
LIN口: 就是将多个用户主机连接到一个局域网中。
到这里,我们已经了解了什么是网络号,什么是主机号。但是还有一个问题,它们两个是怎么界定的?是依据什么来划分的?
其实这里还有一个单独概念——子网掩码
如图所示,这里的 255.255.255.0 就是子网掩码。将其以二进制的形式表述出来就如下图:
这里 1 的部分就描述了 IP 有多少位是网络号。
所以,也就是说,网络号不一定就是前三个字节,是可以调整变化的。
四、数据链路层
如上图所示,数字链路层更加接近网络传输的底层逻辑。
明确的来讲,数据链路层所考虑的就是两个节点之间的传输。(也就是通过网线 / 光纤 / 无线,直接连接两个设备)
在这里的典型协议有很多,其中最知名的就是 “以太网协议”。
这个协议即规定了数据链路层,也规定了物理层的内容。
我们日常生活中使用的网线,就叫做 “以太网线”。(就是遵守以太网协议的网线)
图示以太网数据帧,如下:
如上图所示,我们可以得到一个以太网数据帧的格式:
以太网数据帧 = 帧头 + 载荷 + 帧尾
- 帧头
这里的帧头包含了三个要素,分别是:目的地址、原地址、类型(这里的类型有三种:IP、ARP、RARP)。
解释说明此处 目的地址、原地址:
此处使用的 不是 IP 地址 表示,而是设置了一个 mac 地址。
问题1: 这里的 mac 地址是什么?
解释:
这是一个物理地址,这个地址是完全独立的,是另外一套地址体系。
大小为 6 字节(相较于 IPV4 地址大很多) 当前的每一个设备都会有一个唯一的 mac 地址。
这个地址不是动态分配的,而是网卡在出厂时就已经被设置好了。
问题2: 这里的 mac 和 IP 之间是如何相互配合的?
解释:
在这里,IP 地址和 mac 各司其职
IP 在这里宏观描述传输过程的起点和终点。
mac 在这里详细描述两个相邻节点的起点和终点怎么走。
假设从北京出发到南京
通过网络层(IP),规划出了如下图的路径,选择走那条更合适的路径:
在 数据链路层(mac)中,就是考虑两个节点之间如何走。
这里我们假设选择第二条路线。如图:
-
载荷
这里的载荷就是完整的 IP 数据报 -
帧尾
-
在这里不是很重要就不再多进行解释了。