网络编程(六) ———— IP协议(IPV4&IPV6)

接上一篇博客 万字详解TCP协议

文章目录

  • IPV4首部
    • (1) 4位版本号(4个比特位)
    • (2) 4位首部长度
    • (3) 8位服务类型(TOS)
    • (4) 16位总长度
    • (5) 8位生存时间(TTL)
    • (6) 8位协议
    • (7) 16位首部校验和
    • (8) 32位源IP地址+32位目的IP地址
  • IP协议
    • 1.地址管理
    • 2.路由算法(路由选择)
    • 3.特殊的IP地址
  • NAT
    • 1. 动态分配IP
    • 2.NAT机制(网络地址替换)
  • IPv6


IPV4首部

网络编程(六) ———— IP协议(IPV4&IPV6)_第1张图片

(1) 4位版本号(4个比特位)

4位能表示的范围是 0-15 ,指定IP协议的版本,对于IPV4来说就为4

(2) 4位首部长度

首部长度也是4位(0-15),单位为4个字节,4个比特位能表示的最大数字是15,因此IP头部最大长度是4*15,也就是60个字节

(3) 8位服务类型(TOS)

TOS:Type Of Service,由8个比特位构成。

前3个比特位(0到2)为优先度权字段(已经弃用)

3到6分别为最小延迟,最大吞吐量,最高可靠性,最小成本。

这四个bit位中,必须只有一个为1,其他的得是0,不能有多个同时是1,因为不能同时保证最低延迟、最大吞吐量、最高可靠性、最小成本,这4个之间是发送冲突的

最后一位则为保留位,暂时没有定义

网络编程(六) ———— IP协议(IPV4&IPV6)_第2张图片
但实际开发中,很少涉及到这里。

列如你想要最小延迟时,还是得在应用层(应用程序中),通过一些巧妙地算法、数据结构来提高这里的效率

(4) 16位总长度

和UDP一样IPV4首部也有64K长度的字段

虽然IP协议看起来也是有个最大64K的限制,但是实际上,IP协议内置了分包组包功能

如果一个数据太长了,IP协议就会自动的拆成多个数据报,然后进行传输,然后进行传输,然后接收方就会重新进行组包

在这里插入图片描述
16位标识,相当于IP数据报的身份标识,把一个数据拆成多个IP数据报的时候,这三个IP数据报的标识是相同的

13位片偏移,就描述了当前这个包的顺序

3位标志:第一位暂未使用默认必须需是0,第二位表示"禁止分片"为0表示可以分片,为1表示不能分片,第三位表示"更多分片",如果第三位为1表示当前这个分片就是最后一个分片了。如果第三位0表示当前这个分片不是最后一个分片,后面还有分片

如果要在应用层,基于UDP实现拆包组包,就可以照着IP协议的方式抄作业

(5) 8位生存时间(TTL)

这个字段表示一个IP数据报最多在网络上存活多久,这个TTL不是一个"时间"概念,而是一个"次数"。由8个bit构成

TTL是指可以中转多少个路由器的意思,每经过一个路由器,TTL会减少1,直到变成0则丢弃该包。如果默认的TTL是64,经过24个路由器后,那么TTL就剩40了

为啥要有TTL?

主要防止这个IP数据报出现环路转发的情况

主机A => 主机B => 主机C => 主机A

(6) 8位协议

8位协议指的是当前的数据被接收方收到之后,分用的时候,要把载荷(数据)内容交给传输层的哪个协议

分用的时候就需要保证,载荷数据内容得和接下来交给的协议相匹配

在这里插入图片描述

这个IP报头中就会通过8位协议来制定传输层使用哪个协议来解析数据,具体就需要去查RFC文档

(7) 16位首部校验和

这个 校验和其实也就是一个类似于crc这样的东西

但是此处只需要校验首部即可,载荷部分(就是一个完整的TCP/UDP数据报)其实已经由TCP或者UDP自己进行校验了

(8) 32位源IP地址+32位目的IP地址

源IP就表示"发件人地址",目的IP就表示"收件人地址",IP协议最重要做的事情就是这个事情

IP协议

IP协议核心功能:

  1. 地址管理:能通过一系列的规则,把网络上的设备的地址给描述出来
  2. 路由选择:根据当下的源地址和目的地址,规划出一条合适的路径

IPV4协议中,主要通过一个32位整数来表示

更常见的做法是把这个32位整数表示成"点分十进制",使用3个点,把一个32位的数字分成4份,每一份就是8bit(一个字节),每一份就是[0-255]

比如 192.168.0.1

192 = 1100 0000

168 = 1010 1000

0 = 0000 0000

1 = 0000 0001

点分十进制存粹是给人看的,而计算机内部仍然是通过32位整数来表示的

1.地址管理

网段划分(组建局域网的时候非常关键)

要求一个局域网里的主机,网络号要相同,主机号不能相同

两个相邻的局域网(通过同一个路由器连接的局域网),网络号必须不相同

把IP地址一分为2,前半部分叫网络号,后半部分叫主机号

网络编程(六) ———— IP协议(IPV4&IPV6)_第3张图片
如何划分从哪到哪是网络号,可以通过子网掩码来区分

子网掩码非常有特点,左半部分都是1,右半部分都是0

然后把子网掩码和ip地址进行按位与运算,得到的结果就是网络号

子网掩码不一定非得是255.255.255.0,但是这个是最常见的

2.路由算法(路由选择)

此处的路由选择的过程其实就是A到B之间选择一条合适的路径来选择一条路线

这个路径会综合考虑,路径的长短,通信的速度,设备开销的大小

网络编程(六) ———— IP协议(IPV4&IPV6)_第4张图片

3.特殊的IP地址

  1. 如果是主机号为全0,这个IP就表示网络号,表示当前这个网段

  2. 如果是主机号为1,这个IP通常表示当前网段的“网关”(就是路由器,这个网络的出入口)

  3. 如果是主机号为255,这个IP表示"广播IP"

    如果搞一个UDP数据报,然后把目的IP写成主机号为 255 的IP,此时这个数据就能在当前局域网中广播(会发给每一个局域网中的设备)

  4. 127.*,典型的就是127.0.0.1 环回IP表示自己

NAT

32位的IP地址,其实最多能表示42亿9千万,在当下互联网42亿是不够用的

那么如何解决IP地址不够用的问题呢?

1. 动态分配IP

一个设备接入网络,就分配,没接入网咯就不分配,因为并不是所有设备都在同时联网。但是这种办法并不是很好,因为设备毕竟这么多,并不能保证这些设备一些联网,一些不联网

2.NAT机制(网络地址替换)

使用一个IP地址,来代表一批主机

举个列子

上网买衣服填地址

收件人地址:XX省XX市XX区XX大学

收件人电话:通过电话再来具体区分收件人是谁

这个地址就能表示大学的所有学生的收货地址

一个局域网的中设备的IP是局域网中的IP,局域网的IP就只能在局域网内部来使用

类似于 192.168.xxx.xxx这样的IP,一定是一个局域网内部的IP

局域网内部的IP在同一个局域网内部不能重复,但是两个不同的局域网可以使用重复的局域网IP

此时直接连接到广域网(外网)的路由器设备就会有一个”外网IP“

实际上,这样的局域网里面的设备可能有很多,网络结构可能也很复杂。一个外网IP可能代表着几百,几千甚至几万个网络设备
网络编程(六) ———— IP协议(IPV4&IPV6)_第5张图片
当局域网内部的数据往广域网上发送的时候,此时路由器就会自动的把其中的源IP替换了**

NAT机制是当下咱们互联网中的典型情况

网络编程(六) ———— IP协议(IPV4&IPV6)_第6张图片
三类IP都表示局域网

  1. 10.*****
  2. 172.16.-172.31.
  3. 192.168.*

NAT机制虽热解决了IP地址不够用的问题,但是也引入了其它的问题

比如在自己的机器上搭建了一个服务器,此时想让其它用户通过外网来访问你的服务器,这个时候做不到

自己的机器,只有局域网IP(内网IP),内网IP是可以重复的

其它主机没法就根据一个内网IP找到你的服务器(除非是在同一个局域网里)

IPv6

IPV6相当于IPV4的升级版

IPv4是使用4个字节(32位)表示IP地址,IPv6使用16个字节(128位)表示IP地址。

IPv6从根本上解决了IP地址不够用的问题,IPv6和IPv4是不兼容的,所以升级IPv6是一件成本比较高的事情

当下主流还是IPV4,也可能几年后会慢慢普及


下一篇网络知识即将更新

你可能感兴趣的:(网络编程,ip,ipv4,网络,网络协议)