个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【网络编程】
本专栏旨在分享学习计算机网络的一点学习心得,欢迎大家在评论区交流讨论💌
目录
🐱一、IP协议介绍
🐟IP协议报文结构
- 四位版本号:用来表示IP协议的版本,现有的IP协议只有两个版本,一个是IPv4,另一个是IPv6。
- 四位首部长度:告诉接收方在IP数据报中如何找到数据部分的起始点。通过首部长度字段,接收方可以确定数据部分在IP数据报中的位置,从而正确解析和处理IP数据报。
IP报头是可变长的,同时也是IP报头是有选项的
- 八位服务类型(TOS):八位服务类型其实只有4位是有效。支持模式切换(或称为状态切换的)。下面是使用的4种齐爱。
- 最小延时:传输一个数据报的时间要尽可能短
- 最大吞吐量:一定时间内传输的数据要多。
- 最高可靠性:在传输过程中最不容易发生丢包。
- 最低成本:在传输过程中消耗的硬件资源最低。
四种形态种只能切换到一种前台
- 16位总长度
注意这里的关系:
这里的16位总长度 = IP报头 + 载荷的长度
、
总长度 - IP报头长度 = 载荷长度(此载荷长度就是TCP报文总长度)
、
TCP报文总长度 - TCP报头长度 = TCP载荷长度
。
IP协议支持拆包组包的机制,16位总长度(即64kb)针对的是一个数据报,如果是携带的是较长的数据的话,IP协议就会自动地把一个数据包拆分成多个数据报,接收方在进行分用的时候也会把多个数据报合并成一个数据报。
IP协议报文中的16位标识、3位标志位、13位片偏移共同描述了整个IP数据报的拆包组包的过程。
当需要传输的数据超过了网络的最大传输单元(Maximum Transmission Unit,MTU)时,就会触发拆包操作。MTU是指在网络中一次可传输的最大数据包大小。如果需要传输的数据超过了MTU,就需要将数据拆分成多个较小的IP数据报进行传输。
每个IP数据报都有自己的IP报头,包含了源IP地址、目标IP地址、协议类型等信息。而数据报的负载部分(即携带的实际数据)可能属于其他协议,例如TCP或UDP。
对于TCP协议,它会将需要传输的数据进行分段(Segmentation)的操作。TCP会将较长的数据分割成多个较小的TCP数据段(TCP segment),每个TCP数据段都包含TCP报头和对应的数据部分。
这样,当一个较长的TCP数据报需要在IP网络中传输时,它会被分成多个较小的IP数据报,每个IP数据报携带一个TCP数据段。这些小的IP数据报独立传输,通过IP协议的机制在网络中按顺序重新组合,最终将数据传输到目标设备的TCP协议中进行再次组装,以还原原始的较长TCP数据报。
需要注意的是,拆包和重组操作是由网络设备(如路由器)负责的,IP协议只负责将数据报进行传输,并不负责分段和重组的具体操作。
- 16位标识:拆除的这多个包的16位标识是相同的。
- 13位片偏移:拆除的这多个包的13位片偏移是不同的,前一个包的片偏移更小,后一个反之更大,通过片偏移就可以区分包的先后顺序。
- 3位标志位:其中有一位标志位是不变的;有一位表示是否允许拆包,其实这里已经拆包了,所以此位标志位都是1;最后一个标志位表示
结束标记
,表示当前的包是否是最后一个,标志位是零表示是此包是最后一个包。 - 8位生存时间(TTL):单位是
次
,初始情况下TTL有一个初始数值(32/64/128),数据没经过一个路由器转发TTL就会-1,正常来说TTL足以支持数据报到达网路的任意一个位置,但是如果TTL真的变成0了,此时基本上就可以认为目标IP不可达了。 - 8位协议:描述了上层,即传输层,使用了哪种协议
- 16位首部校验和:检验数据是否正确的,这里只需要校验数据报首部即可,因为载荷部分要么是UDP要么是TCP,而TCP、UDP已经校验过自己本身了。
- 32位源ip地址:32位源IP地址其实就是一个32位的整数(即4字节)。使用点分十进制的方式来进行表示(使用三个
.
把32位分为4个部分,每个部分都是8位(即1字节),每个字节的范围都是0-255,不带符号)。
这里有一个问题:既然32位源地址ip的数据量非常有限的,大体是42亿九千万,但是实际上全世界能够上网的设备不仅仅只有这些数字。那么IP地址不够用了该如何应对呢?
**方式一:DHCP
是动态主机配置协议的简称,是一种自动分配IP地址的网络协议。设备如果需要上网的话就需要分配ip,不需要上网就不需要分配ip。使用该方式只能够缓解,但是不能够根治。**
**方式二:NAT机制(网络地址转换)
**
**另外,IP地址分为两大类:一类是内网ip(对于不同的局域网内的设备ip地址可以重复,对于相同的局域网ip地址不可以重复
);另一类是外网ip(外网ip不可以重复)。内网ip一般有三种表示形式:
10.*
、
172.16。*-172.31.*
、
192.168.*
。**
🐟NAT机制
- 情况一:如果是同一个局域网内部的设备之间进行通信,这种情况是没有问题的(因为同一个局域网内的内网ip是唯一的)。
- 情况二:A局域网中的设备想和B局域网中的设备进行通信,由于这是两个不同的局域网中的不同设备,所以这两个设备的ip很有可能是相同的,这种情况是不允许的,会被直接禁止掉。
两个局域网内部的设备是没法进行通信的
。 - 虽然两个局域网内部的设备没法直接进行通信,但是可以间接进行通信,这个时候需要
局域网内部的设备访问带有外网ip的设备
。举个例子:我们平常使用的手机、平板都是在局域网内部去进行使用,它们都有一个自己的内网ip;还有一类设备就是服务器
,服务器的话可以有外网ip,这样的话就涉及到NAT的工作过程了。
我们通过画图来进行举例:
**上述的操作我们可以简单理解为借花献佛,意义何在呢?NAT机制下,一个外网ip代表的不一定是一个设备,也有可能是很多个设备。
**
接下QQ服务器要返回响应,返回的响应依旧是一个IP数据报:
接下来QQ服务器开始返回响应(返回的响应依旧是应给IP数据报):
此时,电信路由器和电脑之间就属于是局域网内部之间的通信了。
好了,上述的NAT过程是一个简化版本的,实际上,数据每经过一个路由器转发都可能会触发NAT机制(这和路由器的配置有关,有的模式下就会触发,有的模式就不会触发),比如说数据经过学校路由器就会触发NAT机制,经过光猫路由器就会触发NAT机制。
**NAT机制的缺点:效率低、使用起来非常繁琐,还有一点就是不方便直接访问局域网内的设备。但是尽管这个NAT机制有如上的缺点,但是整个互联网世界其实就是利用NAT机制构建出来的。NAT机制可以提高IP地址的利用率,但是没有从根本上解决IP地址数量上的问题(即ip地址不够用)。
NAT机制最大的优点就是NAT机制是一个纯软件实现的一个方案,
**
🐱二、IPv6
IPv6从根本上可以解决IP地址不够的问题。
IPv4是4个字节,即32位来表示ip地址。
IPv6是16个字节,即128位来表示ip地址。
**所以,IPv6从根本上解决了ip地址不够使用的问题。
**
我们要知道,IPv6和IPv4是不兼容的,要想升级IPv6的话就需要更换路由器设备,然而升级IPv6之后其实并不会提高网速,也不会提高流畅性。
相比于IPv6,NAT机制只需要路由器开发商开发出新版本的软件(路由器固件),升级软件之后即可直接支持(同时成本也低)。所以ipv4目前发展的比ipv6要好(至少从目前来看的话,ipv4的普及程度要远远高于ipv6),而ipv6大规模普及的话还需要一定的时间。
🐱三、IP地址组成
ip地址分为两个部分:网络号和主机号。
- 网络号:
标识网络
,即保证相互连接的两个网段具有不同的标识。 - 主机号:
标识主机
,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
作为开发者的话,在日常开发中我们不需要知道IP地址是怎么来的,这不是我们该操心的地方,ip地址可以是自动分配的(比如家里的网络环境比较简单),也可以是手动进行分配的(比如说企业的设备,网络环境比较复杂,这个时候就需要网管来进行配置)。
🐱四、特殊的ip地址
网络地址
:将ip地址中的主机地址全部设置为0,在通常的网络设置中,将主机地址全部设置为0被称为网络地址。而网络地址用于表示一个网络中的所有设备。例如,如果网络的IP地址范围是192.168.1.0/24
,则192.168.1.0
被用作网络地址,代表的是整个网络。通常情况下,网络地址不能作为设备的IP地址,因为该地址是用于标识整个网络的。我们不能给具体的设备分配这种ip(ip地址中的主机地址全部设置为0的ip)广播地址
:将ip地址中的主机地址全部设置为1,用于给同一个链路中的所有主机发送数据包。
比如说:
192.168.0.255
,如果向这个ip上发送数据包,那么这个数据就会被转发给局域网中的所有设备。
在传输层协议中,
TCP协议通常不支持广播或多播传输
,因为TCP是一种面向连接的协议(TCP无法针对广播地址进行三次握手建立连接的操作),它在建立连接时需要明确的目的地址。而广播或多播是以一组地址为目的地址的通信方式,并不适用于TCP的连接模式。
相反,
UDP协议可以用于广播或多播传输
,因为UDP是一种无连接的协议,它不需要具体的目的地址。UDP协议的传输方式与广播或多播通信方式是相容的,可以一次性向一组目标地址发送数据。
环回ip
:被用于在本地主机中进行通信。环回IP地址被分配为127.0.0.1
,也被称为本地回环地址
。
🐱五、子网掩码
一个ip地址,我们要想分清楚哪一部分是网络号、哪一部分是主机号,这是通过子网掩码(32位二进制位,通常用10进制来进行表示)来进行识别的。子网掩码和ip地址都是4字节,即32位比特位的整数。**规定子网掩码左侧必须是连续的
1
,右侧必须是连续的
0
。**
举个例子:一个IP地址为192.168.1.100,子网掩码为255.255.255.0的情况。
**子网掩码255.255.255.0对应的32位二进制:11111111.11111111.11111111.00000000
,即代表着前24位是网络位,后8位是主机位。**
**ip地址192.168.1.100对应的32位二进制:11000000.10101000.00000001.01100100
**
**可以确定192.168.1.100的网络位为11000000.10101000.00000001(192.168.1),而主机位为01100100(100)。
**
🐱六、路由转发
IP协议还有路由转发的功能。在互联网中,数据包通过IP协议进行数据的传输,同时根据目标的IP地址来进行路由的选择。
这里只简单介绍一下什么是路由转发:
每个路由器内部都有一个数据结构即
路由表
,数据到达路由器的时候就需要查询路由表(目的是询问该数据要到哪里去,从而选择一个方向进行数据的传输)。如果从这个路由表中查询到了,那么就按照这个方向继续传输数据;如果没有查到的话就会按照路由器默认的方向进行数据的转发。
至于说路由器中的路由表是如何生成的,以及路由表是如何来查询数据究竟要往哪个方向走,这里就不做过多的介绍了。
本文到这里就结束了,希望友友们可以支持一下一键三连哈。嗯,就到这里吧,再见啦!!!
版权归原作者 兜里有颗棉花糖 所有, 如有侵权,请联系我们删除。