[What]图解TCPIP_ip

TCP/IP的心脏是网络层,主要由IP(Internet Protocol) 和 ICMP(Internet Control Message Protocol)两个协议组成,先来学习IP.

主机: 配置有IP地址,但是不进行路由控制的设备

路由器: 配有IP地址又具有路由控制(数据转发)能力的设备

节点: 主机和路由器的统称

IP的作用

IP(IPv4,IPv6)相当于OSI参考模型的第三层–网络层,主要实现终端节点之间的通信,这种终端节点之间的通信也叫"点对点(end to end)通信"。

  • 物理层与数据链路层的联合,仅能在一种数据链路节点之间进行包传递,而跨越多种数据链路,就需要借助网络层。
  如果我们只有行程表而没有车票,就无法搭乘交通工具到达目的地。反之如果除了车票其他什么都没有,恐怕也很难到达目的地。因为你不知道该坐什么车,也不知道在哪里换乘。因此只有两者兼备,既有某个区间的车票又有整个旅行的行程表,才能保证到达目的地。

  与之类似,计算机网络中也需要数据链路层和网络层才能实现向最终目标地址的通信。

IP基础知识

IP大致分为三大作用模块,它们是IP寻址、路由、IP分包与组包。

IP寻址

同一个数据链路的通信需要用到MAC地址,网络层也需要IP地址来区分各个连接上互联网的节点。

  • 网桥或交换机线器等在物理层数据转发设备中,不需要设备IP地址,它们只负责数据部分转发不需要应对IP协议。

路由控制

路由控制(Routing)是指将 分组数据 发送到最终目标地址的功能.

当某个IP包到达路由器时,路由器首先查找其目标地址,从而再决定下一步应该将这个包发往哪个路由器。 当这个IP包达到那个路由器后,会再次经历查找下一目标地址的过程,并由该路由器转发给下一个被找到的路由器。 这个过程可能会反复多次,直到找到最终的目标地址将数据包发送给这个节点。

为了将数据包发给目标主机,所有主机都维护着一张路由控制表(Routing Table),该表记录IP数据在下一步应该发给哪个路由器,IP包将根据这个路由表在各个数据链路上传输。

数据链路的抽象化

对IP层来说,不论底层数据链路使用以太网还是无线LAN、PPP都将一视同仁.

不同的物理层MTU是不同的,IP对要发送的数据进行分片处理(IP Fragmentation),接收端在依据序号进行组合。

IP属于面向无连接型

为了简化协议及提高发送速度,在发包之前,不需要建立与对端目标地址之间的连接。

IP地址基础知识

定义

IP地址由4个字节由点分隔组成,每个字节是无符号型。

  • 理论上可以分配出43亿个IP组合,但由于某些IP有特殊用途,并且一些设备上有多块网卡,所以无法完成连接43亿台计算机。

组成

IP地址由"网络标识(网络地址)"和"主机标识(主机地址)"两部分组成。

比如 192.168.128/24 表示用24位来表示网络标识,其固定为 192.168.128 ,剩下的为主机标识。

  • 网络标识必须保证相互连接的每个段的地址不相重复,而相同段内相连的主机必须有相同的网络地址
  • 相同段内的主机标识不允许重复出现

分类

IP地址分为 ABCD 类,根据网络地址区分。

  • A类地址: 首位恒定为0,第1到第8位为网络标识: 0.0.0.0 ~ 127.0.0.0/8
    • 也就是其后24位都是主机地址,去除全0和全1的保留地址,说明每一个A类网络地址可以分配16777214个主机地址
  • B类地址: 前两位恒定为 "10",第1位到第16位为网络标识: 128.0.0.0 ~ 191.255.0.0/16
    • 也就是其后16位都是主机地址,去除全0和全1的保留地址,说明每一个B类网络地址可以分配65534个主机地址
  • C类地址: 前三位恒定为 "110",第1位到第24位是网络标识: 192.168.0.0 ~ 223.255.255.0/24
    • 也就是其后8位都是主机地址,去除全0和全1的保留地址,说明每一个C类网络地址可以分配254个主机地址
  • D类地址: 前4位恒定为 "1110",第1位到第32位是网络标识: 224.0.0.0~239.255.255.255
    • 这种情况下没有主机地址了,常用于多播

广播地址

根据上面的地址分类,当主机地址为全1时,就代表广播地址,广播分为本地广播和直接广播两种。

  • 本地广播:本地网络内的广播
  • 直接广播:在不同网络之间的广播

IP多播

多播用于将包发送给特定组内的所有主机, 由于其直接使用IP协议,因此也不存在可靠传输。

多播使用的是D类地址,剩下的28位作为多播的组编号。

  • 从224.0.0.0 ~ 224.0.0.255 不需要路由控制,在同一个链路内也能实现多播。而在范围外设置多播会给全网所有组成员发送多播的包。
  • 所有的主机必须属于224.0.0.1的组,所有的路由器必须属于224.0.0.2的组。

子网掩码

子网掩码用于将ABC类地址进行细分,避免主机地址浪费。

子网掩码也由32位组成,对应网络地址的部分全部为1,对应主机地址的部分全部为0.

比如一个B类的IP地址: 172.20.100.0 ,其子网掩码为 255.255.255.192,这样其主机地址只剩下6位了。

最终其地址范围为: 172.20.100.0 ~ 172.20.100.63 , 主机地址最多62位

CIDR 与 VLSM

  • 采用任意长度分割IP地址的网络标识和主机标识,这种方式叫做 CIDR(Classless Inter Domain Routing, 无类型域间选路)。
    • 利用CIDR可以将多个C类地址划分到一个较大的网络内。
  • VLSM(可变长子网掩码) : 可以随机修改组织内各个部门的子网掩码长度的机制。

全局地址和私有地址

规定了私有网络的IP地址:

  • A类 : 10.0.0.0 ~ 10.255.255.255
  • B类 : 172.16.0.0 ~ 172.31.255.255
  • C类 : 192.168.0.0 ~ 192.168.255.255

除此之外的IP地址为公网IP.

私有IP通过NAT技术访问互联网,这就缓解了IP分配资源紧张的问题。

路由控制

路由控制表(Routing Table)使得数据包可以知道发往真正的目标地址,实现IP通信的主机和路由器必须持有一张这样的表。

  • 静态路由控制: 由管理员手动设置该表
  • 动态路由控制: 路由器与其他路由器相互交换信息时自动刷新

IP本身并没有定义制作路由控制表的协议,该表是由 "路由协议" 制作而成的。

IP地址与路由控制

IP地址的网络地址部分用于进行路由控制:

  • 路由控制表中记录着网络地址与下一步应该发送至路由器的地址
    • linux上使用 netstat -rn 可以查看路由表
    • window上使用 netstat -r 可以查看路由表
  • 在发送IP包时,首先确定目标IP网络地址,再从路由表中找到与该地址具有相同网络地址的记录,根据记录转发给下一个路由器
    • 如果路由控制表中存在多条相同网络地址记录,就选择一个匹配位数最多的

默认路由

默认路由是指路由表中任何一个地址都能与之匹配的记录。

默认路由一般标记为 0.0.0.0/0(子网掩码为0) 或 default

主机路由

"IP地址/32" 被称为主机路由(Host Route),意思是整个IP地址都是网络地址,都将参与路由。

  • 主机路由多被用于不希望通过网络地址路由的情况。

回环地址

127.0.0.1 作为回环地址,也叫做 localhost ,使用这个地址时数据包不会流向网络。

路由控制表的聚合

通过路由信息的聚合(路由汇总,Aggregation)可以有效地减少路由表的条目。

IP分割处理与再构成处理

IP抽象化了底层的数据链路,使其不受具体数据链路MTU的影响。

IP报文的分片与重组

任何一台主机都有必要对IP分片(IP Fragmentation)进行相应的处理。 分片往往在网络上遇到比较大的报文无法一下子发送出去时才会进行处理。

  • IP首部的唯一数字标识作为重组的依据

经过分片之后的IP数据报在被重组的时候,只能由目标主机进行。路由器虽然做分片但不会进行重组

  • 传输路径不定,并且重组数据包对于路由器负担过重,所以在目标主机进行是比较合适的。

路径MTU发现

路径MTU发现(Path MTU Discovery) : 从发送端主机到接收端主机之间不需要分片时最大MTU的大小。

  • 也就是路径中存在的所有数据链路中最小的MTU

路径MTU发现从发送主机按照路径MTU大小将数据包分片后进行发送,这就可以避免在中途路由器上进行分片处理, 减小路由器的负担。

  • 这样就变成了发送端分片后发送,由接收端接收后重组。

工作原理如下(完全就是遍历查找最小MTU):

  • 在发送端主机发送IP数据包时将首部的分片禁止标志设置为1
    • 这导致路由器遇到需要分片的大包需要处理时,不会处理,而是将包丢弃
  • 路由器通过ICMP的不可达消息将数据链路上的MTU的值发送给主机
  • 主机获得ICMP通知的MTU值后,将它设置了当前MTU,并将数据分片
  • 重复前3个步骤,直到数据包被发送到目标主机为止没有再收到任何ICMP,就认为最后一次的ICMP所通知的MTU即是一个合适的MTU值
    • 这个MTU的值保存约10分钟,过了10分钟后则又要重新根据数据链路上的MTU做一次路径MTU发现

在上层是UDP协议时IP会做分片处理,在TCP中其根据路径MTU的大小计算出最大段长度(MSS), 然后再根据这些信息进行数据包发送,那么IP层就不需要再分片了,上层已经处理好了。

IPV6

IPv6(IP version 6)是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议,由16字节组成。

IPv6具有以下特点:

  • IP地址的扩大与路由控制表的聚合:IP地址依然适应互联网分层构造。分配与其地址结构相适应的IP地址,尽可能避免路由表膨大。
  • 性能提升: 包首部采用固定的40字节,不使用首部检验码,简化首部结构,减轻路由器负荷。路由不再做分片处理。
  • 支持即插即用功能:即使没有DHCP服务器也可以实现自动分配IP地址
  • 采用认证与加密功能: 应对伪造IP地址的网络安全功能以及防止线路窃听
  • 多播、Mobile IP成为扩展功能

IP地址的标记方法

如果像IPV4那样标记,那就太长了,于是规定如下:

  • 每16位(16进制显示)为一组,每组用冒号(":")隔开
    • 如果出现连续的0时,可以将0省略,并用双冒号("::")隔开,但一个IP地址中只允许出现一次两个连续冒号
比如按照不省略0的写法地址为:
1080:0:0:0:8:800:200C:417A

省略后为(至于省略了多少个0,则可以由其它位推断出来):
1080::8:800:200C:417A

IP地址的结构

IPv6类似IPv4,也是通过IP地址前几位标识IP地址的种类。

在互联网通信中,使用一种全局的单播地址。它是互联网中唯一的一个地址,不需要正式分配IP地址。

私有网络下,可以使用唯一本地地址。该地址根据一定算法生成随机数并融合到地址当中,可以像IPv4的私有地址一样自由使用。

在不使用路由器或者在同一个以太网网段进行通信时,可以使用链路本地单播地址。而在构建允许多种类型IP地址的网络时, 在同一个链路上也可以使用全局单播地址以及唯一本地地址进行通信。

在IPv6环境下,可以同时将这些IP地址全都配置在同一个NIC上,按需灵活使用。

未定义 000…0000(128bits) ::/128
环回地址 000…001(128bits) ::1/128
唯一本地地址 1111 110 FC00::/7
链路本地单播地址 1111 1110 10 FE80::/10
多播地址 1111 1111 FF00::/8
全局单播地址 其他  

全局单播地址

全局单播地址指世界上唯一的一个地址。

目前使用前64位为网络标识,后64位为主机标识。

  • 主机标识通常随机产生,并会定时更新,所以从IPv6地址中查看定位设备不像IPv4那么简单。

链路本地单播地址

指在同一个数据链路内唯一的地址,不经过路由器。

1111 1110 10 54位0 64位地址

唯一本地地址

唯一本地地址是不进行互联网通信时所使用的地址。

  • 一般用于特殊的隔离型网络,以提高安全性。

IPv6分段处理

其分片处理与IPv4一样在发送主机上进行,路由器不参与分片以减小路由器的负荷。

IPv4包格式

ipv4_header.jpg

版本

版本 简称 协议
4 IP Internet Protocol
5 ST ST Datagram Mode
6 IPv6 Internet Protocol version 6
7 TP/IX TP/IX:The Next Internet
8 PIP The P Internet Protocol
9 TUBA TUBA

首部长度(IHL:Internet Header Length)

此值代表有多少个4字节,对于没有可选项的IP包设置为5,也就是 4*5 = 20字节。

区分服务(TOS: Type Of Service)

用来表明服务质量:

比特 含义
0 1 2 优先度(0~7优先级由低到高)
3 最低延迟
4 最大吞吐
5 最大可靠性
6 最小代价
(3~6) 最大安全
7 未定义

总长度

表示IP首部与数据总共的字节数,最大长度为65535.

标识(ID:Identification)

用于分片重组,同一个分片的标识值相同,不同分片的标识值不同。

  • 即使ID相同,如果目标地址、源地址或协议不同的话,也会被认为是不同的分片

标志(Flags)

标识包被分片的相关信息:

比特 含义
0 未使用,固定为0
1 0:可以分片 1:不能分片
2 0: 最后一个分片的包 1: 分片中段的包

分片偏移

标识被分片的数据相对于原始数据的位置,从0开始计算。

生存时间

此包可以中转多少个路由器,每经过一个路由器TTL就会减1,当为0时此包被丢弃.

协议

表示IP包中内容是哪种类型。

分配编号 简称 协议
1 ICMP Internet Control Message Protocol
2 IGMP Internet Group Management Protocol
3 GGP Gateway-to-Gateway Protocol
4 IP IP in IP encapsulation
6 TCP Transmission Control Protocol
17 UDP User Datagram Protocol

首部检验和

检验首部是否被破坏。

可选项

长度可变,通常只在试验或诊断时使用,包含如下几点信息

  • 安全级别
  • 源路径
  • 路径记录
  • 时间戳

填充

填充0以32位对齐。

IPv6包格式

ipv6_header.jpg

版本

此处的字段为6

通信量类

相当于IPv4的TOS字段

流标号

用于服务质量(Qos:Quality Of Service)控制。

在进行服务质量控制时,将流标号设置为一个随机数,然后利用一种可以设置流的协议RSVP(Resource Reservation Protocol) 在路由器上进行QoS设置。当某个包在发送途中需要QoS时,需要附上RSVP预想的流标号。路由器接收到这样的IP包后先将流标号 作为查找关键字,迅速从服务质量控制信息中查找并做相应处理。

有效载荷长度

指包的数据部分, 不包括首部

下一个首部

表示上一层使用的哪种协议。

  • 当有扩展首部时,该字段表明扩展首部使用的协议。

跳数限制

可以通过的路由器个数,和IPv4的TTL意思一样

扩展首部

扩展首部用于对功能进行扩展,此首部可以时任意长度。

  • 需要对IP数据包进行分片时,可以使用扩展首部。
Last Updated 2019-10-21 一 07:13.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)