Linux网络---网络层

一、预备知识

1.理解传输层和网络层

网络层所处的位置


在之前的学习中为了方便我们画的传输图是下边这样的

实际上是下边这样的

2.IP协议的核心作用和构成

核心能力:具有将数据从A主机跨网络传输到B主机的能力,但是有能力不一定百分之百能传输成功.

所以要保证百分百能够传输成功,这时候就要用到我们之前学过的TCP协议了,TCP协议设计了大量的保证能够重传的机制,所以在TCP/IP协议中TCP保证了数据百分百能够送达目标主机,而IP保证了能够找到目标主机,TCP提供的是策略,IP提供的是能力,两者结合保证了报文能够百分百传输到目标主机。

如果想要学习TCP协议可以看我的另一篇文章,看了包会

Linux网络---TCP原理-CSDN博客
既然要从一台主机将数据送到另一台主机,所以必须要有方式标识通信两端的主机的唯一性!!!IP协议解决的就是主机到主机的问题。

而TCP解决的是进程到进程的问题,有端口号。

二、IP协议的报头

1.IP报头

IP报头的本质是一个结构体

cpp 复制代码
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
	__u8	ihl:4,
		version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
	__u8	version:4,
  		ihl:4;
#else
#error	"Please fix <asm/byteorder.h>"
#endif
	__u8	tos;
	__be16	tot_len;
	__be16	id;
	__be16	frag_off;
	__u8	ttl;
	__u8	protocol;
	__u16	check;
	__be32	saddr;
	__be32	daddr;
	/*The options start here. */
};

2.4位首部长度

4位,0000->1111:[0,15],但是标准报头就有20个字节,显然是不对的;

有一个规定,4位首部长度中的单位是4字节;

所以范围是[0,60]字节,因为报头最低长度是20字节,所以真正的范围是[20,60];

对应的4位首部长度:[5,15]:0101->1111

2.16位首部长度

16位首部长度=报头+数据

3.8位协议

表明上层协议是什么(TCP或UDP)

4.4位版本

IPV4或者IPV6

绝大部分是IPV4,因为IPV4和IPV6是不兼容的,所以要转换成IPV6很麻烦,所以现在的主流是IPV4

5.8位服务类型

8位服务类型(Type Of Service): 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表⽰: 最⼩延时, 最⼤吞吐量, 最⾼可靠性, 最⼩成本. 这四者相互冲突, 只能选择⼀个. 对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要.

6.8位生存时间

由于网络的飞速发展,现在的网络拓扑结构已经非常复杂了,在传输的过程中很容易传错地方,从而引发环路转发问题。

那么什么是环路转发问题呢?

简单来说就是传输形成了一个圈,A->B->C->A... 这样就没完了

图解

从A主机到B主机正常情况

从A主机到B主机异常情况

环路转发的后果?

在网络传输过程中信号会经过硬件设备放大,如果发生环路转发那么这个信号就是不死不灭的,时间长了,会造成网络拥堵。

如何解决?

TTL:数据报到达⽬的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防⽌出现路由循环

7.16位首部校验和

在转发的过程中会出现比特位翻转等问题,所以需要进行校验

8.32位源/目的IP地址

表⽰发送端和接收端.

三、子网划分

1.什么是子网?

把一个完整的 IP 网络,逻辑切分成的多个更小、独立的网络段,每个段就是一个子网,各子网可独立管理、通信。

2.什么是子网划分?

通过子网掩码,将一个大的 IP 网络逻辑拆分出多个子网的操作,核心是借用 IP 地址的主机位当作子网位,实现网络的精细化划分。

3.为什么要子网划分?

就是快,划分之后,查找一次淘汰一大批不对的网络号。

4.如何进行子网划分?

IP=网络号+主机号

以这张图为例:

src:192.168.128.10

dst:192.168.144.11

发送方识别本地网络号和目的网络号不同直接去找路由器了,路由器一般有两个或更多网络号,它一看这个目的网络号跟它的另一个网络号相同,于是就转发过去了,再根据主机号找到目标主机就行了。

四、划分方法

1.分类划分法


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
IP地址是有限的,大家都要抢,比如B类IP能够分成2^14个,各方运营商抢这写网络号。
为什么要抢呢?
因为抢到了就可以搭建自己的子网,抢不到就搭建不了。

这种分类方法还在用吗?

很少用了!随着网络的发展,IP地址很快就不够用了,这种分类方法比较粗糙,导致了资源的浪费。

这种分类方法是如何浪费资源的?

你获得了一个网络号,这种分类方法的网络号和主机号的长度是固定的,如果你根本用不了这么多主机号,那么就有很多的主机号就浪费了。

比如说你申请到了一个B类地址,但是你只需要2^6台主机,那么你就有2^8-2^6个主机号浪费了。

2.引入子网掩码

子网掩码是做什么的?

由于分类划分法会导致大量的IP地址浪费,所以引入了子网掩码来增加IP地址。

子网掩码是如何提高IP地址利用率的?

比如你申请了一个B类网络号,如下图

但是我只需要下图所示的主机

所以将IP&子网掩码得到下图

这样就是实现了对IP资源的利用率

子网掩码是如何进行划分的呢?

答案就在这张图里边,A类中前八位是不能动的,B类中前十六位是不能动的,C类中前二十四位是不能动的。所以需要根据类来分别设置子网掩码来控制网络号。

看两个例子:

这个很简单,就是IP和子网掩码相与得到网络号的长度,而子网掩码还有255个还没有用,所以子网范围就是图上的那个。

子网掩码只是提高了IP的利用率,而并没有增加IP的数量,那么我们怎样解决IP数量不足的问题呢?

实际上, 由于⼀些特殊的IP地址的存在, 数量远不⾜43亿; 另外IP地址并⾮是按照主机台数来配置的, ⽽是每⼀个⽹卡都需要配置⼀个或多个IP地址.
CIDR在⼀定程度上缓解了IP地址不够⽤的问题(提⾼了利⽤率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够⽤. 这时候有三种⽅式来解决:
• 动态分配IP地址: 只给接⼊⽹络的设备分配IP地址. 因此同⼀个MAC地址的设备, 每次接⼊互联⽹中, 得到的IP地址不⼀定是相同的;
• NAT技术(后⾯会重点介绍)起主要效果;
• IPv6: IPv6并不是IPv4的简单升级版. 这是互不相⼲的两个协议, 彼此并不兼容; IPv6⽤16字节128位来表⽰⼀个IP地址; 但是⽬前IPv6还没有普及;

私有IP地址

10.*,前8位是⽹络号,共16,777,216个地址
172.16.*到172.31.*,前12位是⽹络号,共1,048,576个地址
192.168.*,前16位是⽹络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公⽹IP);

我们平常接触的是什么IP?

我们接触的不是公网!,我们接触的是内网、局域网、子网。

五、网络传输

网络传输过程

如图,本地主机先判断目的IP是不是和本地IP网络号一样,一样直接通过子网传输,不一样就传输到运营商路由器进行转发。

为什么内网IP不能出现在公网上?

因为内网IP可能重复,发出去目标主机找不到源主机。

既然内网IP不能出现在公网上,那发送报文源端口怎么填?

没经过一个内网路由器,进行源IP替换,替换成当前路由器的wan口IP。

以上图为例,src:192.168.1.201 dst:122.77.241.3

src判断dst不在本子网内,通过家用路由器进行转发并将源端口IP替换成wan口IP:10.1.1.2,传输到运营商路由器,将源IP替换成wan口IP:122.77.241.4,然后在公网中找到目的IP所对应的主机进行发送。

那怎么回来啊😂?

这份工作是通过NAT来进行的,所以我们先不讲,后边我会专门写一篇文章进行超级详细的讲解,点个关注包你学会。

目前你只需要知道他一定能回来就行啦。

六、公网

对公网的理解?

公网IP是全球共用的,各个国家的运营商需要主动申请,运营商不仅要组件内网,还要组件自己国家的公网环境,一个区域究竟能有多大的网络,取决于自己有多少个公网IP。

注意:分配公网IP的事情,不是简单的按照国家为单位的,而是按照网民数量进行划分。

地区或国家IP的分布:https://zh-hans.ipshu.com/country-list

在传输的过程中都会查表,直接传输到目的地址。

七、路由

在复杂的⽹络结构中, 找出⼀条通往终点的路线

路由的过程, 就是这样⼀跳⼀跳(Hop by Hop) "问路" 的过程.
所谓 "⼀跳" 就是数据链路层中的⼀个区间. 具体在以太⽹中指从源MAC地址到⽬的MAC地址之间的帧传输区间.
IP数据包的传输过程也和问路⼀样.
• 当IP数据包, 到达路由器时, 路由器会先查看⽬的IP;
• 路由器决定这个数据包是能直接发送给⽬标主机, 还是需要发送给下⼀个路由器;
• 依次反复, ⼀直到达⽬标IP地址;

• 路由表可以使⽤route命令查看
• 如果⽬的IP命中了路由表, 就直接转发即可;
• 路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当⽬的地址与路由表中其它⾏都不匹配时,就按缺省路由条⽬规定的接⼝发送到下⼀跳地址。
假设某主机上的⽹络接⼝配置和路由表如下:

• 这台主机有两个⽹络接⼝,⼀个⽹络接⼝连到192.168.10.0/24⽹络,另⼀个⽹络接⼝连到
192.168.56.0/24⽹络;
• 路由表的Destination是⽬的⽹络地址,Genmask是⼦⽹掩码,Gateway是下⼀跳地址,Iface是发送接⼝,Flags中的U标志表⽰此条⽬有效(可以禁⽤某些 条⽬),G标志表⽰此条⽬的下⼀跳地址是某个路由器
转发过程例1: 如果要发送的数据包的⽬的地址是192.168.56.3
• 跟第⼀⾏的⼦⽹掩码做与运算得 到192.168.56.0,与第⼀⾏的⽬的⽹络地址不符
• 再跟第⼆⾏的⼦⽹掩码做与运算得 到192.168.56.0,正是第⼆⾏的⽬的⽹络地址,因此从eth1接⼝发送出去;
• 由于192.168.56.0/24正 是与eth1 接⼝直接相连的⽹络,因此可以直接发到⽬的主机,不需要经路由器转发;
转发过程例2: 如果要发送的数据包的⽬的地址是202.10.1.2
• 依次和路由表前⼏项进⾏对⽐, 发现都不匹配;
• 按缺省路由条⽬, 从eth0接⼝发出去, 发往192.168.10.1路由器;
• 由192.168.10.1路由器根据它的路由表决定下⼀跳地址;

相关推荐
Trouvaille ~5 小时前
【Linux】线程同步与互斥(三):生产者消费者模型实战
linux·运维·c++·信号量·阻塞队列·生产者消费者模型·环形队列
遇见火星5 小时前
Linux Screen 命令入门指南
linux·运维·服务器
开开心心就好5 小时前
键盘改键工具免安装,自定义键位屏蔽误触
java·网络·windows·随机森林·计算机外设·电脑·excel
Doro再努力6 小时前
【Linux操作系统06】深入理解权限掩码与粘滞位
linux·运维·服务器
mzhan0176 小时前
[Linux] vdso 32bit vs 64bit
linux·运维·服务器
旖旎夜光6 小时前
Linux(13)(上)
linux·网络
忧郁的橙子.6 小时前
26期_01_Pyhton linux基本命令
linux·运维·服务器
郝学胜-神的一滴6 小时前
深入解析Linux网络编程之bind函数:从基础到实践的艺术
linux·服务器·网络·c++·websocket·程序人生
西京刀客6 小时前
macOS 打出来的 tar 包,Linux 常见告警(tar 包里带了 macOS 的扩展属性(xattr))
linux·运维·macos