文章目录
- IP协议
- IP报头
- 网段划分
- 特殊的IP
- 私有IP和公有IP
- IP分片
- 路由
IP协议
IP协议提供了一种能力,将数据报从A主机送到B主机,TCP可以保证可靠性,所以TCP/IP协议可以将数据可靠的从A主机送到B主机。
IP报头
4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
标识标志片偏移是为了解决IP分片问题使用的。
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环。
8位协议: 表示上层协议的类型
选项字段最多也是40字节和TCP一样。
IP协议如何进行报头和有效载荷的分离?
4位的首部长度,单位也是4字节,和TCP报头中的4位首部长度是一样的。IP还有16位的总长度 = 报头长度 + 有效载荷。
IP协议如何分用?
32位源地址和32位目标地址: 表示发送端和接收端的IP地址。
网段划分
我们的网络不是凭空产生的,而是有人为我们专门设计的,我们生活中的大部分网络基础设施的建设都是运营商帮我们做的,网络世界是被精心设计过得,如同OS一样。
IP地址一般分为两部分,一部分为网路号,一部分为主机号,所以IP地址 = 网络号 + 主机号。
网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。
但是,手动管理子网内的IP, 是一个相当麻烦的事情.,因此有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便,一般路由器都有这个服务。
通常情况下,网络划分为五类:
但是这种划分方案的局限性是很大的,假设申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多,但是在现实中一个子网能用到这么多主机的情况并不多,因此很多的IP地址就会被浪费。针对这个情况,又引入了一个子网掩码的概念,子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号,这样通过子网掩码就可以很好的提高IP地址的使用率。
IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围。IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高24位是1,也就是255.255.255.0。
网段划分是什么?
网段划分可以将一个较大的IP地址空间分割成多个较小的、独立的网络段,也就是子网。可以利用子网掩码进行划分,划分可以提高网络的安全性、性能、可管理性和可扩展性。通过合理的网段划分,可以构建更加高效、稳定和安全的网络环境。
特殊的IP
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
27.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;
私有IP和公有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对应的就是公网。
一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP),路由器LAN口连接的主机, 都从属于当前这个路由器的子网中,不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之间的IP地址就可以重复了,每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器, WAN口IP就是一个公网IP了,子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT。
从图中可以看到,源IP地址在路由出内网之前源IP是一直在变化的,因为内网IP无法再公网上进行路由。而且如果不变化的话,服务器收到后会存在很多这个ip的主机,不知道回应应该发给谁,所以这样可以保证回应最起码发送给自己和公网连的那个路由器上。
任何一个内网路由器,在转发报文时,都需要将源IP(端口)转化为路由器的WAN口IP。这就是NAT。
真实的网络情况 = 公网 + 私网(家用网络和运营商私网)构建的网络拓扑结构。
IP分片
因为数据链路层对报文是有大小要求的,因此如果IP报文太大,就需要对报文进行分片,分片一定是不好的,因为分片会提高报文丢失的概率,一个报文分成多片,如果丢失一片就算这个报文丢失,所以分片应该成为网络通信中的小概率事件。
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节。
那么如果做到尽量不分片呢?
所以TCP在发送报文时,不能只按照对方的接受能力,直接发送一个大报文,必须根据自己的分片可能性,设置自己数据段的大小。这个数据段的大小一般为1460,成为MSS最大段尺寸。TCP在建立连接的过程中, 通信双方会进行MSS协商。
因为分片,所以IP报头的标识标志片偏移才有了意义,因为分片后的IP报文,都需要IP报头,用来让接收方进行组装。
16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
3为标志:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记.
16位片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 可以通过报文的相同的标识来收集报文片段。
- 可以通过3为标志的最后一位和片偏移来确定是否是分片报文,只有两个都为0才不是分片报文,其他情况都是分片报文。
- 我们可以确认收到开头也可以确认收到结尾,中间的通过片偏移来确定是否连续就可以判断是否把报文收齐了。
路由
每一个局域网都会存在自己专属的和局域网的网络号,而路由的过程就是不断的比对网络号进行路由,路由到局域网在根据主机号找到对应的主机,所以IP就提供了将数据包从A主机送到B主机的能力。
路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.
- 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标IP地址
所以整个网络传输的过程可以看成是一个局域网一个局域网之间的传输。
如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个路由器内部维护一个路由表;
路由表可以使用route命令查看。
如果目的IP命中了路由表, 就直接转发即可;
路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。网关就是下一跳的地址。
路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。