IP协议的主要功能
网络层(IP协议)的主要功能: 地址转换和路由选择
传输层(TCP协议)的主要功能: 传输数据的控制。
有什么区别吗? tcp (决策)——-> 决定数据如何传输, 例如传送多少, 重传,,,,,
ip (执行)——-> 决定数据在路上如何传输。
节点: 路由器和主机的统称。
报文从节点跳转的过程,称为 数据包跳转到 下一跳
ip协议头格式
4位版本 : 区分 IPv4 和IPv6。
4位头部长度: 单位是4个字节。 1个bit位是4个字节
8位服务类型(TOS): 前3位已经弃用, 4位TOS字段, 分别表示: 最大吞吐量, 最小延时, 最高可靠性, 最小成本。
4位只能有1位置1(也就是说这4种相互排斥), 还有1位是保留字段。
16位总长度: 报文总长度,单位是字节。
8位生存时间 : 没经过一个节点, 生存时间减减, 减到0消散。 防止路由循环的问题。
8位协议 : 向上交付, 交付给tcp或者udp协议。
16位首部检验和 : 由发送方填充, 接收方检验。
32位源ip : 从哪哪个主机来。
32位目的ip : 要去哪个主机。
关于16位分片标识, 3位标识, 13位片偏移:
首先 : 为什么会ip分片???
对于数据链路层来说, 规定了一次性向网络中发送的数据大小是有限制的, MTU: 1500字节
意味着网络层的最大数据是1480字节, 因为ip报头是20个字节。
如果ip报文超过了 1500字节——-> 就要ip分片
那为什么在不在数据链路层分片呢?
因为分片后的报文也是需要ip报头的, 只有网络层才有资格添加报头信息, 并且每个16位总长度也是会变化的。
例如 : 网络层有一个3420个字节的报文, 就要ip分片
1, 20(原始的ip报头) + 1480
2, 20 (拷贝的ip报头) + 1480
3, 20(拷贝的ip报头) + 440。
那么问题来了, 对端的网络层如何组装呢? —-> 16位分片标识, 3位标识, 13位片偏移
16位标识(1,聚合在一起) :对于, 没有分片的独立报文, 16位标识是不同的。
对于, 分片后的报文, 16位标识是相同的。
13位片偏移(2, 将有效载荷组合在一起): 该报文的有效载荷在原始报文中的偏移量。
例如 : 对于 1600个字节的独立报文
分片后 : 1480 + 20 / 120 + 20
16位标识 1234 1234 (假设的)
片偏移 0 1480
但是问题来了, 如何判断是最后一个报文呢? ——->3位标识
3位标识(区分是最后一个报文):1位保留, 1位禁止分片, 1位 表示后面还有更多报文。
该位为1 —- > 后面还有报文 该位为0——–> 后面无
大概就是 :
if(更多分片标志位 == 1 || 片偏移 > 0)
{
//分片报文
}
else
{
if(更多分片标志位 == 0 && 片偏移 == 0)
{
//独立报文
}
}
网段划分
网段划分的本质 : 提高查找效率, 减少查找难度。
IP地址 = 网络号 + 主机号 (确定一台互联网中的一台主机的)
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致,
但是主机号必须不能和子网中的其他主机重复.
手动管理ip地址是非常不方便的。
有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
曾经的5类地址划分:
其中的绿色部分是固定不变的
这样划分存在很多的缺陷, 例如大家都申请B类, 那会导致B类地址被大量申请,而其他类型的地址没人使用
新的划分方案 : CIDR
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾, 0和1的分界线是主机位
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
例如:
IP数量限制
IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右。
而现在的电脑数量已经远超过43亿了, 如何解决呢?
动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到
的IP地址不一定是相同的;
NAT技术 : 不断更换源IP地址。
IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表
示一个IP地址; 但是目前IPv6还没有普及
WAN口的IP 和 LAN口的IP
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之
间的IP地址就可以重复了.
每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,
最外层的运营商路由器, WAN口IP就是一个公网IP了.
子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级
替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地
址转换).
路由
当IP数据包, 到达路由器时, 路由器会先查看目的IP;
路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
依次反复, 一直到达目标IP地址
例如:
这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络;
路由表的Destination是目的网络地址 ,Genmask是子网掩码, Gateway是下一跳地址
Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的
地址,
没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去;
由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发;
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
依次和路由表前几项进行对比, 发现都不匹配;
按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器;
由192.168.10.1路由器根据它的路由表决定下一跳地址;