引入
应用层http协议是进行构建和解析请求request和响应response。
传输层的TCP/UDP协议是不提供数据的运输。传输层是为数据传输指定规则。但是,UDP协议并不保证数据传输的可靠性。TCP协议制定了确认应答机制,超时重传机制,连接管理机制,拥塞控制等保证了数据的可靠性,制定了捎带应答,延时应答,快重传机制等保证了数据传输的效率
实际有数据传输能力的是网络层IP协议和数据链路层(后面讲),提供了将数据从主机A跨网络送到主机B的能力。
概念
在网络层,有一个很重要的设备路由器,路由器可以连接两个局域网,具有数据在网络中路由的功能。
路由器也相当于是局域网里的一台主机,含有网络层及其以下层,但是现在的路由器很强大,已经拥有了应用层及其以下层。
网络层的主要作用是实现终端节点之间的通信。这种终端节点之间的通信,也叫点对点通信。
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 地址发送的长度接收数据包。
注意:分片对传输层时透明的,传输层并不知道分片了。只有网络层知道分片了。
所以在接收端的网络层IP协议还需要对分片数据进行组装。
接收端接收到的数可能会有没有分片的数据,不同组数据,分片的数据。组装首先需要将分片的没有分片的数据分开,再将同一组数据组装。
分片的缺陷
- 报文需要分多次发送,加重路由器的处理性能。
- 分片传输中,其中一个分片丢失,在组装的时候不能将整个报文组装起来,此时ip层不会向上交付,tcp层会认为报文丢失,超时重传。
如果避免分片
实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。
所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的,如果数据在传输过程中进入到了一个MTU较小的网络,那么该数据仍然可能需要在路由器中进行分片。
报头中分片的字段
使用分片技术的同时许多问题出现了
IP如何将报头和有效载荷分离?
IP协议的报头中也有16位的报文大小,标准报头大小(没有选项)是20个字节,报文大小减去报头大小,可以得到有效载荷的大小。
IP如何将报文交付给上层协议?
IP协议的报头中有8位协议类型。
IP地址分为两个部分:网络号和主机号
网络号是设备所在区域的一种标识,网络号相同的设备位于同一个网段内,网络号不同的设备通过路由器实现通信。主机号是在同一个网段中不同设备的标识,不允许同一个网段内出现重复的主机号。
有一种技术DHCP,能够自动的给子网内新增主机结点分配IP地址,避免了手动管理的不便。
一般现在的路由器都带有DHCP功能,因此路由器可以看作一个DHCP服务器。
上面是按照二进制位数1~5位是否为0划分IP地址,划成点分十进制的范围是:
A,B,C类越往下网络号表示越来越多,主机号表示越来越少。随着互联网的发展,大多数组织都申请B类网络地址,导致B类很快就用完了。
针对上面的情况,提出了一个新的方案,称为CIDR。只与子网掩码有关,通过子网掩码要区分网络号和主机号。
IPv4协议的IP地址是32位的,那么只有 2的32 次方个IP地址,而TCP/IP协议规定,每一个主机都需要一个IP地址,这就意味着,一共只能由 2的32 次方台主机连入网络。
但是由于一些特殊网络的存在,并且IP地址并非是按照主机台数配置,而是每一个网卡都需要配置一个或者多个IP地址。,所以实际可以使用的IP地址远少于 2的32 次方。
CIDR虽然一定程度上提高了IP地址位数利用率,但是IP地址总数没变,仍然可能不够用。这时有三种解决方式:
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址。
包含在这个范围中的,都称为私网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命令查看云服务器上对应的路由表。
当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。
如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。
数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。