IP

155 阅读6分钟

作用

IP协议 在链路层之上,提供一个无连接,尽可能可靠的数据传输协议。

无连接指的是你不需要像打电话一样,先拨通,然后才开始通话,而是像邮寄信件一样,写上一个地址,发送出去即可。

尽可能可靠指的是发送出去的数据不一定保证会送达对方,可能由于网络问题,中间转发路由等各种原因未到达。IP 协议只是尽最大可能去传输,但是不保证。就像邮寄一样,目标搬家,信封弄丢了之类的。

IP报文头部

image.png

ver:

ip 协议使用的版本,现在都是ipv4 ,固定值为0100(这一块可能有人会有点懵,不应该是0010吗,这个就要涉及到大小端。简单来说,比如十进制,123,1是高位。但是当我们传给别人的时候,一次发一位,除了1,2,3的顺序,我们也可以发送3,2,1.前者称为为大头,高位在前。后者叫做小头,低位在前。网络传输一般都是大头) ,ipv6 的话,这个值要改。

hlen:

IP报文的头部长度,单位是4bytes,长度占4bits,最大值为15,也就是说ip头部最多占用60个字节, 其中前 20bytes 是固定的,还剩40bytesoptions

TOS(type of server)

代表这个ip报文的服务类型,例如这个ip报文要最小延时传输,最大可靠传输。这个信息会影响网络router的一些处理行为,但是很多tcp/ip实现都不怎么支持这个字段。

total length

IP报文的总长度,16bits 则表示ip报文组最大为2**16-1 = 63335bytes。使用该字段和 Heln,就可以计算出实际传送的数据大小以及数据的起始位置。 实际上由于mtu以及其他一些限制原因,很多在ip上层的协议都不会传输一个很大的数据量。

这个字段存在的其他意义在于很多链路层,不但有最大传输限制也有最小传输限制,但传输量不够时,链路层会在其后面增加填充字段。如果没有这个字段,可能就不知道实际的ip数据大小。

这个值也会随着分片而变化

Identificaton:

由于实际链路层的限制,ip报文在转发进一个新的链路网时,有的时候会进行分包,以符合实际物理链路的最大传输量限制。 这个Identificaton 就是用来标识分片序号的,后续的flag和frag offset 也是做这个用途的。

//todo

TTL

IP报文在传输过程中会被router进行转发,为了防止被无尽转发,设置一个报文最大的转发次数。没转发一次,该值减少1 . 当这个值为1或者0 时, router 会丢弃改报文。 发送一个icmp time exceed error.

protocol

整个tcp/ip 协议栈时分层的, ip协议属于运输层,protocol 表示其传输数据的上层协议是什么。和tcp,utp,icmp还是其他什么协议。分别内核进行分发处理。

checksum

该字段会对所前20bytes的首部做checksum操作,计算的结果值保存在该字段。

具体计算过程参考zhuanlan.zhihu.com/p/378533002

source ip 和 dest ip

这个没啥好讲的,就是32位ip地址。

options

可选部分,例如可以要求每个转发的路由把自己的ip地址记录到这里。

IP 地址

IP协议通过IP地址来标识一个IP网络中的唯一网络接口(不是host,一个host可以有多个接口)。

IP互联网实际上是一个个子网络通过router互相连接起来的。每一个网络内的传输时不经过router传输到外部(此时路由器充当交换器。这一步时把目标ip和自己的ip分别和子网掩码做,判断结果是否相等,相等是同一网络,不相同则是不同子网)。

IP 地址总共32bit二进制表示。通常每8位用.号分割。每一分割的部分用十进制表示。 例如01111111.11111111.11111111.11111111就表示127.255.255.255

A,B,C三类地址

A,B,C类地址将ip地址划分为network号host号组成。

  1. A类地址:0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前1位是网络号,后3位是主机号。可以简单计算出1.0.0.1 ~ 126.255.255.255(除去一些特殊ip后的结果)
  2. B类地址:10XXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前2位是网络号,后2位是主机号。128.0.0.0~191.255.255.255(除去一些特殊ip)
  3. C类地址:110XXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前3位是网络号,后1是主机号。192.0.0.0 ~223.255.255.255

分类是为了让网络管理更加方便,例如分配给某一个高校123.X.X.XA类地址,在尤其内部自己分配给每个IP给具体的host, . 同时也是router的转发路由表更小。比如所有指向高校的host的路由转发记录用一条123.0.0.0/8即可,而不需要每一个host都有一份转发记录。

子网划分

A,B,C的划分要不过大,要不过小。例如一个A类地址可以有16,777,214个主机,而一个C类地址,则只有254个。(不存在主机号全为1的主机)

子网划分就是把host段再划分为子网号和主机号. 使用X.X.X.X/n,其中n表示网络号的位数。比如一个A类子网,其n=12,则表示网络号(8位)+子网号(4位)+主机号(20位)

这样在一个大的网络段内就可以再次划分为不同的子网,更加便于管理和减少路由表记录数

子网掩码

子网掩码的作用就是判断两个ip地址是否在同一个子网内。网络位和子网位都是1host位为0.例如刚才的X.X.X.X/12的子网掩码为11111111 11110000 00000000 00000000 ,十进制表示为255.240.0.0/12.

用子网掩码和ip地址进行&运算,如果两个ip计算后结果相等。表示在同一个网络。

特殊ip

ip含义
1个A类地址(10.0.0.0~10.255.255.255)私有地址
16个连续的B类地址(172.16.0.0~172.31.255.255)私有地址
256个连续的C类地址(192.168.0.0~192.168.255.255)私有地址
127.X.X.X本地回环地址
主机号全为1广播地址
主机号全为0我也没懂。。。

IP 路由

路由器根据路由表来进行转发。路由表表项有

image.png

  1. 目的ip ,可以是具体host或者网络号。由flag来标识识别
  2. gateway :如果目的ip还需要转发,则该ip是下一个hopip地址,否则表示就在路由器本身网络,表示路由器的一个网络接口地址
  3. gen掩码:当目的ip是网络号时,该字段指定网络号的子网掩码
  4. Flags: U表示启用,G存在表示目标ip是直接在本网络,否则在其他网络上,H表示目的ip是具体host,没有则表示是网络号。
  5. iface: 表示从哪个网络接口转发出去

目的ipdefault或者0.0.0.0表示默认转发地。

转发规则

  1. 先匹配host 目的ip,如果没找到
  2. 匹配网络 目的IP,如果还没找到
  3. 默认网关