主机和结点
在互联网世界中,将那些配有IP地址的设备叫做“主机”。这里的主机可以是超大型计算机,也可以是小型计算机。这是因为互联网在当初刚发明的时候,只能连接这类大型的设备,因此习惯上就将配有IP地址的设备称为“主机”。
然而,准确地说,主机的定义应该是指“配置有IP地址,但是不进行路由控制的设备”。既配有IP地址又具有路由控制能力的设备叫做“路由器”,跟主机有所区别。而结点则是主机和路由器的统称。
IP协议
IP(Internet Protocol)协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。
IP不提供可靠的传输服务,它不提供端到端的或结点到结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。
IP协议头格式
- 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4。
- 4位头部长度(header length):IP头部的长度是多少个32bit(单位),也就是length * 4的字节数。4bit表示的最大数字是15,因此IP头部最大长度是60字节。
- 8位服务类型(Type of Service):3位优先权字段(已弃用),4位TOS字段,和1位保留字段(必须置0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telent这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。
- 16位总长度(字节数):IP数据报整体占多少个字节。
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一片里面的这个id是相同的。
- 3位标志字段:第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位标识“更多分片”,如果分片的话,最后一个分片置为1,其他是0,类似于一个结束标志。
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处于哪个位置。实际偏移的字节数是这个值 * 8得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)。
-
8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL -= 1,一直减到0还没到达,就丢弃。这个字段主要是用来防止出现路由循环。
- 8位协议:表示上层协议的类型。
- 16位首部校验和:使用CRC进行校验,来鉴别头部是否损坏。
- 32位源地址和目的地址:表示发送端和接收端。
- 选项字段最大40字节。
网段划分
网络号和主机号
IP地址分为两部分,网络号和主机号。
- 网络号:保证相互连接的两个网段具有不同的标识。
-
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。
- 不同的子网其实就是把网络号相同的主机放到一起。
- 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号不能和子网中的其他主机重复。
通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。
那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。
- 有一种技术叫做DHCP,能够自动的给子网内新增的主机结点分配IP地址,避免了手动管理IP的不便。
- 一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器。
早期的网段划分
过去曾经提出过一种划分网络号和主机号的方案,把所有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.0 ~ 239.255.255.255。
- E类:240.0.0.0.0 ~ 247.255.255.255。
因为早期的网段划分方式太过于粗糙,浪费较多,因此被淘汰了。于是提出了新的网段划分方案,称为CIDR。
CIDR
CIDR(Classless Inter-Domain Routing,无类别域间路由)。
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
- 子网掩码也是一个32位的正整数,通常用一串"0"来结尾。
- 将IP地址和子网掩码进行“按位与”操作,得到的结果就是网络号。
- 网络号和主机号的划分与这个IP是A类、B类还是C类无关。
下面看两个例子:
- IP地址与子网掩码做与运算可以得到网络号,主机号从全0到全1就是子网的地址范围。
- IP地址和子网掩码还有一种更简洁的表示方法,例如:140.252.20.68/24,表示IP地址为140.252.60.68,子网掩码的高24位为1,也就是255.255.255.0。
再来看一个问题?
现在有一个网络的网段是192.168.122.0,子网掩码是255.255.255.0,现在要将这个网络平均划分成四个子网:每个子网的主机范围以及子网掩码是多少?
- 通过掩码得到主机号个数:256个。
- 因为要平均划分为四个子网,则每个子网中主机号数量为256 / 4 = 64个。
-
每个子网的掩码如下:
255.255.255.0
255.255.255.64
255.255.255.128
255.255.255.192 -
每个子网IP地址范围如下:
192.168.122.0~192.168.122.63
192.168.122.64~192.168.122.127
192.168.122.128~192.168.122.191
192.168.122.192~192.168.122.255
特殊的IP地址
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据报。
- 127.*的IP地址用于本机回环测试,通常是127.0.0.1。
私有IP和公网IP
如果一个组织内部组件局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组件局域网的私有IP地址。
- 10.*.*.*.*,前8位是网络号,共有16777216个地址。
- 172.16.* ~ 172.31.*,前12位是网络号,共1048576个地址。
- 192.168.*,前16位是网络号,共65536个地址。
上述范围中的都称为私有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(Network Address Translation,网络地址替换)。
- 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上。这样的服务器可以在阿里云、腾讯云上进行购买。
网关
大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。也就是网络关卡。
网关既可以用于广域网互连,也可以用于局域网互连。
-
说明:
由于历史原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关,在今天很多局域网采用的都是路由来接入网络,因此通常指的网关就是路由器的IP(LAN口IP)。 -
举例说明:
网络A的IP地址范围为:192.168.1.1~192.168.1.254,子网掩码是255.255.255.0;网络B的IP地址范围为:192.168.2.1~192.168.2.254,子网掩码为255.255.255.0。在没有路由器的情况下,两个网络之间是不能进行TCP/IP通信的。即使两个网络连接在同一台交换机(或集线器)上,TCP/IP协议也会根据子网掩码(255.255.255.0)判定两个网络中的主机处在不同的网络中,而要实现两个网络之间的通信,则必须要通过网关。如果网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给网络B的网关,网络B的网关再转发给网络B的某个主机。
所以说,只有设置好网关的IP地址,TCP/IP协议才能实现不同网络之间的相互通信。那么这个IP地址是哪台机器的IP地址呢?网关的IP地址是具有路由功能的设备的IP地址,具有路由功能的设备有路由器、启用了路由协议的服务器(实质上相当于一台路由器)、代理服务器(也相当于一台路由器)。
路由
路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。
如上图所示,路由的过程,就是上述一跳一跳的过程。所谓一跳就是数据链路层中的一个区间。具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。
IP数据报的传输过程和问路一样。
- 当IP数据报,到达路由器时,路由器会先查看目的IP。
- 路由器判断这个数据包是直接能够发送给目标主机,还是需要发送给下一个路由器。
- 如此反复,直到到达目标IP地址。
那么路由器如何判断这个数据包该发送到哪里呢?
为了将数据包发送给目标主机,所有主机都维护着一张路由控制表(Routing Table)。该表记录IP数据在下一步应该发送给哪个路由器。IP包根据这个路由表在各个数据链路上传输。
- 路由表可以使用route命令查看。
- 如果目的IP命中了路由表,就直接转发即可。
- 路由表中的最后一行,主要由下一条地址和发送接口两部分组成,当目的地址与路由表中其他行都不匹配时,就按缺省路由条目规定的接口发送到下一跳地址。
一台主机的网络接口配置和路由表如下:
- 这台主机有一个网络接口,连到172.17.48.0/20网络。
- 路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一条地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由转发。
路由转发过程:
traceroute命令
traceroute命令利用ICMP协议定位您的计算机和目标计算机之间的所有路由器。TTL值可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP呼叫报文的TTL值和观察该报文被抛弃的返回信息,traceroute命令能够遍历到数据包传输路径上的所有路由器。