目录
IP协议
1.基本概念
应用层协议具有读取完整报文&序列化&协议处理的能力。
传输层协议解决的是可靠性问题。报文完整到达,如何不给网络造成过大的压力等更多的是策略。
而网络层协议解决如何将数据从A主机发送到B主机的能力。
传输层协议加网络层协议 —— >TCP/IP协议可靠的将数据从A主机发送到B主机。
在复杂的网络环境中确定一个合适的路径。
2.IP协议的报头格式
4位版本:一般填写的是IPV4。
4位首部长度:如同TCP协议包头中的首部长度。取值为0-15,默认为0101(5),5 * 4字节,就是IP报头的标准长度。
8位服务类型:我们一般很少会用到。3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。4位 TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个。 对于 ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
16位总长度:IP数据报整体占多少个字节。
8位协议:填要往上次交付的协议名称(TCP 、UDP)。
16首部校验和:负责校验数据。
8位生存时间:由于网络BUG,或者是对端网络出现不可抵达等不可控因素导致IP报文长时间在网络中游离占用网络资源,为了避免这种现象出现。生存时间被设置为整数,每次经过一个路由, TTL -= 1,一直减到0还未到达,IP报文就会被丢弃。
32位源IP地址:标识从哪里发出。
32位目的IP地址:标识去往哪里。
16位标识: 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个 id都是相同的。
3位标志字段:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到).。第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文。第三位表示"更多分片", 如果分片了的话, 最后一个分片置为0, 其他是1。
13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。为什么要分片呢?因为数据链路层单次传输数据帧有最大约束,所以网络层要分片。但是否分片还是有传输层决定,如果传输层交付下来的数据超过单次限度,就必须要分片。一般在三次握手的时候就会协商单次传输报文的大小。
假设当前的数据链路层的最大单次传输量(MTU)为1500字节。传输层交给2980字节,网络层添加报头(20字节)之后是3000字节,这时需要分片。是直接分为两片呢?还是怎样分?
实际要分为3片,因为分出来的每一个分片也是一个独立的IP报文,也需要报头。
3.网段划分
IP = 目的网络 + 目的主机。
网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号。
过去曾经提出一种划分网络号和主机号的方案,如下图:
但是,随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址, 导致B类地址很快就 分配完了, 而A类却浪费了大量地址。一个网络段中,根本不可能拥有这么多的主机,造成大量地址的浪费。
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing)。
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。子网掩码也是一个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资源的一种策略。
为什么要网段划分?大大加快查找到目的主机效率。
4.特殊的IP地址
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网。
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包。
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。
5.IP地址的数量限制
2^32 大约是42亿多,为每一个主机配备一个IP地址,是不是意味着只有42亿台主机能接入互联网呢,另外IP划分不是根据主机数量决定的,而是根据网卡的数量,一个网卡可以绑定一个或多个IP地址。
使用CIDR技术只是增加了IP地址的使用率,并没有增加上限。
现在的解决方案有:
①动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的。
②使用NAT技术(后面会讲到)
③使用IPV6,2^128个地址,完全够用了,但是目前IPv6没有完全普及。
6.私有IP地址和共有IP地址
RFC 1918规定了用于组建局域网的私有IP地址。这些私有IP地址不能在公网上出现,只能用于局域网通信。
这些都是私有IP地址:
10.*,前8位是网络号,共16,777,216个地址。
172.16.到172.31.,前12位是网络号,共1,048,576个地址。
192.168.*,前16位是网络号,共65,536个地址。
其余的都是共有IP地址。
一个路由器至少会配置两个IP地址,一个LAN口IP,一个WAN口IP。
路由器LAN口连接的主机, 都从属于当前这个路由器的子网中。
不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之 间的IP地址就可以重复了。
每一个路由器都是运营商路由器的子网中的一个节点,这样的运营商路由器会有很多级,最外层的WAN口IP地址就是公网IP。
子网内的主机要访问外网资源时,需要逐层的通过路由器将IP报文中的子网IP转换为WAN口IP,最终数据报中的IP地址转换为公网IP。这种技术称为NAT(Network Address Translation,网络地址转换)。
NAT技术将子网IP转换为公网IP,转换回来则需要NAPT技术将子网IP转换为内网IP。
如果同一个子网中的多个主机同时访问公网中的一个服务器,这些子网IP都要通过同样的几个路由器转换为公网IP,转换出来的IP地址必定一样,所以返回的时候如何精确到转换为准确的子网中的主机。这需要转换表的协助。
IP地址一样,但是端口号可以不一样。在转换表中建立映射,便于转换回来。
7.路由
信息怎么传到目的主机的?就是通过路由。路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程。
每传到一个路由器,该路由器都会检查该信息的目的IP,然后决定是继续传入下一个路由器还是传入目的主机。依次反复, 一直到达目标IP地址。
路由器中会携带路由表,路由表中携带网络地址、子网掩码、下一跳地址等信息。可以在linux上用route命令查看。
Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接 口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的 地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
例子:
如果当前来了一个IP报文目的IP地址是10.0.12.3。
先10.0.12.3与当前的子网掩码255.255.252.0,发现结果并不是10.0.12.0,则依次再与其他迹项对比,如果都不匹配,则按缺省路由条目,从eth0接口发送,由下一个路由器再次进行寻找的操作。
如果当前的子网掩码为255.255.255.0,10.0.12.3 & 255.255.255.0 = 10.0.12.0,则向10.0.12.0通过eth0结果发送报文。
8.路由表生成算法
距离-向量路由算法(RIP)
在距离-向量路由算法中,所有结点都定期地将它们的整个路由选择表传送给所有与之直接相邻的结点。
这种路由选择表包含:每条路径的目的地(另一结点)。路径的代价(也称距离)。
在这种算法中,所有结点都要参与距离向量交换,以保证路由的有效性和一致性。并更新以下内容:
新增的路由消息,该路由在本结点的路由表中不存在,此时本地系统加入这条新的路由。
发回的路由消息有一条到达某个目的地的路由,该路由线路比当前存在与路由表中的路由线路要短,则更新较短的路由替换为当前路由。