接上一篇博客 万字详解TCP协议
4位能表示的范围是 0-15 ,指定IP协议的版本,对于IPV4来说就为4
首部长度也是4位(0-15),单位为4个字节,4个比特位能表示的最大数字是15,因此IP头部最大长度是4*15,也就是60个字节
TOS:Type Of Service,由8个比特位构成。
前3个比特位(0到2)为优先度权字段(已经弃用)
3到6分别为最小延迟,最大吞吐量,最高可靠性,最小成本。
这四个bit位中,必须只有一个为1,其他的得是0,不能有多个同时是1,因为不能同时保证最低延迟、最大吞吐量、最高可靠性、最小成本,这4个之间是发送冲突的
最后一位则为保留位,暂时没有定义
列如你想要最小延迟时,还是得在应用层(应用程序中),通过一些巧妙地算法、数据结构来提高这里的效率
和UDP一样IPV4首部也有64K长度的字段
虽然IP协议看起来也是有个最大64K的限制,但是实际上,IP协议内置了分包组包功能
如果一个数据太长了,IP协议就会自动的拆成多个数据报,然后进行传输,然后进行传输,然后接收方就会重新进行组包
16位标识,相当于IP数据报的身份标识,把一个数据拆成多个IP数据报的时候,这三个IP数据报的标识是相同的
13位片偏移,就描述了当前这个包的顺序
3位标志:第一位暂未使用默认必须需是0,第二位表示"禁止分片"为0表示可以分片,为1表示不能分片,第三位表示"更多分片",如果第三位为1表示当前这个分片就是最后一个分片了。如果第三位0表示当前这个分片不是最后一个分片,后面还有分片
如果要在应用层,基于UDP实现拆包组包,就可以照着IP协议的方式抄作业
这个字段表示一个IP数据报最多在网络上存活多久,这个TTL不是一个"时间"概念,而是一个"次数"。由8个bit构成
TTL是指可以中转多少个路由器的意思,每经过一个路由器,TTL会减少1,直到变成0则丢弃该包。如果默认的TTL是64,经过24个路由器后,那么TTL就剩40了
为啥要有TTL?
主要防止这个IP数据报出现环路转发的情况
主机A => 主机B => 主机C => 主机A
8位协议指的是当前的数据被接收方收到之后,分用的时候,要把载荷(数据)内容交给传输层的哪个协议
分用的时候就需要保证,载荷数据内容得和接下来交给的协议相匹配
这个IP报头中就会通过8位协议来制定传输层使用哪个协议来解析数据,具体就需要去查RFC文档
这个 校验和其实也就是一个类似于crc这样的东西
但是此处只需要校验首部即可,载荷部分(就是一个完整的TCP/UDP数据报)其实已经由TCP或者UDP自己进行校验了
源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位整数来表示的
网段划分(组建局域网的时候非常关键)
要求一个局域网里的主机,网络号要相同,主机号不能相同
两个相邻的局域网(通过同一个路由器连接的局域网),网络号必须不相同
把IP地址一分为2,前半部分叫网络号,后半部分叫主机号
子网掩码非常有特点,左半部分都是1,右半部分都是0
然后把子网掩码和ip地址进行按位与运算,得到的结果就是网络号
子网掩码不一定非得是255.255.255.0,但是这个是最常见的
此处的路由选择的过程其实就是A到B之间选择一条合适的路径来选择一条路线
这个路径会综合考虑,路径的长短,通信的速度,设备开销的大小
如果是主机号为全0,这个IP就表示网络号,表示当前这个网段
如果是主机号为1,这个IP通常表示当前网段的“网关”(就是路由器,这个网络的出入口)
如果是主机号为255,这个IP表示"广播IP"
如果搞一个UDP数据报,然后把目的IP写成主机号为 255 的IP,此时这个数据就能在当前局域网中广播(会发给每一个局域网中的设备)
127.*,典型的就是127.0.0.1 环回IP表示自己
32位的IP地址,其实最多能表示42亿9千万,在当下互联网42亿是不够用的
那么如何解决IP地址不够用的问题呢?
一个设备接入网络,就分配,没接入网咯就不分配,因为并不是所有设备都在同时联网。但是这种办法并不是很好,因为设备毕竟这么多,并不能保证这些设备一些联网,一些不联网
使用一个IP地址,来代表一批主机
举个列子
上网买衣服填地址
收件人地址:XX省XX市XX区XX大学
收件人电话:通过电话再来具体区分收件人是谁
这个地址就能表示大学的所有学生的收货地址
一个局域网的中设备的IP是局域网中的IP,局域网的IP就只能在局域网内部来使用
类似于 192.168.xxx.xxx这样的IP,一定是一个局域网内部的IP
局域网内部的IP在同一个局域网内部不能重复,但是两个不同的局域网可以使用重复的局域网IP
此时直接连接到广域网(外网)的路由器设备就会有一个”外网IP“
实际上,这样的局域网里面的设备可能有很多,网络结构可能也很复杂。一个外网IP可能代表着几百,几千甚至几万个网络设备
当局域网内部的数据往广域网上发送的时候,此时路由器就会自动的把其中的源IP替换了**
NAT机制是当下咱们互联网中的典型情况
NAT机制虽热解决了IP地址不够用的问题,但是也引入了其它的问题
比如在自己的机器上搭建了一个服务器,此时想让其它用户通过外网来访问你的服务器,这个时候做不到
自己的机器,只有局域网IP(内网IP),内网IP是可以重复的
其它主机没法就根据一个内网IP找到你的服务器(除非是在同一个局域网里)
IPV6相当于IPV4的升级版
IPv4是使用4个字节(32位)表示IP地址,IPv6使用16个字节(128位)表示IP地址。
IPv6从根本上解决了IP地址不够用的问题,IPv6和IPv4是不兼容的,所以升级IPv6是一件成本比较高的事情
当下主流还是IPV4,也可能几年后会慢慢普及
下一篇网络知识即将更新