网络编程 ———— IP协议(IPV4&IPV6)
Posted 爱敲代码的三毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程 ———— IP协议(IPV4&IPV6)相关的知识,希望对你有一定的参考价值。
接上一篇博客 万字详解TCP协议
文章目录
IPV4首部
(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个之间是发送冲突的
最后一位则为保留位,暂时没有定义
但实际开发中,很少涉及到这里。
列如你想要最小延迟时,还是得在应用层(应用程序中),通过一些巧妙地算法、数据结构来提高这里的效率
(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协议核心功能:
- 地址管理:能通过一系列的规则,把网络上的设备的地址给描述出来
- 路由选择:根据当下的源地址和目的地址,规划出一条合适的路径
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,前半部分叫网络号,后半部分叫主机号
如何划分从哪到哪是网络号,可以通过子网掩码来区分
子网掩码非常有特点,左半部分都是1,右半部分都是0
然后把子网掩码和ip地址进行按位与运算,得到的结果就是网络号
子网掩码不一定非得是255.255.255.0,但是这个是最常见的
2.路由算法(路由选择)
此处的路由选择的过程其实就是A到B之间选择一条合适的路径来选择一条路线
这个路径会综合考虑,路径的长短,通信的速度,设备开销的大小
3.特殊的IP地址
-
如果是主机号为全0,这个IP就表示网络号,表示当前这个网段
-
如果是主机号为1,这个IP通常表示当前网段的“网关”(就是路由器,这个网络的出入口)
-
如果是主机号为255,这个IP表示"广播IP"
如果搞一个UDP数据报,然后把目的IP写成主机号为 255 的IP,此时这个数据就能在当前局域网中广播(会发给每一个局域网中的设备)
-
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替换了**
NAT机制是当下咱们互联网中的典型情况
三类IP都表示局域网
- 10.*****
- 172.16.-172.31.
- 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&IPV6)的主要内容,如果未能解决你的问题,请参考以下文章
计算机网络ipv4的ip协议实验报告,IPv4协议分析_实验五
王道考研 计算机网络17 IP数据报 最大传送单元MTU IP地址 IPv4 子网划分 ARP协议 ICMP协议 移动IP