一、预备知识
1.理解传输层和网络层
网络层所处的位置
在之前的学习中为了方便我们画的传输图是下边这样的实际上是下边这样的
2.IP协议的核心作用和构成
核心能力:具有将数据从A主机跨网络传输到B主机的能力,但是有能力不一定百分之百能传输成功.
所以要保证百分百能够传输成功,这时候就要用到我们之前学过的TCP协议了,TCP协议设计了大量的保证能够重传的机制,所以在TCP/IP协议中TCP保证了数据百分百能够送达目标主机,而IP保证了能够找到目标主机,TCP提供的是策略,IP提供的是能力,两者结合保证了报文能够百分百传输到目标主机。
如果想要学习TCP协议可以看我的另一篇文章,看了包会
Linux网络---TCP原理-CSDN博客
既然要从一台主机将数据送到另一台主机,所以必须要有方式标识通信两端的主机的唯一性!!!IP协议解决的就是主机到主机的问题。而TCP解决的是进程到进程的问题,有端口号。
二、IP协议的报头
1.IP报头
IP报头的本质是一个结构体
cppstruct 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路由器根据它的路由表决定下⼀跳地址;


















