作用
IP协议 在链路层之上,提供一个无连接,尽可能可靠的数据传输协议。
无连接指的是你不需要像打电话一样,先拨通,然后才开始通话,而是像邮寄信件一样,写上一个地址,发送出去即可。
尽可能可靠指的是发送出去的数据不一定保证会送达对方,可能由于网络问题,中间转发路由等各种原因未到达。IP 协议只是尽最大可能去传输,但是不保证。就像邮寄一样,目标搬家,信封弄丢了之类的。
IP报文头部
ver:
ip 协议使用的版本,现在都是ipv4 ,固定值为0100(这一块可能有人会有点懵,不应该是0010吗,这个就要涉及到大小端。简单来说,比如十进制,123,1是高位。但是当我们传给别人的时候,一次发一位,除了1,2,3的顺序,我们也可以发送3,2,1.前者称为为大头,高位在前。后者叫做小头,低位在前。网络传输一般都是大头) ,ipv6 的话,这个值要改。
hlen:
IP报文的头部长度,单位是4bytes,长度占4bits,最大值为15,也就是说ip头部最多占用60个字节, 其中前 20bytes 是固定的,还剩40bytes给options
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号组成。
- A类地址:
0XXXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前1位是网络号,后3位是主机号。可以简单计算出1.0.0.1 ~ 126.255.255.255(除去一些特殊ip后的结果) - B类地址:
10XXXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前2位是网络号,后2位是主机号。128.0.0.0~191.255.255.255(除去一些特殊ip) - C类地址:
110XXXXX.XXXXXXXX.XXXXXXXX.XXXXXXXX.前3位是网络号,后1是主机号。192.0.0.0 ~223.255.255.255
分类是为了让网络管理更加方便,例如分配给某一个高校123.X.X.X的A类地址,在尤其内部自己分配给每个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地址是否在同一个子网内。网络位和子网位都是1,host位为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 路由
路由器根据路由表来进行转发。路由表表项有
- 目的
ip,可以是具体host或者网络号。由flag来标识识别 gateway:如果目的ip还需要转发,则该ip是下一个hop的ip地址,否则表示就在路由器本身网络,表示路由器的一个网络接口地址gen掩码:当目的ip是网络号时,该字段指定网络号的子网掩码Flags:U表示启用,G存在表示目标ip是直接在本网络,否则在其他网络上,H表示目的ip是具体host,没有则表示是网络号。iface: 表示从哪个网络接口转发出去
目的ip为default或者0.0.0.0表示默认转发地。
转发规则
- 先匹配host 目的ip,如果没找到
- 匹配网络 目的IP,如果还没找到
- 默认网关