IP协议格式
下面我们根据上图划分进行分别讲解:
- 4位版本号:指定IP协议的版本,对应IPv4来说是4
- 4位首部长度:IP头部长度0-15 单位是4个字节
- 8位服务类型(TOS):3位优先权字段(已弃用),4位TOS字段,1位保留字段(必须为0),4位TOS表示最小延时,最大吞吐量,最高可靠性,最小成本,4者中只能选其一,这就要求这四个bit位中只能有一个1,其他是0,不能同时有多个1.
- 16位总长度(字节数):64k,虽然IP协议看起来有最大64k的限制,但是如果一个数据太长,IP协议就会自动拆成多个数据包,然后进行传输,接收方就会重新进行组包。
- 16位标识:相当于IP数据包的身份标识,把一个数据包拆成多个IP数据包的时候,这时被拆分的IP数据包的标识是相同的。用来辅助实现拆包组包。
- 3位标志:第1位保留,第2位表示”禁止分片",第3位表示“更多分片",如果第3位为1表示当前这个分片就是最后一个分片,如果这一位为0表示当前这个分片不是最后一个分片。用来辅助拆包分包。
- 13位片偏移:表示当前分片在原报文中哪个位置,描述了当前包的顺序。用来辅助拆包组包。
- 8位生存时间(TTL):表示IP数据包最多在网络上存活多久。TTL不是一个时间概念,而是一个”次数“,数据包到达目的地的最大报文跳数。每次经过一个路由TTL减1,一直减到0如果还没到达就丢弃。TTL用来防止出现路由循环。
- 8位协议:表示当前数据包被接收方收到后分用的时候要把载荷的内容交给传输层的哪个协议。
- 16位首部校验和:类似于crc,鉴别头部是否损坏。
- 32位源地址:表示发送端
- 32位目标地址:表示接收端
IP协议的核心功能
地址管理
地址管理:通过一系列的规则,把网络上的设备的地址描述出来。 IPv4协议中,主要通过一个32位的整数来表示地址,常见做法是把这个整数表示成”点分十进制“使用3个点把32位数字分成4分每份就是8bit(一个字节)如123.139.93.212 那么一个重要的问题来了,32位表示的IP地址是否够用,首先我们希望每个主机都有不同的IP,32位IP地址最多表示42亿9千万,当下来看42亿好像不太够用。 那么如何解决地址不够用呢?
- 动态分配IP:一个设备接入网络就分配地址,没接入网络就不分配。但这个办法治标不治本,想想现在我们的手机差不多时刻都保持在开机联网状态。
- NAT机制:网络地址替换,使用一个IP地址表示一批主机。
局域网IP只能在局域网内部使用,在同一个局域网内部IP不能重复,但两个不同的局域网可以使用重复的IP。 直接连接到广域网的路由设备就会有一个”外网IP". - 使用IPv6,IPv6是使用16个字节(128位)表示IP地址.
NAT IP转换过程
- NAT路由器将源地址从10.0.0.10替换成全局IP 202.244.274.37.
- NAT路由器收到外部数据时又把目标IP从202.244.173.37替换成10.0.0.10
- 在NAT路由器内部有一张自主生成的用于地址转换的表
- 当10.0.0.10第一次向163.221.120.9发送数据就会生成表中映射关系。
那么问题来了,如果局域网内多个主机访问同一个外网服务器,那么服务器返回数据,目的IP相同,如何判断这个数据包发给局域网的哪个主机. NAPT解决了这个问题,通过IP+端口号解决
网段划分(组建局域网)
要求一个局域网中的主机,网络号相同,主机号不同。两个相邻局域网(同一个路由器连接的局域网)网络号必须不同。 IP地址一分为二,前半部分叫网络号,后半部分叫主机号。 通过“子网掩码”区分哪个是网络号。 将32位子网掩码与IP地址进行二进制形式按位“与”(AND)运算得到的是网络地址,将子网掩码二进制和IP地址二进制进行逻辑“与”(AND)得到的是主机地址。如192.168.10.11 AND 255.255.255.0,结果为192.168.10.0 表示含义该IP地址属于192.168.10.0这个网络,其主机号为11.
路由选择
路由选择:根据当下的源地址和目的地址,规划出一条合适的路径。 IP协议中,数据到达某个路由器之后,这个路由器并不知网络整体的环境,这个路由器只知道它附近的情况,IP协议寻路的过程是一个“探索式”的过程。 如我要从家,去中山公园(假设我知道路线,且没有导航) 1.出门,看到路人就问中山公园怎么走,如果知道具体路线,我直接按照这个路线走就可以,如果不知道,路人就会说虽然我不知道具体地方在哪,但你可以坐地铁去。 2.我走到地铁口,又揪住一个路人问中山公园怎么走,如果路人知道具体怎么走就直接按照路线走,如果路人不知道具体位置,但会说虽然我不知具体位置,但我知道要坐地铁二号线,往机场方向。 3.我坐上二号线,又揪住路人问中山公园怎么去,知道具体位置直接按照路线走,不知道具体位置,但知道经过娄山关路后下车。 随着这个过程的推进,我逐渐靠近中山公园,揪住路人问中山公园具体位置的概率也大大增大。 上述的每一个路人都相当于一个路由器,每个路人都有一个自己收悉的范围,在收悉的范围里知道具体怎么走,出了范围就只知道一个大致方向,这个就类似于路由器中的核心数据结构“路由表”。 那么路由表具体是什么,大家可以自己了解下,此处就不展开介绍了。
|