注:本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
背景知识——网络层的设计原则(意译)
- 保证它能跑起来
在没有确定它一定能跑起来之前不要急着最终确定标准
- 简单
- 有明确的选择
做同一件事情只需要通过一种方式
- 利用模块化
模块分离,一个模块出现问题不影响其他
- 简单、通用、灵活以适应不同环境
- 避免静态选项和参数
如果一定会用到参数,也最好是收发双方协商好一个值,而不是写死了的固定的参数
- 设计不需要十全十美
好的设计是满足大多数人的要求,如果有人有一些奇怪的、特殊的要求,就让他们自己想办法
- 对发送给别人的信息要高要求,对收到的信息可以容忍有瑕疵
严以律己,宽以待人
- 要考虑规模
如果系统的规模是百万甚至亿级规模的,不要再用中心化的数据库,一定要考虑负载均衡的问题
- 考虑性能和成本
IP地址
IPv4头部
可以这么记忆:
头部的必备部分分为五行:
- 第一行是与包的长度相关
- 第二行是成帧相关
- 第三行是传输相关
- 第四行是源地址,第五行是目标地址
下面是对各部分的详细解读:
version:版本号
是ipv4还是ipv6
IHL:ip header length
头部大小=IHL(10)x4
IHL的取值范围为5\~15
所以对应头部大小取值范围为20\~60
Differentiated service
total length:整个数据报的大小
total length=头部大小(IHL(10)X4)+数据部分
identification
来自同一个包的帧有相同的值
我的理解:便于组装
DF、MF、fragment offset作用
- DF:don't fragment,所以为1时不分片
- MF:more fragment,所以为1时分片未完,为0时分片结束
- fragment offset:确定fragment在包中的位置
这个标志位有13位,表示单个packet最多可容纳2^13个fragment
(回顾:total length是16bit,其实很逼近了)
time to live
最大为255.
递减规则:
- 按秒递减
- 每经过一跳(指从一个路由到另一个路由)
- 当长时间在一个路由的队列中等待,应急速递减
值为0时该包解体,并回传警告包给源主机
协议
在接收方传到上层的什么协议 TCP or UDP?
optional
注意:现在一般不怎么讲这个,因为很多路由不认,了解即可
- security:一般会被路由忽略,还有种此地无银三百两的意味,让有心人知道它很重要
- strict source routing:指定完全路径
- loose source routing:类似于公交车一定得经过某几个站点一样,此处一定得经过某几个路由
- record route:告诉路由加上它的ip地址到包里
- timestamp:告诉路由加上它的ip地址+时间戳
参考书籍
《计算机网络 第五版》Andrew等著(小蓝书)