文章目录
- 概念
- 协议头格式
- 分片与组装
- 网段划分
- IP地址的数量限制
- 私有IP和公有IP
- 路由
概念
IP协议(Internet Protocol)是互联网上使用的一种网络协议,也是互联网的基础协议之一。它属于TCP/IP体系中的网络层协议,主要负责将数据包从源主机传输到目标主机。
-
TCP作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但TCP提供的仅仅是数据传输的策略,而真正负责数据在网络中传输的则传输层之下的网络层和链路层。
-
进行网络通信时,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,而是需要传输层将数据继续向下进行交付,在网络层和链路层经过数据封装后再通过网络发送到对方主机,对方主机收到数据后也同样需要在链路层和网络层进行数据解包,此时对方的传输层才拿到了发送过来的数据,然后再继续将该数据向上进行交付。
网络层要解决的问题就是,将数据从一台主机送到另一台主机,也就是数据的路由。
协议头格式
- 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
- 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
- 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和- 1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
- 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
- 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
- 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
- 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL -= 1,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
- 8位协议:表示上层协议的类型。
- 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
- 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
- 选项字段:不定长,最多40字节。
分片与组装
由于数据链路层的特点,一般无法转发太大的数据,数据链路层一次性可以转发到网络的报文大小的限制是(1500字节 MTU)。所以在数据传到链路层前,要进行分片操作。
分片要在网络层处理同理,将分片进行组装成完整的报文也是在对端的网络层进行的。
- 16位标记位:因为一个报文有可能会被分片成多份,我们需要标识来自于同一报文的分片,所以如果16位标识中存储的字段相同,则代表它们来自同一个报文;
- 13位片偏移:在组装分片时,需要知道这些分片在原先报文中的顺序,才能组装成为一个完整并且正确的报文。3位片偏移就标识了当前分片在原先报文中的偏移量!
- 三位标记位:可以查看这个报文是否被分片了
每一层添加颜色方块即为封装,向下交付;每一层去掉颜色方块即为解包,向上交付;
在ip层将tcp报文分开即为分片;在对端ip层将分好的tcp报文拼接即为组装;
网段划分
IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机间有相同的网络号, 但有不同的主机号;
- 不同的子网其实就是把网络号相同的主机放到一起.
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类
- A类:0.0.0.0到127.255.255.255
- B类:128.0.0.0到191.255.255.255
- C类:192.0.0.0到223.255.255.255
- D类:224.0.0.0到239.255.255.255
- E类:240.0.0.0到247.255.255.255
大多数组织都申请B类网络地址, 导致B类地址很快就分配完了, 而A类却浪费了大量地址
所以,引入一个额外的子网掩码
来区分网络号和主机号
- 子网掩码是一个32位的正整数. 通常用一串 “0” 来结尾;
- 将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围; IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0
特殊的IP地址
- 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
IP地址的数量限制
我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP协议规定, 每个主机都需要有一个IP地址.
这意味着, 一共只有43亿台主机能接入网络么?
实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡
都需要配置一个或多个IP地址.
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
- 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备。
- NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
- IPv6:IPv6用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。但IPv6并不是IPv4的简单升级版,它们是互不相干的两个协议,彼此并不兼容,因此目前IPv6还没有普及。
私有IP和公有IP
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
- 10.*,前8位是网络号,共16,777,216个地址
- 172.16.到172.31.,前12位是网络号,共1,048,576个地址
- 192.168.*,前16位是网络号,共65,536个地址
- 包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
一个路由器可以配置两个IP地址, 一个是WAN口IP对外, 一个是LAN口IP(子网IP)对内
- 路由器LAN口连接的主机, 都从属于当前这个路由器的子网中
NAT IP转换过程
路由
是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间,就是
从A主机到B主机需要走的路径
能否直接到达主机B,
能就发送给主机B;
不能就发送给下一个路由器,路由器中的路由表会告知你下一站应该往哪儿走
唐僧和他的徒弟们在前往西天取经的路上迷路了。他们不知道下一步应该往哪个方向走,以便能够找到正确的路径到达目的地(西天)。
-
寻找信息源:唐僧看到前面有个村庄,于是走过去向村民询问去西天的路该怎么走。这里的村民就相当于网络中的一个路由器,他们拥有关于网络拓扑结构的信息。
-
路由决策:村民告诉唐僧,他们需要先往南走,然后经过一座山,再向西走才能到达西天。这就是一个路由决策的过程,路由器根据路由表或路由算法来决定数据包应该往哪个方向传输。
-
传递信息:唐僧按照村民的指示继续前行。这相当于数据包在网络中按照路由决策的路径进行传输。
-
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
-
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
-
依次反复, 一直到达目标IP地址;
如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表
- 当唐僧迷路时,他找到了一个信息源——村民,村民基于他们对路况的了解给出了方向建议(即路由表中的信息)。
- 村民告诉唐僧应该往哪个方向走,这就是一个路由决策的过程。
- 唐僧根据村民的建议选择了下一跳的方向(向南走),并继续前行。
- 如果唐僧在途中遇到更了解路况的村民,他们可能会给出更优的路径建议。
在网络中,路由器之间会不断地交换路由信息,使用动态路由协议来更新路由表。