SHOUT OUT MY SLOGAN: ——Fighting ! Stealthy Learner (加油偷博仔!)
(来自有道翻译,hhh)
不知不觉,我已经Stealthily learn《计算机网络》了这么多日子了。
所幸,在没人监督的要认真学习的时候,
没有纠结太久:
“to study or not to study (和好姑娘打游戏) is a question”
不像顾城先生笔下的小鱼儿,还在研究(纠结) 《水呀,真急》
水呀,真急,真急,
桥墩后又几条小鱼 …
它们在举行会议,
研究着前进还是退避。
太阳在桥面上走过,
带着几分醉意。
研究在不断继续,
河水在不断流去。
月牙在桥栏边停靠,
似乎要看个仔细。
水呵,真急,真急,
桥墩后又几条小鱼 …
————《水呀,真急》1980年3月
可能,小鱼仍在研究,大鱼已到上游。
加油大鱼儿萌!Let’s get to today’s topic
0 、IP主要内容、IP datagram格式
主要内容是这些:
- 数据报格式
- 分片
- IPv4地址
- NAT:网络地址转换
- IPv6
再来看一下IP在网络中所在的层次。
- 互联网的网络层 (主机,路由器中的网络层功能:)
同时,网络层还有其他的协议,比如 “路由协议”。(会实现控制平面的路由功能。)
在讲到网络层的控制平面,会细说。
红框摘出来看一下。
IP 协议
•地址约定 (长度啊、有无分成网络部分/主机部分啊/、有没有所谓内网地址啊…)
•数据报格式 (pdu格式,分成header和body。)
•分组处理的约定 (ttl -1 …)
而ICMP协议主要是拿来测试的,比如ping…
- IP 数据报格式
Describes several fields
固定20字节的头部。
选项长度 = 数据报总长(length) - 20Bytes的固定长度
·
IP 协议版本号(ver):——4个bits。
现在上面就是IPV4(0100)的数据报格式。
头部长度(head len),以一(bit)当四(bytes) :
普通IP数据报(没有option时)该字段的值是5(即20个字节的长度)。如果有options那么大于5
服务类型(TOS、type of service):
占用8位二进制位,用于规定本数据报的处理方式。基本废弃不用了…
第二行的三个字段:
用于分片,后文细说。
Internet checksum:
判断分组的头部在传输过程中,有没有问题
一、IP 分片和重组(Fragmentation & Reassembly)
- 网络链路有MTU(最大传输单元) – 链路层帧所携带的最大数据长度
不同的链路类型
不同的MTU
再Briefly Describes一下MTU:Maximum Transfer Unit:
如果IP层有一个数据报要传,而且数据帧的长度比链路层的MTU还大,
那么IP层就需要进行分片( fragmentation),
即把数据报分成若干片,这样每一片就都小于MTU。
- 大的IP数据报在网络上被分片 (这可不是乱分的啊,是训练有素的IP,有备而来的!)
- 一个数据报被分割成若干个小的数据报
相同的ID (区分不同的数据报)
不同的偏移量 (数据报的按序重组排序)
最后一个分片标记为0 - “重组”只在最终的目标主机进行
- IP头部的信息被用于标识,排序相关分片
- 一个数据报被分割成若干个小的数据报
1.IP 分片和重组-例子
二、IP 编址: 引论
- IP 地址: 32bits标示,对主机或者路由器的接口编址
- 接口: 主机/路由器和物理链路的连接处
路由器通常拥有多个接口
主机也有可能有多个接口
IP地址和每一个接口关联 - 一个IP地址和一个接口相关联
1.子网(Subnets)
-
什么是子网(subnet) ?:
一个子网内的节点(主机或者路由器)
它们的IP地址的高位部分相同(前缀相同),这些节点构成的网络的一部分叫做子网
无需路由器介入(再ip的层面“一跳可达”),子网内各主机可以在物理上相互直接到达 -
IP地址:
子网部分(高位bits)
主机部分(地位bits)
1.1判断一个子网
将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛
像水果忍者,切三刀,三片水蓝蓝的(子网)孤岛
但是呢!
如果不划这三刀,这“三个孤岛”的前缀还是有一样的地方!223.1…
所以,这三个子网,对于外部而言,是一个子网。“路由聚合!”
每一个孤岛(网络)都是一个都可以被称之为subnet
预告一下:
子网掩码: 11111111 11111111 11111111 00000000
Subnet mask: /24
子网掩码(subnet mask)
又叫网络掩码、地址掩码、子网络遮罩,
它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,
以及哪些位标识的是主机的位掩码。
子网掩码不能单独存在,它必须结合IP地址一起使用。
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
1.2猜一下,这有几个子网
是六个!!
hhh…哈哈…哈(有点尴尬)
叨唠两句:
长途连接一般是point 2 point。
而局域网一般采用多点连接的方式。
2.IP 地址分类
拿Class A,Describes一下:
- 最高位是0,(第一个byte的最高位)
- 第1个byte的其他7bits代表网络号。(图中的Class A 的Network字段)
- So,Class A has 126 (27 - 2 = 126) 个网络号,因为约定全0/全1的网络号不用
为什么不用呢?一会看看下面的特殊的IP地址- 然后主机号是 32 - 8 = 24 bits,同理有224-2这么多的主机号
- 所以A类网,全球一共有126个。Have been handed out
对于Class B、C的Table describes
field | Class B | Class C |
---|---|---|
Network | 214-2 | 221-2 |
Host | 216-2 = 65534 | 28-2=254 |
B类,前2个bytes代表网络号
C类,前3个bytes代表网络号
A、B、C类的地址叫做单播地址(unicast)——“我到你”
而D 类地址叫组播地址(multicast)——“我到这个D类组的”…
还以一种叫广播地址(broadcast)——“我到所有”,一般在局域网内部
E 类地址预留的(Reserved for future use) (但存方寸地,留与子孙耕)
在做分组转发的时候只关心网络号,
就是说互联网对一个子网、一个子网,做路由、通告、计算,
而非对单个ip地址做路由。
·
在路由信息的通告的过程当中,还不断地做路由聚集。减少表项,路由减负。
路由聚集的作用:
3.特殊的IP地址
最底下有个Loopback 回路地址(测试地址),
ping 127.x.x.x本地回环地址指的是以127开头的地址(127.0.0.1 - 127.255.255.254),通常用127.0.0.1来表示。
是在ping自个儿呢。
作用有这些:
1.测试本机的网络配置,能PING通127.0.0.1说明本机的网卡和IP协议安装都没有问题
4.内网(专用)IP地址
- 专用地址:地址空间的一部份供专用地址使用
- 永远不会被当做公用地址来分配, 不会与公用地址重复
- 只在局部网络中有意义,区分不同的设备
- 路由器不对目标地址是专用地址的分组进行转发
专用地址范围(A、B、C类都有)
- Class A 10.0.0.0-10.255.255.255 MASK 255.0.0.0
- Class B 172.16.0.0-172.31.255.255 MASK 255.255.0.0
- Class C 192.168.0.0-192.168.255.255 MASK 255.255.255.0
Class C地址,比较熟悉,192.168.0.0
·
5.IP 编址: CIDR
以下内容部分来自于这篇文章
背景:
在1992年因特网仍然面临三个必须尽早解决的问题,
这就是:B类地址在1992年已分配了近一半,眼看就要在1994年3月全部分配完毕!
因特网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
整个 IPv4 的地址空间最终将全部耗尽。
·
1987年,RFC1009就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。
使用变长子网掩码VLSM(Variable Length Subnet Mask)
可进一步提高IP地址资源的利用率。在VLSM的基础上又进一步研究出
无分类编址方法,
它的正式名字是
无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。
CIDR: Classless InterDomain Routing(无类域间路由)
网络前缀越短,
其地址块所包含的地址数就越多。
而在三级结构的IP地址中,划分子网是使网络前缀变长。
- 子网部分可以在任意的位置
- 地址格式: a.b.c.d/x, 其中 x 是 地址中子网号的长度
区分A、B、C类网络只需分别比较IP地址的前1、2、3个byte(s),
·
但对于这种无类域间路由,要如何区分其无类网络号?
简直欲哭无类了!
于是子网掩码,应运而生。
无类网络是一种相对于有类网络的网络,无类网络IP地址的掩码是变长的。
在有类网络的基础上,拿出一部分主机ID作为子网ID。
·
例如:
IP地址为192.168.250.44 子网掩码不能是小于24位。
因为这是一个C类地址(前3Bytes是网络号),子网掩码只能大于24位。
而掩码255.255.248.0(21位)是不符合规定的。
·
如果一个网络中的主机有100台,
那么,可以用子网掩码/25来划分这个C类网络(“192.168.250.0/24”):
划分成192.168.250.0/25 和192.168.250.128/25两个子网。
—主机192.168.250.44/25 属于子网192.168.250.0/25。
做足了铺垫,终于迎来下面这个机智的发明
6.子网掩码(subnet mask)
根据RFC950定义,
子网掩码是一个32位的2进制数,
其对应网络地址的所有位都置为1,
对应于主机地址的所有位置都为0。
使用子网是为了减少IP的浪费。
因为随着互联网的发展,越来越多的网络产生,有的网络多则几百台,
有的只有区区几台,这样就浪费了很多IP地址,所以要划分子网。
使用子网可以提高网络应用的效率。
·
子网掩码判断两台计算机是否属于同一网段的方法是,
将计算机十进制的IP地址和子网掩码转换为二进制的形式,然后进行二进制
“与”(AND)计算(全1则得1,不全1则得0),如果得出的结果是相同的,
那么这两台计算机就属于同一网段。
7.转发表和转发算法
8.主机如何获得一个IP地址
-
系统管理员将地址配置在一个文件中
Wintel: control-panel->network-> configuration->tcp/ip->properties
(就是你使用的网络(无线wifi、以太网等)的属性,)
UNIX: /etc/rc.config -
DHCP: Dynamic Host Configuration Protocol: 从服务器中动态获得一个IP地址
“plug-and-play”
很多无线路由器都有DHCP服务
(老头老太太上网就不用自己配ip)
8.1.DHCP: Dynamic Host Configuration Protocol(动态主机配置协议)
- 目标: 允许主机在加入网络的时候,动态地从服务器那里获得IP地址:
可以更新对主机在用IP地址的租用期-租期快到了
重新启动时,允许重新使用以前用过的IP地址
支持移动用户加入到该网络(短期在网) - DHCP工作概况: 图文并茂的解释在8.2
主机广播“DHCP discover” 报文[可选] (ip地址全1)
DHCP 服务器用 “DHCP offer”提供报文响应[可选]
主机请求IP地址(单播ip地址请求):发送 “DHCP request” 报文
DHCP服务器发送地址:“DHCP ack” 报文
8.2 DHCP client-server scenario (DHCP 客户-服务机场景 )
transaction:(一笔)交易,业务,买卖; 办理; 处理
transaction ID: 事务号
·
简单说明上面的新来的client和DHCPserver的“你来我往”:
第一步:Client通过广播(broadcast)发送DHCP Discover 报文,Look for服务器端第二步:Server通过单播(unicast)发送DHCP Offer 报文向客户端提供IP地址等网络信息
第三步:Client通过广播DHCP Request 报文告知服务器端本地选择使用哪个IP地址
第四步:Server通过DHCP Ack报文告知客户端IP地址是合法可用的
8.3 DHCP: 不仅仅是IP addresses(好文章,DHCP协议原理及其实现流程)
- DHCP 返回:
IP 地址
第一跳路由器的IP地址(默认网关)
DNS服务器的域名和IP地址
子网掩码 (指示地址部分的网络号和主机号)
(老头老太太上网就不用自己配ip、网关、子网掩码、DNS了)
8.4 DHCP: 实例
- 联网笔记本需要获取自己的IP地址,第一跳路由器地址和DNS服务器:采用DHCP协议
- DHCP 请求被封装在UDP段中, 封装在IP数据报中,封装在 以太网的帧中
- 以太网帧在局域网范围内广 播 (dest: FFFFFFFFFFFF) , 被运行DHCP服务的路由器收 到
- 以太网帧解封装成IP,IP 解封装成UDP,解封装成 DHCP
- DHCP服务器生成DHCP ACK,包含客户端的IP地址,第一跳路由器的IP地址和DNS域名服务器的IP地址
- DHCP服务器封装的报文所在的帧转发到客户端,在客户端解封装成DHCP报文
- 客户端知道它自己的IP地址,DNS服务器的名字和IP地址,第一跳路由器的IP地址
8.5 DHCP: Wireshark 输出(home LAN)
这部分、老师没讲,我附一下。
9.如何获得一个网络的子网部分(从ISP)
- 从ISP获得地址块中分配一个小地址块
结合9.1图一起分析
9.0.一个ISP如何获得一个地址块
向ICANN机构申请
- ICANN: Internet Corporation for Assigned Names and Numbers
分配地址
管理DNS
分配域名,解决冲突
那么,
ICANN怎么获得地址呢?
9.1层次编址: 路由聚集(route aggregation)
(上面是老师的讲解视频76min20s处开始)
层次编址允许路由信息的有效广播:
Des: destination
MK: Mask
Next: Next hop
Inf: Interface
我大概是这样Understand的:
左边8个蓝框框(Organization 0~7)
是从一个大机构(大块ip)获得小块 (子网)
第一块地址:200.23.16.0/23:
——前23位是网络号,剩下的9位是主机号所以有29-2=510个主机号
——最大主机号是200.23.17.255(当然,这是全1的主机号,不使用)
·——怎么算出最大主机号呢?我是这样的:
9位主机地址,8位低地址范围是0~255;还剩1位,处在“16”所在8bits的末位,
那么1位范围0 ~ 1 ,最大就是(16+1)17。
(所谓16所在8bits:我把ip地址看作是8bits . 8bits . 8bits . 8bits)子网前缀为200.23.16的ip都发给(NextHop)ip0
子网前缀为200.23.18的ip都发给(NextHop)ip1
…
子网前缀为200.23.30的ip都发给(NextHop)ip7
然后这ip0~7 就路由聚集,发到ipx (前缀为200.23.16.0 /20)那,为什么就/20呢?
其实和上面算最大主机号道理一样
从/23 变到 /20 ,所以主机号又多了高位的3bits
那么 "16"所在的八位,其中低四位是主机号的高四位
所以 16+4bit(范围0~15)<= 31
刚好就聚集了左边的Organization0~8的子网ip,没有空洞ip好比一台设备IP地址200.23.18.7
——处在Organization 1中,
——下一跳(Next)是IP地址位IP1的路由器,
——再下一跳是IPx
反过来,跳到IP地址是200.23.18.7的设备
下面9.2的图,就发挥聪明才智寄几看吧。
9.2层次编址: 特殊路由信息(more specific routes)
10.NAT: Network Address Translation(网络地址转换)
右边是本地网络,(内网),左边是内网之外的网络
- 动机(使用NAT的原因): 本地网络只有一个有效IP地址:
不需要从ISP分配一块地址,可用一个IP地址用于所有的(局域网)设备 –省钱
可以在局域网改变设备的地址情况下而无须通知外界
可以改变ISP(地址变化)而不需要改变内部的设备地址
局域网内部的设备没有明确的地址,对外是不可见的 –安全
10.1实现: NAT 路由器必须:
-
外出数据包:
源地址和端口号为NAT IP地址和新的端口号,
目标IP和端口不变 …远端的C/S将会用NAP IP地址,
新端口号作为目标地址 -
记住
每个转换替换对(在NAT转换表中)
… 源IP,端口 vs NAP IP ,新端口 -
进入数据包:
替换目标IP地址和端口号,
采用存储在NAT表中的mapping (映射) 表项,用(源IP,端口)
- 16-bit端口字段:
6万多个同时连接,一个局域网!
实现: NAT 路由器图示如下
However,
外网设备想和内网设备友好的打交道呢?
另一方面,避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
外网只知道一个面具ip(NAT ip),并不知道这面具之下的
真实面孔(内网设备ip)
“这就是NAT 穿越的问题了"
10.2对NAT是有争议的
- 路由器只应该对第3层做信息处理,而这里对端口号(4层)作了处理
- 违反了end-to-end 原则
- 端到端原则:复杂性放到网络边缘
无需借助中转和变换,就可以直接传送到目标主机 - NAT可能要被一些应用设计者考虑, eg, P2P applications
- 外网的机器无法主动连接到内网的机器上
- 端到端原则:复杂性放到网络边缘
- 地址短缺问题可以被IPv6 解决
- NAT穿越: 如果客户端需要连接在NAT后面的服务器,如何操作
10.3NAT 穿越问题
- 客户端需要连接地址为10.0.0.1的服务器
- 服务器地址10.0.0.1 LAN本地地址 (客户端不能够使用其作为目标地址)
整网只有一个外部可见地址: 138.76.29.7
- 服务器地址10.0.0.1 LAN本地地址 (客户端不能够使用其作为目标地址)
-
方案1: 静态配置NAT:
转发进来的对服务器特定端口连接请求
e.g., (123.76.29.7, port 2500) 总是转发到10.0.0.1 port 25000 -
方案2: Universal Plug and Play (UPnP) Internet Gateway Device (IGD) 协议.
允许NATted主机可以:
获知网络的公共 IP地址(138.76.29.7)
列举存在的端口映射
增/删端口映射 (在租用时间内)
i.e., 自动化静态NAT端口映射配置
-
方案 3: 中继 (used in Skype)
NAT后面的服务器建立和中继的连接
外部的客户端链接到中继
中继在2个连接之间桥接
这三个方法不作解释了,一笔带过。下面来看ipv6
11.IPV6
初始动机: 32-bit地址空间将会被很快用完
另外的动机:
- 头部格式改变帮助加速处理和转发 TTL-1
头部checksum
分片 - 头部格式改变帮助QoS
IPv6 数据报格式:
固定的40 字节头部
数据报传输过程中,不允许分片
11.1IPv6 头部 (Cont)
上述表格各个字段:
先回顾一下ipv4的数据报头部格式
再看看ipv6数据报头部格式
11.2和IPv4的其它变化
11.3从IPv4到IPv6的平移
- 不是所有的路由器都能够同时升级的
没有一个标记日 “flag days”
在IPv4和IPv6路由器混合时,网络如何运转? - 隧道: 在IPv4路由器之间传输的IPv4数据报中携带IPv6数据报
隧道(Tunneling)
或者,按老师的说法。
ipv4看作是大片海洋
ipv6 是这个海洋上的孤岛,
ipv6的数据报,封装成ipv4的载荷,
坐在ipv4的小船上,从一个ipv6的小岛,游啊游,游啊游,
到达另一个ipv6的小岛,再解封装。
从ipv4的载荷中蹦跶出来
然后随着时间的推移,ipv6的岛屿越来越大 (反大陆漂移学说 hhhh)
ipv4的海洋越来越小,
海平面不断下降,小岛不断融合。
最后ipv4变成了”孤岛“,ipv6成为了海洋。
这大概就是平滑的ipv6的应用。
11.4IPv6: 应用
- Google: 8% 的客户通过IPv6访问谷歌服务
- NIST: 全美国1/3的政府域支持IPv6
- 估计还需要很长时间进行部署
20年以上!
看看过去20年来应用层面的变化: WWW, Facebook, streaming media, Skype, …
为什么?
(”留给爱思考的同学们课后思考。“)