目录
- 1.概念
- 2.协议格式
- 3.网络划分
- ip组成
- IP地址分类
- IP地址数量
- 私网IP和公网IP
- 子网掩码
- 路由
1.概念
引入
应用层http协议是进行构建和解析请求request和响应response。
传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是,UDP协议并不保证数据传输的可靠性。TCP协议制定了确认应答机制,超时重传机制,连接管理机制,拥塞控制等保证了数据的可靠性,制定了捎带应答,延时应答,快重传机制等保证了数据传输的效率
实际有数据传输能力的是网络层IP协议和数据链路层(后面讲),提供了将数据从主机A跨网络送到主机B的能力。
概念
在网络层,有一个很重要的设备路由器,路由器可以连接两个局域网,具有数据在网络中路由的功能。
路由器也相当于是局域网里的一台主机,含有网络层及其以下层,但是现在的路由器很强大,已经拥有了应用层及其以下层。
- 主机:配有IP地址,但是不进行路由控制的设备。
- 路由器:即配有IP地址,又能进行路由控制。
- 结点:主机和路由器的统称
网络层的主要作用是实现终端节点之间的通信。这种终端节点之间的通信,也叫点对点通信。
2.协议格式
-
4位版本号:指定IP协议的版本,对于IPv4,就是4。
-
4位首部长度:IP头部的长度是以32bit(4字节)作为基本单位,也就是报头字节数等于4位首部长度乘4字节。最小报头长度等于20字节,4个比特位表示的最大数字是15,所以最长报头长度等于60字节,多余部分是选项。
-
8位服务类型:3位优先权字段(已经弃用),4位TOS字段和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者互相冲突,只能选一个,具体选哪个,决定于应用层协议。
-
16位总长度:IP数据报整体占多少字节。包括了数据和报头。
-
8位生存时间(TIME TO LIVE,TTL):数据报到达目的地的最大报文跳数,也就是经过的路由器数。一般是64。每次经过一个路由,TTL减1,一般减到0还没到达,那么就丢失了,这个字段是防止出现路由循环。
-
8位协议:标识上层协议类型。传输给上层哪个协议。
-
16位头部校验和:使用CRC校验,来检验报头是否损坏,只需要检验头部,数据在TCP层检验了。
-
32位源IP地址和32位目的IP地址:标识接收端主机和发送端主机。
-
选项:选项最多40字节,报头超过20字节部分。
这里需要了解的知识是切片:
分片概念: 分片就是将传输层发现来的数据,分成几段,再发送下去。
为什么要分片?
每种数据链路的最大传输单元( MTU )不同,网络层的 IP 是数据链路的上一层, IP 通过分片屏蔽数据链路的差异,实现不同数据链路互通。从 IP 的上一层看,它完全可以忽略各个数据链路上的 MTU ,只需要按照源 IP 地址发送的长度接收数据包。
以太网就是最常用的数据链路层协议,MTU就是1500.
注意:分片对传输层时透明的,传输层并不知道分片了。只有网络层知道分片了。
所以在接收端的网络层IP协议还需要对分片数据进行组装。
接收端接收到的数可能会有没有分片的数据,不同组数据,分片的数据。组装首先需要将分片的没有分片的数据分开,再将同一组数据组装。
分片的缺陷
- 报文需要分多次发送,加重路由器的处理性能。
- 分片传输中,其中一个分片丢失,在组装的时候不能将整个报文组装起来,此时ip层不会向上交付,tcp层会认为报文丢失,超时重传。
如果避免分片
实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。
- 因此TCP作为传输控制协议,它需要控制一次向下交付数据不能超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。
通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段长度MSS。 - MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。
所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的,如果数据在传输过程中进入到了一个MTU较小的网络,那么该数据仍然可能需要在路由器中进行分片。
报头中分片的字段
- 16位标识(id):唯一标识主机发送的报文,如果IP报文在数据链路层被分片了,那么每一片里面的这个id相同。
- 3位标志:第一位保留(现在不用),第二位如果置为1,表示禁止分片,这个时候,如果来了一个超过MTU的数据,IP模块会丢弃报文,置为0表示可以分片。第三位表示"更多分片",如果分片了,如果该分片后面还有分片,当前位置为1,如果后面没有分片或者没有分片,当前位为0。意思就是分片了置为1,没有分片或者是数据分片的结尾置为0。
- 13位偏移量:表示当前分片在原报文的哪个位置。实际偏移字节数等于当前值乘8,因此除最后一个报文外,其它报文的长度必须是8的整数倍。
使用分片技术的同时许多问题出现了
IP如何将报头和有效载荷分离?
IP协议的报头中也有16位的报文大小,标准报头大小(没有选项)是20个字节,报文大小减去报头大小,可以得到有效载荷的大小。
IP如何将报文交付给上层协议?
IP协议的报头中有8位协议类型。
3.网络划分
ip组成
IP地址分为两个部分:网络号和主机号
- 网络号:保证相互连接的两个网段具有不同的标识。
- 主机号:在同一网段内,主机具有相同的网络号,但是具有不同的主机号。标识相同网段里的不同主机。
网络号是设备所在区域的一种标识,网络号相同的设备位于同一个网段内,网络号不同的设备通过路由器实现通信。主机号是在同一个网段中不同设备的标识,不允许同一个网段内出现重复的主机号。
- 不同的子网其实就是把网络号相同的主机连接到了一起。
- 如果在子网中新增一台主机,这台主机的网络号和这个子网的网络号一致,但是主机号必须不同和子网中的其它主机重复。
- 由上可知,在子网中新增一台主机需要为其分配对应且正确的IP,去除一台主机的话,需要回收IP。但是手动管理子网IP很麻烦。
有一种技术DHCP,能够自动的给子网内新增主机结点分配IP地址,避免了手动管理的不便。
一般现在的路由器都带有DHCP功能,因此路由器可以看作一个DHCP服务器。
IP地址分类
上面是按照二进制位数1~5位是否为0划分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
A,B,C类越往下网络号表示越来越多,主机号表示越来越少。随着互联网的发展,大多数组织都申请B类网络地址,导致B类很快就用完了。
针对上面的情况,提出了一个新的方案,称为CIDR。只与子网掩码有关,通过子网掩码要区分网络号和主机号。
- 引入一个子网掩码来区分网络号和主机号。
- 子网掩码也是32位正整数,通常用一串0结尾。
- 将IP地址和子网掩码进行按位与,得到的结果就是网络号。
- 这样划分就不需要这个IP地址局限于上面的哪一个类了,与A,B,C类无关,至于子网掩码有关。
IP地址数量
IPv4协议的IP地址是32位的,那么只有 2的32 次方个IP地址,而TCP/IP协议规定,每一个主机都需要一个IP地址,这就意味着,一共只能由 2的32 次方台主机连入网络。
但是由于一些特殊网络的存在,并且IP地址并非是按照主机台数配置,而是每一个网卡都需要配置一个或者多个IP地址。,所以实际可以使用的IP地址远少于 2的32 次方。
CIDR虽然一定程度上提高了IP地址位数利用率,但是IP地址总数没变,仍然可能不够用。这时有三种解决方式:
- 动态分配IP地址,只给接入网络的设备分配IP地址,比如:一台主机接入了网络分配一个IP地址,断开网络是IP地址被回收。因此同一个MAC地址设备,每次接入网络IP地址不一定相同,被其它接入网络的主机分配。
- NAT技术
- 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
我们可以在cmd上使用指令ipconfig查看机器的私网IP
数据传输
路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:
-
LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
-
WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。
我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。
-
不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
-
每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
-
如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。
由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。
为什么私网IP不能出现在公网当中?
- 不同的局域网中主机的IP地址可能是相同的,所以私网IP无法唯一标识一台主机,因此不能让私网IP出现在公网上,因为IP地址要能唯一标识公网上的一台主机。
- 但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用私网IP,因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,缓解了IP的不足。
- 但由于IP地址不足的原因,我们不能让主机直接使用公网IP而让主机使用私网IP,因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,缓解了IP的不足。
子网掩码
早期网络地址采用固定网络位长度的方式,使 IPv4 地址遭到大量浪费。如今网段地址的长度可变,同时也需要一种标识来获取网段地址,以便路由器对数据包进行转发,这种识别码就是子网掩码。
子网掩码用 32 位的二进制表示, IP 地址的网段地址部分设置为 1 , IP 地址的主机地址部分设置为 0 。换句话说, IP 地址有多少位网段地址,子网掩码就有多少位取 1 ,其余都取 0 。为了方便记录,每 8 位为一组,以“ . ”隔开,再转换为十进制数。
例如:201.20.100.25 的子网掩码是 255.255.255.0 ,算出它的网段地址。
将子网掩码和 IP 地址进行与( AND )运算,可得到这个 IP 地址的网段地址。
路由
① 默认路由是指路由表中任何一个地址都能与之匹配的条目。所有数据包都可以使用默认路由进行数据转发。默认路由为 0.0.0.0/0 或 default
②“ IP地址/32 ”被称为主机路由,它是路由表中指向单个 IP 地址或主机名的路由条目。例如:192.168.153.15/32 就是一条主机路由,表示整个 IP 地址的所有位都将参与路由。
③以 127 开头的 IP 地址都是环回地址,其所在的回环接口可以理解为虚拟网卡。使用回环地址时,数据包会直接被主机的 IP 层获取,而不经过链路层,也不会流向网络。一般用来检查主机上运行的网络服务是否正常。我们经常使用的127.0.0.1。
在复杂的网络结构中,找出一条通往终点的路。
路由的过程, 就是这样一跳一跳(Hop by Hop) “问路” 的过程.
所谓 “一跳” 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。
路由器的查找结果可能有以下三种:
- 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
- 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
- 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。
路由表查询的过程?
每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表。
- Destination代表的是目的网络地址。
- Gateway代表的是下一跳地址。
- Genmask代表的是子网掩码。
- Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
- Iface代表的是发送接口。
当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。