文章目录
- 理解一下,打通一下文件和socket的关系
- 网络层
- ip协议
- 前置认识
- ip协议的报头
- 4位首部长度 具有单位长度4
- 4位版本
- 8位服务类型
- 16位总长度
- 8位生存时间
- 8位协议
- 16位首部检验和
- 32位源IP
- 32位目的IP
- 网段划分
- CIDR子网掩码方案
- 私有地址和公网地址
- 理解运营商 和 全球网络理解
- 全球网络理解
理解一下,打通一下文件和socket的关系
网络服务都是进程,在内核中叫做tast_struct
每个打开的文件都要有文件描述符
进程有文件描述符表
文件描述符指向strcut file
file结构体中有个 private_data指针
如果这个文件是个网络文件,该指针就会指向struct socket文件
而struct socket文件也有指针回指sturt file
也就是在网络里随时想返回来找文件也能找到。
以前讲过一切皆文件,最终整个网络文件挂接到struct file下,应用层看待它一切只需要按照文件描述符就能找到这个文件的struct socket
所以struct socket里有一个wait_queue_head_t wait是什么呢?
记不记得对应的进程阻塞等待时,要把自己的PCB链入到指定的数据结构里,所以如果网络读取数据不就绪,只要讲进程挂接到wait_queue里就可以了。
socket里还有一个 方法集proto_ops ops,和struct file也有方法集f_op
我们发现socket 里还有 struct sock* sk
指向了strcut sock 这只是网络的开始
struct file 指向strcut socket是从文件到网络的过度
sock里包含接受和发送两个队列
以UDP 和TCP为例,走到这里其实到网络了
struct sock* sk 看起来是指向struct sock但实际上他并没有指向sock,当你创建tcpsocket时他指向的是struct tcp_sock,当你创建UDP套接字时其实系统中创建的是udp_sock
只不过这两个结构体中开头都包含了sock结构体
我怎么知道我指针sk指向的是tcp还是udp呢?
socket中有个flags 或者 type可以区分socket类型。
未来我要使用tcp的其他属性,我只需要(strcut tcp_sock*)sk - > 就能访问到tcp套接字里面的内容了。
所以他的本质就是C语言的多态。
当我们在网络中收数据发数据到了tcp或udp的套接字最开始就是sock,而sock里面就有sk_buff的接受和发送队列。
此时通过网络上层把数据通过文件描述符把数据交给下层再交给tcp_sock就完了吗?
还没完
问题
网络协议栈层状结构,什么叫做协议栈啊
所谓的协议栈的本质
Linux内核是用C语言写的,所谓的协议栈本质就是
- 用特定数据结构表述的协议
- 和特定协议匹配的方法集!
文件stcut file本来就有自己的方法集,当底层指向的不是磁盘而是网络,则文件指向的方法是网络相关的方法。
struct socket 也有方法集
这俩有什么区别呢
未来file提供的方法一部分直接指向网络方法了,file方法最终要解决的是对上的问题,因为用户数据在应用层,应用层数据一定要通过fd拷贝到我们的套接字所对应的接受和发送队列中,他要给你形成一个节点,把他连入到队列中。
首先把上层数据交给下次,交给队列。
strcut socket里面的方法呢主要是对下的,也就是说提供的connect ,sendmsg,因为sendmsg没有发送缓冲区,所以你把数据交给下层看起来好像在队列里,其实我们将来使用sendmsg不用file里的方法,而用socket的方法直接就把数据发出去了,但如果是tcp的话数据先放到队列里,socket里提供了网络建立连接的一些方法,实际上底层sock里还有对应的方法集,每一层都有对应的方法集,要么是对数据加工处理,要么是把数据拷贝到底层的,因为tcp根本没有把数据发出去,tcp这些所有方法集不是把数据发到网络而是想办法把数据交到下层。
所以呢无论是文件中,还是网络套接字里,还是未来tcp udp的套接字里,各自提供各自层的方法,tcp,udp根本不会把数据send发送到网络里,他应该把数据交给下一层,所以对应的所有函数指针指向的方法由对应的协议栈给我们提供方法集。
曾经说过我们对应的OS中一定同时收到大量的报文,不管tcp 还是Udp,上层不只一个网络服务,A进程想发,B也想发。
每一个文件描述符就对应一个Struct file,对应一个stcut socket,对应一对接受发送缓冲区。
我们的OS内可能同时存在很多报文,不要觉得tcp是面向字节流,所有报文都是字节流,不一定
问题是OS中数据都是一个个报文,所以OS中要不要把多个报文管理起来?
我收到的报文里上层不读,所以OS积压了很多报文。
服务器收到多个报文,而报文是要被管理的
如何管理呢?
先描述,在组织
每一个在网络中的报文他的数据结构叫做sk_buff
为什么还有个锁呢?
因为接受和发送的过程本质在内核中属于CP模型
sk_buff里四个指针会互相配合指向一段内存空间
所以如果我今天收到了一个报文,head代表报头的开始,tail代表报文的结束,end空间的结束,data代表数据的开始
所以在不同的层,在网络中,sk_buff结构体叫做先描述,然后每一个sk_buff收到的报文就在对应的内存空间中,我们把这个sk_buff称为一个内核级别报头
所以我们经常说要把报文经过传输层交给
下层,从下层交给上层,本质上是让sk_buff的结构在层和层之间进行流动,所以流动时向下层交付时,我们要封装报头本质就是让head指针继续根据下层协议报头长度,让指针往上走,这叫做封装的过程
如果解包根据每层协议不同的方法来让指针根据每层报头的大小格式了,让head指针往下走,此时叫做解包
所以封装和解包本质上只要进行移动指针就可以!!
任何一层报文无非就是报头和有效载荷,每一层无非就是根据报头协议字段来移动head,比如第一个报头是tcp,我们指向当前的一个报文,head指向的是Tcp报头,然后根据tcp前20字节,根据报文长度我就可以直接找到数据区,此时报头就确定出来了,此时头空间有效载荷就出来了。
如果有数据新增移动尾指针就可以了
所以他是通过指针方式来对buff管理的。
所以先描述这个sk_buff结构体 用4指针管理,然后所有的报文在网络层大家是一块的,但到传输层之后呢我们就要把报文分发给每一个不同的文件描述符了
所谓的分发就是把sk_buff在组织到对应的缓冲区里
此时我们就可以得到对应的报文了。
最终告诉结论就是 一切皆文件,我们的网络套接字本质上也是文件。
将来你读取数据时本质通过这一大堆链路,找到receive_queue,从里面读取一个或多个sk_buff,然后把数据交给上层。
这个recvive_queue是链表,并不是我们以前讲的数组啊?
并不是,但在逻辑上认为他是个数组,好理解,这就是理论和现实的差别!
提问
是不是,传输层、网络层、数据链路层的解包操作都在接收缓冲区中操作,不需要繁琐的拷贝,只是指针移动
解释
也就是对sk_buff在链路层交给网络层就进行指针移动,后续交给上层继续指针移动不发生拷贝。
还有一点就是tcp中accept 创建一个链接时, 要重新分配文件描述符,重新分配stuct file,重新stcut socket,重新分配收发队列,重新搞sk_buff
所以我们说建立连接是有成本的,维护连接是有成本的,因为要在内核创建大量数据结构。
网络层
结论
ip协议的本质工作:提供一种能力,将数据跨网络从A主机送到B主机!
ip协议他的核心工作是真正的要把ip报文发送到网络中了,Tcp报文并没有直接到网络里,他是包裹在ip里面被发出来的。
ip协议有这种能力将数据跨网络从A主机送到B主机,可是用户需要这种能力吗?
能力本身不是100%做到的,上层用户要的是将数据可靠的跨网络从A送到B。
所以IP协议只要将来能把数据跨网络发送,以现在网路情况送过去概率非常高,但不是100%的,所以传输层提供策略(超时重传等),下层提供能力,ip和tcp一结合就可以保证每次都能发送成功。
ip协议
ip协议他的工作就是经过一堆路径选择把数据送到目标主机
前置认识
常识:从A主机到B主机发报文需要跨很多路由器
前提每台主机
a:要对所有的主机进行标识。
源ip,目的ip来标识源主机和目的主机
ip地址分成私有ip,公网ip
我们今天两天主机通信都默认公网ip通信
所以我们有了唯一性标识在通过路径选择再去把数据转发到目标主机才有可能。
b: 去一个地方玩要分两个阶段
1。去目标城市
2。去目标地点
ip地址的构成 实际上由两部分构成
ip = 目标网络 + 目标主机!
每台主机都在一个子网中
从A发到B,要经过路由器转发,跨越子网
所以走的时候一定是先到达B主机所在的网络(先到达目标网络),接着想办法把报文交给目标主机
先到目标网络,再到目标主机,凭什么啊?
凭的就是路由器的转发
我们活在一个被精心设计的世界中 !
学号并不是一个单纯的数字,标识你这个人
学号也有构成,是被精心设计过的。
学号 = 学院编号/专业编号/班级编号/学生编号
网络世界也是被精心设计过得。
学号简化为
学号 = 学院 / 学号
方便表述。
我们都有学院群
每一个学院都有一个学生会主席
学生会主席自己有没有拉群啊
他们肯定也一定都在一个群里
计算机学生009捡到了钱包中有个只能看到学号的学生卡432008
你要把这个钱包归还给人家,归还钱包本质是查找,查找本质是排除!
如果我一个一个在食堂门口问就是线性遍历,效率太低!
我就在学院的计算机群里,计算机群里不是有学生会主席吗,他应该根其他学院也拉了群啊,计算机学生会主席他应该知道其他学院的学号啊,你不知道当什么学生会主席啊。
所以拿着这个学生卡的照片发给计算机群里,@计算机主席,我虽然不知道432是哪个学院的,但我知道他一定不是我们计算机学院的,计算机主席一看432,432不是电气学院的吗,他虽然不认识这个学生,但他认识学院号,他就把这个照片发到他的群里面,@了电气的学生会主席,询问是不是电气学院的啊?电气学院学生会主席也要对他的学生有所了解,此时电气主席就把照片转发到电气群,@了小美。
为了能让小美找到我,这个消息还会带上我的学号和电话。
为什么归还的速度变快了??
因为我把这个报文转给学生会主席本质是我淘汰了计算机院的一群人,计算机主席把数据转发到学生会群里面@电气主席,本质是淘汰了剩下其他的学院,查找的本质是排除,所以建立群把我们每一个人按照这种方式
学号 = 学院+学号各自拉群,这种方式速度变快,本质是因为以前一次淘汰一个人,今天一次淘汰一群人
排除的效率高了!!!
所以我们把这种地址叫做ip地址
123009叫做源ip
我要去的目的ip叫做432008.
图中局域网 还有局域网主机
计算机学生会主席叫做 局域网出口路由器
把学生会主席的群叫做公网
所以把数据通过局域网转发到公网当中然后公网当中每一台路由器天然认识其他在公网里所有路由器,所以路由器可以转发找到小美
所以这次查找时思路是先找到目标网络,也就是小美所在的群,小美所在的局域网,
然后再由目标网络转到目标主机
所以这样去搞就可以提高效率了。
此时就可以跨网络传输了。
所以ip地址为什么要分成这样呢?
我们又为什么要这样呢?
因为本质上我们路上查找时效率高,一次可以排除很多东西
所以ip = 目标网络 + 目标主机是为了构建网络的时候,为我们将来高速定位一台主机,提供基础保证!!
那校学生会主席会不会也拉一个群呢?
有清华的,有北大的,会不会拉群呢?
所以网络就不断层层叠叠之下越来越大。
所以记住两个就可以了
1每台主机都要有唯一标识
2 ip地址不要简单理解成四字节数据,要理解为ip = 目标网络 + 目标主机
把这个换钱包的故事记住
ip协议的报头
宽度0-31 也是4字节
标准报头 20字节
还有选项
ip 和 tcp报头非常类似
4位首部长度 具有单位长度4
范围【0000,1111】 = 【0,15】
ip报头至少20字节 设首部长度为x x *4 = 20
x =5
所以报头范围是【5,15】也就是【20,60】
和tcp一样都有这个首部长度
那我识别这个ip报文的时候怎么识别?
管你报文整体多长,直接先读20,该有的都有了。
4位版本
固定值 4 ipv4
ipv4地址2的32次方 42亿多 ip地址严重不足
解决方案:NAT , ipv6(128bit位)
8位服务类型
ip报文在网络里要转发,要进行路径选择,从A到B可能有非常多的路线和方式。
最小延迟:路径时间最短
最大吞吐量:单位时间内可以过去更多数据
最高可靠性
最小成本
结合ip报文策略来进行路径选择,四者冲突,只选其一。
ip不保证可靠性
因为ip针对丢包问题无能为力
ip如果设置最高可靠性代表后面进行路径选择时,我想尽量选择那些不会丢包的情况。
丢包我也没办法只能等上层超时重传。
这四个选项为了数据包转发时给路由器提供转发依据或策略。
16位总长度
整个报文的总长度
8位生存时间
一旦把IP报文转发出去之后,那么IP报文在网络中转发时可能会有目标主机已经离线了,如果一个Ip报文转发的过程本质是把数据包从一个路由器查找路由表跳转到下一跳路由器
这就叫一次转发
如果主机已经不可答或者网络bug,导致IP报文被一直转发,为什么呢?
IP报文网络里会衰减,数据二进制信号会有强弱概念,时间越长衰减越强,所以网络设计者考虑了 这点,集线器可以信号放大,保证数据长距离传输。
一直转发的报文呢找不到目的地址或者网络有问题,称做游离报文,会有很多游离报文经过路由器不断转发时间一久不允许这种情况,所以设置每个报文的8位生存时间。
8位生存时间:数据包最多能经历的路由器的跳数。
8位协议
标识我们要把ip的有效载荷交付给上层的那一个协议?
填tcp编号就知道交给上层的哪一个了
16位首部检验和
IP对首部做检验,检验失败直接丢弃。
检验成功,报文向上交付
问题
1.报头和有效载荷如何分离
通过4位首部长度+16位总长度来进行报头和有效载荷分离的。
总结就是
固定长度+自描述字段(首部+总长度)
未来收到IP报文,我无脑读取前20字节,无脑读取首部和总长度,首部长度如果是20,证明剩下的就是数据,首部长度如果是30,说明选项10字节
为了验证整个报文,最终把报头读上来之后,16位总长度就可以对整个报文的长度加总长度字段进行审核,长度一致说明报文是OK的,把首部去掉包括选项,剩下就是数据。
TCP或 UDP最终都要把数据交给IP层,不管是字节流还是面向数据报,将来在网络里发的都是一个一个的IP层数据报
所以UDP 面向数据报 TCP 数据段或者字节流,在底层网络转发时报文还是一个一个转发过去的。所以所谓的面向字节流概念并不是IP层的概念,他是TCP提供给应用层,让应用层关注的。
就像十字路口人流涌动,但是人都是一个一个的过来的
2.如何将有效载荷交付给上层
8位协议
32位源IP
32位目的IP
填写套接字 需要 ip地址和potr
port 给tcp用
ip地址 给 ip用
这就是应用层要把点分十进制ip地址 转化 成4字节,因为IP报头是4字节源IP地址和目的地址,要构建IP报头的。
所以一个IP报文仍在网络里时,支持路由的其实是根据32位目的IP地址进行路径选择。
故事
唐山从东土大唐 受李世民之名,去西天 找如来 求真经
唐僧 跑腿
本质是李世民和如来进程间通信。
唐僧就是其中一个报文。
报文里携带了源IP 目的IP
为了完成他们通信的工作呢
在TCP层我们维护双方端口的信息,因为TCP协议只会出现在双方的OS中,而IP报文在路由时,每一个路由器它把报文做转发时不会到达IP层
网络通信过程中只有双方主机具有tcp层,路由器没有所谓的TCP层的。
路由器可以有,但我不用,因为所有路由器只工作在网络层,他只要把报文转发就行了。
端口号在传输层
IP地址在网络层
网段划分
IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
强调两点
1.路由器本质也是特定一个子网的主机,也要配置ip地址
毕竟你要把数据从A发到B,你只能通过路由器
2.路由器一定至少要连接2个子网,路由器也就相当于同时在两个子网。
所以路由器也是特定子网的一个主机,所以路由器可以配置多个IP,而且是一定要的。
,就认为路由器有多张网卡就行
3.路由器一般是一个子网中的第一台设备,一般他的IP地址都是 :网络号.1
4.路由器功能,ip报文的转发,但是路由器的功能不仅仅如此~,他还有很多功能
构建子网(构建局域网)
比如家里无线路由器,设置好你拿手机都可以连路由器都可以上网,本质是路由器给你构建了子网,路由器给你分配了子网的IP地址
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
你家里的设备想入网得先连接路由器,然后路由器给你分配不重复的IP地址,这种IP叫做内网IP
之前说的捡钱包的IP叫做公网IP
后面谈IP地址会被分成两部分
路由器做的
1 能构建子网
2 能够对子网内的IP地址进行管理工作
不了解运营商,IP层是不可能学好的。
理解IP地址根本就不是学习IP报头之类的。
我们要理解IP本质是要理解网络,而理解网络其实是在理解运营商
所以电脑的IP其实是在联网的时候才会有的。
不信把网线拔了看看IP地址还在否?
IP 路由器 现实生活中的网络建设 结合成一个话题
ip地址只有42亿多,分完了就没了,所以各个国家都需要争。
所以IP要划分一下,规定比特位A第一个比特位是0,B是10
A类网络 总IP地址数 = 2^7 x 2 ^ 24
相当于把整个32位 ip地址分成了很多块,切蛋糕一样
大部分组织都申请B类网络,导致很快被分配完了。
B类网络给了你 你不一定能把16位主机号全占满
造成了各个类网络IP地址的浪费,A同理
我没申请过A类网络啊,谁来申请这样的网络呢
运营商可以申请这种类型的IP直接入公网
那有没有不公平分配啊,技术上带上ZZ,这都是协商出来的。
网络本身不赚钱,只有让更多人接入进来才赚钱。
现在IP地址主要矛盾不是分配不均的问题,主要矛盾是不足的问题
这种分配方式会造成大量IP地址的浪费
当年网民少,随着时代发展,入网设备越来越多,IP地址严重不足,还采用这种浪费的分配方式不能忍。
所提出新的划分方案
CIDR子网掩码方案
尊重历史,在原来的基础之上引入一个额外的子网掩码来区分网络号和主机号。
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾
子网掩码有什么特点呢?
用IP地址 & 子网掩码 = 网络号
255就是全1
122.133.144.0就是122.133.144.155这个IP对应的网络号
未来想让网络号发生变化只需要调整子网掩码当中1的个数
多几个1就让主机号变的更少
少几个1变成0的话就让主机号变的更大
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
要么规定比特位(A类),要么使用01序列来划分(子网掩码)
我没感觉有划分这个概念啊,我用网络的时候,表现形式是什么?
子网掩码是配置进全球的所有的路由器当中的。包括分类划分法。
我的报文里只有源IP 目的IP没有子网掩码啊
子网掩码在哪呢?
在你的报文被转发时所经历的一个一个路由器当中
路由器认为你的网络是什么,你的网络就是什么。
当报文每经历一个路由器,转发的时候先要按照目的网络来转发,凭什么啊,凭的就是
你的目标报文到了某一个路由器,路由器会拿着你的目标报文,自己内部的子网掩码按位&得到网络号,然后对应路由器可以配置多个IP,每个路由器连接哪个子网他也清楚,就能把你的报文经过目的网络进行转发。
所以我们口中对应的网络时间就是路由器眼中的世界。
目的IP假设是图中IP地址
经过子网掩码的按位&后得到网络号
子网中一共允许多少台主机呢
低八位 全0到全1
子网地址范围是140. 252. 20. 0~140. 252. 20. 255 一共256个
实际上子网中允许的主机个数是256-2
两个IP地址不用 就是140. 252. 20. 0(网络号)和140. 252. 20. 255(广播)
掩码255.255.255.240 = 255.255.255.1111 0000
全1之前的都是网络号
子网掩码,可以对IP32位,进行任意划分
不是说必须得8位,8位的
不是说子网掩码的位数非得是8的整数倍
书写方式
n子网掩码
/24 前24bit位是1 后8位为0
CIDR在一定程度上缓解了IP地址不够用的问题提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加
我们现在的解决方案是分类划分法+子网掩码
假设公司分到B类网络,可以继续在16位主机号分出12位再加上之前的16位成为子网掩码,也就是IP/28,最后4位就能分出2^4 = 16-2 = 14台主机
后续还可以继续对12位主机号继续基于B类网络构建出2^12个子网,每个子网都能存14台主机,掩码依旧是28,主机号当成网络号有2 ^12,继续掩码。
CIDR确实解决了浪费问题。
IP地址不足不是 通过节省就能解决的。
解决IP地址不足
动态分配IP地址 你用IP的时候给你不用时候回收(提高利用率)
NAT技术(提高利用率)
IPV6(和IPV4是两种不同协议,不兼容)
私有地址和公网地址
RFC 1918规定了用于组件局域网的私有IP,局域网的IP也不是胡乱分的。
IP地址被硬性的划分成为 = 公网IP 和 私有IP
分类划分法 + 子网掩码划分 既可以在公网划分也可以对私网划分。
因为IP地址划分本质是规定哪些比特位是网络号,哪些比特位是主机号
在同学们的使用生涯中,你们都在直接使用的其实都是私有IP! ! !
云服务器—公网IP
理解运营商 和 全球网络理解
首先理解一件事,我们是怎么上网的?
首先电信提供光纤入户,送你个调制解调器 和路由器,猫把光纤模拟信号转为数字信号交给路由器
想上网还得交钱,给你一个上网账号和密码
配置到家用路由器中。然后路由器有权力访问外网了。
家用路由器 还可以 构建局域网
典型表现就是你用手机搜无线网络就看到你家路由器了。
家用路由器 还有对用户做认证的路由器账号和密码
所以路由器存在两套密码机制
谈一谈运营商,非常重要的角色
在上网之前有件事情非常重要,网络基础设施建设,运营商先把基站建立在全国各个地区
运营商 用户 互联网公司 三者配合
国家想让互联网公司更多,更多的税收
就必须
1.投入大量基础设施建设
2.更多网民入网
私人企业不愿意做网络基础设施建设
运营商也不愿意做
但是国家要求大力发展互联网
推着运营商干基础设施建设。
二十年前流量费特别贵
你还要把流量费降价,才能有更多用户入网。
不仅城里人上网,村里人也得上网。
所以必须得有基层工作人员跑过去给你家里装网线了。
那这么多人上网干啥啊?
这时候就有了淘宝 JD 美团
最终既把运营商变大了,还让更多人上网了,还孵化出更多的互联网公司,国家税收还多了。
你家里的路由器 连着你家里的局域网 还连着电信的网络,所以你的信息一定是先到运营商的。
全球网络理解
IP地址是一份大的资源,分配不仅仅是按国家分配的,他一般是按照国家组织地区人口综合评估给你分配IP地址个数
今天为了方便理解就单纯按国家来划分
分类划分法就不体现了,直接用子网掩码的划分方式。
IP地址本质就是32个 0 1 序列
我们说的都是公网IP
按前8个比特位称为国家的编号
每个国家都有国际路由器的,国际路由器彼此之间是互相连接的,相当于在一个群里面
,我们国家对IP地址划分里,我们国家的路由器里它认为子网掩码是
中国内部的所有前八个比特位就不用了,我们国家内部有多少个省呢,34个
我们简化几个
我们可以拿着八个比特位后面6个比特位,分别编号区分各个省,所以子网掩码就变成了14位
各个省的路由器也是连着的。
陕西可能有10个市,2^4也就够了
陕西省的各个区的路由器也是互相连着的
再拿出4个比特位编号区分各个区。 子网掩码就变成了/18
还可以继续划分,但不在分了
所以西安的一台机器开头IP就应该是
每8位为一个十进制
2.8.128.5 从图中按照国家,省,区划分下来的,主机号选择了5
将来有一个美国人要访问的IP地址
2.8.128.5
它发现这个IP地址不是国内的IP地址,所以他把报文交给了国际路由器,到了国际路由器把这个IP地址扔到了国际路由器的群里面就问这个谁的IP 啊,此时中国人一看这个IP开头是2,它用这个IP和子网掩码一&,发现这个ip所要去的网络就是中国
2.8.128.5 & 1111 1111 省略24个0 = 2.0.0.0
所以这个报文就到了中国的路由器里。
之后呢这个IP地址再被抛到中国省间路由器中,省间子网掩码是14。
假设路由器收到了这个报文,路由器要对比
,把这个目标IP地址继续 & 子网掩码
得到
最终会匹配到省间路由器的陕西省路由器
报文转发到了陕西省,继续利用掩码&IP。根据前18个比特位继续对比,依次到达目标主机。
所以我们的网络是被精心设计过的!!
已经把一个数据包跨网络从上往下送达的过程,这个东西就是子网掩码和IP地址的意义。
IP地址再被划分时,会根据国家,根据省市,把公网IP划分好了,构建出来一个一个网段,中国内部大家的网络号都是一样的前8位。
所以就能构建出基本网络来通信了。
中国所有这些工作全部都是运营商帮我们做的。
我们刚刚说的都是公网
少年们用的都是私网
这两张网络有什么关系呢?
平时家里的路由器是能够构建子网的,家里每一个设备有自己的IP地址,子网掩码是24,你对外网发起请求时,通过你的设备先把数据包交给家用路由器,然后路由器交给运营商,到了运营商再进入公网,再访问互联网公司
同学们的 网络是下边,公网是上边
你的源ip:192.168.1.201
你的目的IP:122.77.241.3
你构建一个请求,IP报头带了源IP目的IP
你首先判断的是这个目标报文去的目标地址一定不在同一个子网,所以只能把消息转给路由器,路由器发现你要去的目标主机也不再他的子网,再由路由器继续向上转发经过运营商,转发之后到了公网,对应服务器就收到了请求,他对你的请求做响应。
构建响应
dst :192.168.1.201
src: 122.77.241.3
当他给我构建报文想回来的时候,发现当前对应的目标主机是私有IP!
私有IP不能出现在公网中,而且不同的私网大家的私有IP可能是一样的。
公网的主机服务器的响应报文就回不来了。
所以怎么解决这样的问题呢?
运营商也有路由器,路由器可以配两个IP
子网IP就是内部使用的IP叫做10开头
WAN口IP叫做外网IP,122也就是公网IP了。
家里的路由器也有子网IP和WAN口IP
子网IP就是家里所有主机所用到的IP
家里的路由器的WAN口IP代表的是运营商的内网IP,家里路由器一定直接连接运营商,所以家里路由器和运营商是构建在同一个子网的。
为了让我们把数据包也能转回来,至少要把报文交给运营商的路由器,如果交不回运营商的路由器就不可能进来。
所以此时报文出去的时候会做一种策略,叫做源IP替换成每一个路由器的WAN口IP
从你电脑发出去时
在家用路由器经过替换后
运营商替换后
此时这个报文不就在IP报文里携带了源IP目的IP而且都是公网IP
至此这个报文转给服务器,
服务器再响应的时候
dst: 122.77.241.4
src: 服务器IP
当他把响应处理完了,要回来的时候也能做到把回来的报文交给对应的运营商对应的公网入口路由器处。
至于接下来怎么回到我的主机上,先不说
我们发现我们用的是子网,运营商也会用子网。
下面的问题就是能出去了,回只能回到运营商的入口路由器中,接下来内网怎么转发先不谈。
我们用的全部都叫做私有IP
私有IP不断被替换的过程叫做NAT技术
1为什么不直接用公网IP呢?
划分到西安区时,IP地址也就剩下2^14才一万多,整个西安有多少人,IP地址严重不足
,更别说让你直接用公网了。
所以IP地址不足以支撑这么多人使用 的。
到了西安之后,区,省用的全是公网IP,
可是到西安之后网络不能拿着公网IP继续划分了,我们接入到当前这套模式。
西安当地也有自己的运营商
西安所以人用的全部都是内网IP,出来之后经过运营商路由器到了陕西省,再到公网
IP地址严重不足,我们主流互联网世界采用的是
公网 + 私有网络 = 互联网
因为大家网络的IP地址在局域网中是重复的,所以就可以让整个省的人都能上网。
总结
把IP地址32位在国家,省级划分好,国际级路由器,省之间的路由器,地区IP地址不可能继续划分了,所以采用私网方案。
所以私网前八位10开头,后24位 2^24= 16,777,216个地址
一个不够再来两个这样的网络。
10开头的IP 覆盖的网络足以覆盖整个区了。
互联网公司要被访问必须有公网IP
公网之间转发都是可以直接回来的
到了内网之后呢就是
报文出去时使用NAT技术,保证自己的源IP目的IP变成公网,在公网内做转发,转发之后把结果通过公网转回来,到我的入口路由器
唯一没做的就是在入口路由器处怎么再回到某主机的问题。
NAT怎么回来的问题
路由怎么路由一说
一个报文怎么转到外网,怎么转到其他主机也就知道了。
所以墙在哪呢?墙在运营商当中
所有人想访问网络前得先访问运营商的网络
文章目录
- 理解一下,打通一下文件和socket的关系
- 网络层
- ip协议
- 前置认识
- ip协议的报头
- 4位首部长度 具有单位长度4
- 4位版本
- 8位服务类型
- 16位总长度
- 8位生存时间
- 8位协议
- 16位首部检验和
- 32位源IP
- 32位目的IP
- 网段划分
- CIDR子网掩码方案
- 私有地址和公网地址
- 理解运营商 和 全球网络理解
- 全球网络理解
理解一下,打通一下文件和socket的关系
网络服务都是进程,在内核中叫做tast_struct
每个打开的文件都要有文件描述符
进程有文件描述符表
文件描述符指向strcut file
file结构体中有个 private_data指针
如果这个文件是个网络文件,该指针就会指向struct socket文件
而struct socket文件也有指针回指sturt file
也就是在网络里随时想返回来找文件也能找到。
以前讲过一切皆文件,最终整个网络文件挂接到struct file下,应用层看待它一切只需要按照文件描述符就能找到这个文件的struct socket
所以struct socket里有一个wait_queue_head_t wait是什么呢?
记不记得对应的进程阻塞等待时,要把自己的PCB链入到指定的数据结构里,所以如果网络读取数据不就绪,只要讲进程挂接到wait_queue里就可以了。
socket里还有一个 方法集proto_ops ops,和struct file也有方法集f_op
我们发现socket 里还有 struct sock* sk
指向了strcut sock 这只是网络的开始
struct file 指向strcut socket是从文件到网络的过度
sock里包含接受和发送两个队列
以UDP 和TCP为例,走到这里其实到网络了
struct sock* sk 看起来是指向struct sock但实际上他并没有指向sock,当你创建tcpsocket时他指向的是struct tcp_sock,当你创建UDP套接字时其实系统中创建的是udp_sock
只不过这两个结构体中开头都包含了sock结构体
我怎么知道我指针sk指向的是tcp还是udp呢?
socket中有个flags 或者 type可以区分socket类型。
未来我要使用tcp的其他属性,我只需要(strcut tcp_sock*)sk - > 就能访问到tcp套接字里面的内容了。
所以他的本质就是C语言的多态。
当我们在网络中收数据发数据到了tcp或udp的套接字最开始就是sock,而sock里面就有sk_buff的接受和发送队列。
此时通过网络上层把数据通过文件描述符把数据交给下层再交给tcp_sock就完了吗?
还没完
问题
网络协议栈层状结构,什么叫做协议栈啊
所谓的协议栈的本质
Linux内核是用C语言写的,所谓的协议栈本质就是
- 用特定数据结构表述的协议
- 和特定协议匹配的方法集!
文件stcut file本来就有自己的方法集,当底层指向的不是磁盘而是网络,则文件指向的方法是网络相关的方法。
struct socket 也有方法集
这俩有什么区别呢
未来file提供的方法一部分直接指向网络方法了,file方法最终要解决的是对上的问题,因为用户数据在应用层,应用层数据一定要通过fd拷贝到我们的套接字所对应的接受和发送队列中,他要给你形成一个节点,把他连入到队列中。
首先把上层数据交给下次,交给队列。
strcut socket里面的方法呢主要是对下的,也就是说提供的connect ,sendmsg,因为sendmsg没有发送缓冲区,所以你把数据交给下层看起来好像在队列里,其实我们将来使用sendmsg不用file里的方法,而用socket的方法直接就把数据发出去了,但如果是tcp的话数据先放到队列里,socket里提供了网络建立连接的一些方法,实际上底层sock里还有对应的方法集,每一层都有对应的方法集,要么是对数据加工处理,要么是把数据拷贝到底层的,因为tcp根本没有把数据发出去,tcp这些所有方法集不是把数据发到网络而是想办法把数据交到下层。
所以呢无论是文件中,还是网络套接字里,还是未来tcp udp的套接字里,各自提供各自层的方法,tcp,udp根本不会把数据send发送到网络里,他应该把数据交给下一层,所以对应的所有函数指针指向的方法由对应的协议栈给我们提供方法集。
曾经说过我们对应的OS中一定同时收到大量的报文,不管tcp 还是Udp,上层不只一个网络服务,A进程想发,B也想发。
每一个文件描述符就对应一个Struct file,对应一个stcut socket,对应一对接受发送缓冲区。
我们的OS内可能同时存在很多报文,不要觉得tcp是面向字节流,所有报文都是字节流,不一定
问题是OS中数据都是一个个报文,所以OS中要不要把多个报文管理起来?
我收到的报文里上层不读,所以OS积压了很多报文。
服务器收到多个报文,而报文是要被管理的
如何管理呢?
先描述,在组织
每一个在网络中的报文他的数据结构叫做sk_buff
为什么还有个锁呢?
因为接受和发送的过程本质在内核中属于CP模型
sk_buff里四个指针会互相配合指向一段内存空间
所以如果我今天收到了一个报文,head代表报头的开始,tail代表报文的结束,end空间的结束,data代表数据的开始
所以在不同的层,在网络中,sk_buff结构体叫做先描述,然后每一个sk_buff收到的报文就在对应的内存空间中,我们把这个sk_buff称为一个内核级别报头
所以我们经常说要把报文经过传输层交给
下层,从下层交给上层,本质上是让sk_buff的结构在层和层之间进行流动,所以流动时向下层交付时,我们要封装报头本质就是让head指针继续根据下层协议报头长度,让指针往上走,这叫做封装的过程
如果解包根据每层协议不同的方法来让指针根据每层报头的大小格式了,让head指针往下走,此时叫做解包
所以封装和解包本质上只要进行移动指针就可以!!
任何一层报文无非就是报头和有效载荷,每一层无非就是根据报头协议字段来移动head,比如第一个报头是tcp,我们指向当前的一个报文,head指向的是Tcp报头,然后根据tcp前20字节,根据报文长度我就可以直接找到数据区,此时报头就确定出来了,此时头空间有效载荷就出来了。
如果有数据新增移动尾指针就可以了
所以他是通过指针方式来对buff管理的。
所以先描述这个sk_buff结构体 用4指针管理,然后所有的报文在网络层大家是一块的,但到传输层之后呢我们就要把报文分发给每一个不同的文件描述符了
所谓的分发就是把sk_buff在组织到对应的缓冲区里
此时我们就可以得到对应的报文了。
最终告诉结论就是 一切皆文件,我们的网络套接字本质上也是文件。
将来你读取数据时本质通过这一大堆链路,找到receive_queue,从里面读取一个或多个sk_buff,然后把数据交给上层。
这个recvive_queue是链表,并不是我们以前讲的数组啊?
并不是,但在逻辑上认为他是个数组,好理解,这就是理论和现实的差别!
提问
是不是,传输层、网络层、数据链路层的解包操作都在接收缓冲区中操作,不需要繁琐的拷贝,只是指针移动
解释
也就是对sk_buff在链路层交给网络层就进行指针移动,后续交给上层继续指针移动不发生拷贝。
还有一点就是tcp中accept 创建一个链接时, 要重新分配文件描述符,重新分配stuct file,重新stcut socket,重新分配收发队列,重新搞sk_buff
所以我们说建立连接是有成本的,维护连接是有成本的,因为要在内核创建大量数据结构。
网络层
结论
ip协议的本质工作:提供一种能力,将数据跨网络从A主机送到B主机!
ip协议他的核心工作是真正的要把ip报文发送到网络中了,Tcp报文并没有直接到网络里,他是包裹在ip里面被发出来的。
ip协议有这种能力将数据跨网络从A主机送到B主机,可是用户需要这种能力吗?
能力本身不是100%做到的,上层用户要的是将数据可靠的跨网络从A送到B。
所以IP协议只要将来能把数据跨网络发送,以现在网路情况送过去概率非常高,但不是100%的,所以传输层提供策略(超时重传等),下层提供能力,ip和tcp一结合就可以保证每次都能发送成功。
ip协议
ip协议他的工作就是经过一堆路径选择把数据送到目标主机
前置认识
常识:从A主机到B主机发报文需要跨很多路由器
前提每台主机
a:要对所有的主机进行标识。
源ip,目的ip来标识源主机和目的主机
ip地址分成私有ip,公网ip
我们今天两天主机通信都默认公网ip通信
所以我们有了唯一性标识在通过路径选择再去把数据转发到目标主机才有可能。
b: 去一个地方玩要分两个阶段
1。去目标城市
2。去目标地点
ip地址的构成 实际上由两部分构成
ip = 目标网络 + 目标主机!
每台主机都在一个子网中
从A发到B,要经过路由器转发,跨越子网
所以走的时候一定是先到达B主机所在的网络(先到达目标网络),接着想办法把报文交给目标主机
先到目标网络,再到目标主机,凭什么啊?
凭的就是路由器的转发
我们活在一个被精心设计的世界中 !
学号并不是一个单纯的数字,标识你这个人
学号也有构成,是被精心设计过的。
学号 = 学院编号/专业编号/班级编号/学生编号
网络世界也是被精心设计过得。
学号简化为
学号 = 学院 / 学号
方便表述。
我们都有学院群
每一个学院都有一个学生会主席
学生会主席自己有没有拉群啊
他们肯定也一定都在一个群里
计算机学生009捡到了钱包中有个只能看到学号的学生卡432008
你要把这个钱包归还给人家,归还钱包本质是查找,查找本质是排除!
如果我一个一个在食堂门口问就是线性遍历,效率太低!
我就在学院的计算机群里,计算机群里不是有学生会主席吗,他应该根其他学院也拉了群啊,计算机学生会主席他应该知道其他学院的学号啊,你不知道当什么学生会主席啊。
所以拿着这个学生卡的照片发给计算机群里,@计算机主席,我虽然不知道432是哪个学院的,但我知道他一定不是我们计算机学院的,计算机主席一看432,432不是电气学院的吗,他虽然不认识这个学生,但他认识学院号,他就把这个照片发到他的群里面,@了电气的学生会主席,询问是不是电气学院的啊?电气学院学生会主席也要对他的学生有所了解,此时电气主席就把照片转发到电气群,@了小美。
为了能让小美找到我,这个消息还会带上我的学号和电话。
为什么归还的速度变快了??
因为我把这个报文转给学生会主席本质是我淘汰了计算机院的一群人,计算机主席把数据转发到学生会群里面@电气主席,本质是淘汰了剩下其他的学院,查找的本质是排除,所以建立群把我们每一个人按照这种方式
学号 = 学院+学号各自拉群,这种方式速度变快,本质是因为以前一次淘汰一个人,今天一次淘汰一群人
排除的效率高了!!!
所以我们把这种地址叫做ip地址
123009叫做源ip
我要去的目的ip叫做432008.
图中局域网 还有局域网主机
计算机学生会主席叫做 局域网出口路由器
把学生会主席的群叫做公网
所以把数据通过局域网转发到公网当中然后公网当中每一台路由器天然认识其他在公网里所有路由器,所以路由器可以转发找到小美
所以这次查找时思路是先找到目标网络,也就是小美所在的群,小美所在的局域网,
然后再由目标网络转到目标主机
所以这样去搞就可以提高效率了。
此时就可以跨网络传输了。
所以ip地址为什么要分成这样呢?
我们又为什么要这样呢?
因为本质上我们路上查找时效率高,一次可以排除很多东西
所以ip = 目标网络 + 目标主机是为了构建网络的时候,为我们将来高速定位一台主机,提供基础保证!!
那校学生会主席会不会也拉一个群呢?
有清华的,有北大的,会不会拉群呢?
所以网络就不断层层叠叠之下越来越大。
所以记住两个就可以了
1每台主机都要有唯一标识
2 ip地址不要简单理解成四字节数据,要理解为ip = 目标网络 + 目标主机
把这个换钱包的故事记住
ip协议的报头
宽度0-31 也是4字节
标准报头 20字节
还有选项
ip 和 tcp报头非常类似
4位首部长度 具有单位长度4
范围【0000,1111】 = 【0,15】
ip报头至少20字节 设首部长度为x x *4 = 20
x =5
所以报头范围是【5,15】也就是【20,60】
和tcp一样都有这个首部长度
那我识别这个ip报文的时候怎么识别?
管你报文整体多长,直接先读20,该有的都有了。
4位版本
固定值 4 ipv4
ipv4地址2的32次方 42亿多 ip地址严重不足
解决方案:NAT , ipv6(128bit位)
8位服务类型
ip报文在网络里要转发,要进行路径选择,从A到B可能有非常多的路线和方式。
最小延迟:路径时间最短
最大吞吐量:单位时间内可以过去更多数据
最高可靠性
最小成本
结合ip报文策略来进行路径选择,四者冲突,只选其一。
ip不保证可靠性
因为ip针对丢包问题无能为力
ip如果设置最高可靠性代表后面进行路径选择时,我想尽量选择那些不会丢包的情况。
丢包我也没办法只能等上层超时重传。
这四个选项为了数据包转发时给路由器提供转发依据或策略。
16位总长度
整个报文的总长度
8位生存时间
一旦把IP报文转发出去之后,那么IP报文在网络中转发时可能会有目标主机已经离线了,如果一个Ip报文转发的过程本质是把数据包从一个路由器查找路由表跳转到下一跳路由器
这就叫一次转发
如果主机已经不可答或者网络bug,导致IP报文被一直转发,为什么呢?
IP报文网络里会衰减,数据二进制信号会有强弱概念,时间越长衰减越强,所以网络设计者考虑了 这点,集线器可以信号放大,保证数据长距离传输。
一直转发的报文呢找不到目的地址或者网络有问题,称做游离报文,会有很多游离报文经过路由器不断转发时间一久不允许这种情况,所以设置每个报文的8位生存时间。
8位生存时间:数据包最多能经历的路由器的跳数。
8位协议
标识我们要把ip的有效载荷交付给上层的那一个协议?
填tcp编号就知道交给上层的哪一个了
16位首部检验和
IP对首部做检验,检验失败直接丢弃。
检验成功,报文向上交付
问题
1.报头和有效载荷如何分离
通过4位首部长度+16位总长度来进行报头和有效载荷分离的。
总结就是
固定长度+自描述字段(首部+总长度)
未来收到IP报文,我无脑读取前20字节,无脑读取首部和总长度,首部长度如果是20,证明剩下的就是数据,首部长度如果是30,说明选项10字节
为了验证整个报文,最终把报头读上来之后,16位总长度就可以对整个报文的长度加总长度字段进行审核,长度一致说明报文是OK的,把首部去掉包括选项,剩下就是数据。
TCP或 UDP最终都要把数据交给IP层,不管是字节流还是面向数据报,将来在网络里发的都是一个一个的IP层数据报
所以UDP 面向数据报 TCP 数据段或者字节流,在底层网络转发时报文还是一个一个转发过去的。所以所谓的面向字节流概念并不是IP层的概念,他是TCP提供给应用层,让应用层关注的。
就像十字路口人流涌动,但是人都是一个一个的过来的
2.如何将有效载荷交付给上层
8位协议
32位源IP
32位目的IP
填写套接字 需要 ip地址和potr
port 给tcp用
ip地址 给 ip用
这就是应用层要把点分十进制ip地址 转化 成4字节,因为IP报头是4字节源IP地址和目的地址,要构建IP报头的。
所以一个IP报文仍在网络里时,支持路由的其实是根据32位目的IP地址进行路径选择。
故事
唐山从东土大唐 受李世民之名,去西天 找如来 求真经
唐僧 跑腿
本质是李世民和如来进程间通信。
唐僧就是其中一个报文。
报文里携带了源IP 目的IP
为了完成他们通信的工作呢
在TCP层我们维护双方端口的信息,因为TCP协议只会出现在双方的OS中,而IP报文在路由时,每一个路由器它把报文做转发时不会到达IP层
网络通信过程中只有双方主机具有tcp层,路由器没有所谓的TCP层的。
路由器可以有,但我不用,因为所有路由器只工作在网络层,他只要把报文转发就行了。
端口号在传输层
IP地址在网络层
网段划分
IP地址分为两个部分, 网络号和主机号
网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号
强调两点
1.路由器本质也是特定一个子网的主机,也要配置ip地址
毕竟你要把数据从A发到B,你只能通过路由器
2.路由器一定至少要连接2个子网,路由器也就相当于同时在两个子网。
所以路由器也是特定子网的一个主机,所以路由器可以配置多个IP,而且是一定要的。
,就认为路由器有多张网卡就行
3.路由器一般是一个子网中的第一台设备,一般他的IP地址都是 :网络号.1
4.路由器功能,ip报文的转发,但是路由器的功能不仅仅如此~,他还有很多功能
构建子网(构建局域网)
比如家里无线路由器,设置好你拿手机都可以连路由器都可以上网,本质是路由器给你构建了子网,路由器给你分配了子网的IP地址
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
你家里的设备想入网得先连接路由器,然后路由器给你分配不重复的IP地址,这种IP叫做内网IP
之前说的捡钱包的IP叫做公网IP
后面谈IP地址会被分成两部分
路由器做的
1 能构建子网
2 能够对子网内的IP地址进行管理工作
不了解运营商,IP层是不可能学好的。
理解IP地址根本就不是学习IP报头之类的。
我们要理解IP本质是要理解网络,而理解网络其实是在理解运营商
所以电脑的IP其实是在联网的时候才会有的。
不信把网线拔了看看IP地址还在否?
IP 路由器 现实生活中的网络建设 结合成一个话题
ip地址只有42亿多,分完了就没了,所以各个国家都需要争。
所以IP要划分一下,规定比特位A第一个比特位是0,B是10
A类网络 总IP地址数 = 2^7 x 2 ^ 24
相当于把整个32位 ip地址分成了很多块,切蛋糕一样
大部分组织都申请B类网络,导致很快被分配完了。
B类网络给了你 你不一定能把16位主机号全占满
造成了各个类网络IP地址的浪费,A同理
我没申请过A类网络啊,谁来申请这样的网络呢
运营商可以申请这种类型的IP直接入公网
那有没有不公平分配啊,技术上带上ZZ,这都是协商出来的。
网络本身不赚钱,只有让更多人接入进来才赚钱。
现在IP地址主要矛盾不是分配不均的问题,主要矛盾是不足的问题
这种分配方式会造成大量IP地址的浪费
当年网民少,随着时代发展,入网设备越来越多,IP地址严重不足,还采用这种浪费的分配方式不能忍。
所提出新的划分方案
CIDR子网掩码方案
尊重历史,在原来的基础之上引入一个额外的子网掩码来区分网络号和主机号。
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾
子网掩码有什么特点呢?
用IP地址 & 子网掩码 = 网络号
255就是全1
122.133.144.0就是122.133.144.155这个IP对应的网络号
未来想让网络号发生变化只需要调整子网掩码当中1的个数
多几个1就让主机号变的更少
少几个1变成0的话就让主机号变的更大
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
要么规定比特位(A类),要么使用01序列来划分(子网掩码)
我没感觉有划分这个概念啊,我用网络的时候,表现形式是什么?
子网掩码是配置进全球的所有的路由器当中的。包括分类划分法。
我的报文里只有源IP 目的IP没有子网掩码啊
子网掩码在哪呢?
在你的报文被转发时所经历的一个一个路由器当中
路由器认为你的网络是什么,你的网络就是什么。
当报文每经历一个路由器,转发的时候先要按照目的网络来转发,凭什么啊,凭的就是
你的目标报文到了某一个路由器,路由器会拿着你的目标报文,自己内部的子网掩码按位&得到网络号,然后对应路由器可以配置多个IP,每个路由器连接哪个子网他也清楚,就能把你的报文经过目的网络进行转发。
所以我们口中对应的网络时间就是路由器眼中的世界。
目的IP假设是图中IP地址
经过子网掩码的按位&后得到网络号
子网中一共允许多少台主机呢
低八位 全0到全1
子网地址范围是140. 252. 20. 0~140. 252. 20. 255 一共256个
实际上子网中允许的主机个数是256-2
两个IP地址不用 就是140. 252. 20. 0(网络号)和140. 252. 20. 255(广播)
掩码255.255.255.240 = 255.255.255.1111 0000
全1之前的都是网络号
子网掩码,可以对IP32位,进行任意划分
不是说必须得8位,8位的
不是说子网掩码的位数非得是8的整数倍
书写方式
n子网掩码
/24 前24bit位是1 后8位为0
CIDR在一定程度上缓解了IP地址不够用的问题提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加
我们现在的解决方案是分类划分法+子网掩码
假设公司分到B类网络,可以继续在16位主机号分出12位再加上之前的16位成为子网掩码,也就是IP/28,最后4位就能分出2^4 = 16-2 = 14台主机
后续还可以继续对12位主机号继续基于B类网络构建出2^12个子网,每个子网都能存14台主机,掩码依旧是28,主机号当成网络号有2 ^12,继续掩码。
CIDR确实解决了浪费问题。
IP地址不足不是 通过节省就能解决的。
解决IP地址不足
动态分配IP地址 你用IP的时候给你不用时候回收(提高利用率)
NAT技术(提高利用率)
IPV6(和IPV4是两种不同协议,不兼容)
私有地址和公网地址
RFC 1918规定了用于组件局域网的私有IP,局域网的IP也不是胡乱分的。
IP地址被硬性的划分成为 = 公网IP 和 私有IP
分类划分法 + 子网掩码划分 既可以在公网划分也可以对私网划分。
因为IP地址划分本质是规定哪些比特位是网络号,哪些比特位是主机号
在同学们的使用生涯中,你们都在直接使用的其实都是私有IP! ! !
云服务器—公网IP
理解运营商 和 全球网络理解
首先理解一件事,我们是怎么上网的?
首先电信提供光纤入户,送你个调制解调器 和路由器,猫把光纤模拟信号转为数字信号交给路由器
想上网还得交钱,给你一个上网账号和密码
配置到家用路由器中。然后路由器有权力访问外网了。
家用路由器 还可以 构建局域网
典型表现就是你用手机搜无线网络就看到你家路由器了。
家用路由器 还有对用户做认证的路由器账号和密码
所以路由器存在两套密码机制
谈一谈运营商,非常重要的角色
在上网之前有件事情非常重要,网络基础设施建设,运营商先把基站建立在全国各个地区
运营商 用户 互联网公司 三者配合
国家想让互联网公司更多,更多的税收
就必须
1.投入大量基础设施建设
2.更多网民入网
私人企业不愿意做网络基础设施建设
运营商也不愿意做
但是国家要求大力发展互联网
推着运营商干基础设施建设。
二十年前流量费特别贵
你还要把流量费降价,才能有更多用户入网。
不仅城里人上网,村里人也得上网。
所以必须得有基层工作人员跑过去给你家里装网线了。
那这么多人上网干啥啊?
这时候就有了淘宝 JD 美团
最终既把运营商变大了,还让更多人上网了,还孵化出更多的互联网公司,国家税收还多了。
你家里的路由器 连着你家里的局域网 还连着电信的网络,所以你的信息一定是先到运营商的。
全球网络理解
IP地址是一份大的资源,分配不仅仅是按国家分配的,他一般是按照国家组织地区人口综合评估给你分配IP地址个数
今天为了方便理解就单纯按国家来划分
分类划分法就不体现了,直接用子网掩码的划分方式。
IP地址本质就是32个 0 1 序列
我们说的都是公网IP
按前8个比特位称为国家的编号
每个国家都有国际路由器的,国际路由器彼此之间是互相连接的,相当于在一个群里面
,我们国家对IP地址划分里,我们国家的路由器里它认为子网掩码是
中国内部的所有前八个比特位就不用了,我们国家内部有多少个省呢,34个
我们简化几个
我们可以拿着八个比特位后面6个比特位,分别编号区分各个省,所以子网掩码就变成了14位
各个省的路由器也是连着的。
陕西可能有10个市,2^4也就够了
陕西省的各个区的路由器也是互相连着的
再拿出4个比特位编号区分各个区。 子网掩码就变成了/18
还可以继续划分,但不在分了
所以西安的一台机器开头IP就应该是
每8位为一个十进制
2.8.128.5 从图中按照国家,省,区划分下来的,主机号选择了5
将来有一个美国人要访问的IP地址
2.8.128.5
它发现这个IP地址不是国内的IP地址,所以他把报文交给了国际路由器,到了国际路由器把这个IP地址扔到了国际路由器的群里面就问这个谁的IP 啊,此时中国人一看这个IP开头是2,它用这个IP和子网掩码一&,发现这个ip所要去的网络就是中国
2.8.128.5 & 1111 1111 省略24个0 = 2.0.0.0
所以这个报文就到了中国的路由器里。
之后呢这个IP地址再被抛到中国省间路由器中,省间子网掩码是14。
假设路由器收到了这个报文,路由器要对比
,把这个目标IP地址继续 & 子网掩码
得到
最终会匹配到省间路由器的陕西省路由器
报文转发到了陕西省,继续利用掩码&IP。根据前18个比特位继续对比,依次到达目标主机。
所以我们的网络是被精心设计过的!!
已经把一个数据包跨网络从上往下送达的过程,这个东西就是子网掩码和IP地址的意义。
IP地址再被划分时,会根据国家,根据省市,把公网IP划分好了,构建出来一个一个网段,中国内部大家的网络号都是一样的前8位。
所以就能构建出基本网络来通信了。
中国所有这些工作全部都是运营商帮我们做的。
我们刚刚说的都是公网
少年们用的都是私网
这两张网络有什么关系呢?
平时家里的路由器是能够构建子网的,家里每一个设备有自己的IP地址,子网掩码是24,你对外网发起请求时,通过你的设备先把数据包交给家用路由器,然后路由器交给运营商,到了运营商再进入公网,再访问互联网公司
同学们的 网络是下边,公网是上边
你的源ip:192.168.1.201
你的目的IP:122.77.241.3
你构建一个请求,IP报头带了源IP目的IP
你首先判断的是这个目标报文去的目标地址一定不在同一个子网,所以只能把消息转给路由器,路由器发现你要去的目标主机也不再他的子网,再由路由器继续向上转发经过运营商,转发之后到了公网,对应服务器就收到了请求,他对你的请求做响应。
构建响应
dst :192.168.1.201
src: 122.77.241.3
当他给我构建报文想回来的时候,发现当前对应的目标主机是私有IP!
私有IP不能出现在公网中,而且不同的私网大家的私有IP可能是一样的。
公网的主机服务器的响应报文就回不来了。
所以怎么解决这样的问题呢?
运营商也有路由器,路由器可以配两个IP
子网IP就是内部使用的IP叫做10开头
WAN口IP叫做外网IP,122也就是公网IP了。
家里的路由器也有子网IP和WAN口IP
子网IP就是家里所有主机所用到的IP
家里的路由器的WAN口IP代表的是运营商的内网IP,家里路由器一定直接连接运营商,所以家里路由器和运营商是构建在同一个子网的。
为了让我们把数据包也能转回来,至少要把报文交给运营商的路由器,如果交不回运营商的路由器就不可能进来。
所以此时报文出去的时候会做一种策略,叫做源IP替换成每一个路由器的WAN口IP
从你电脑发出去时
在家用路由器经过替换后
运营商替换后
此时这个报文不就在IP报文里携带了源IP目的IP而且都是公网IP
至此这个报文转给服务器,
服务器再响应的时候
dst: 122.77.241.4
src: 服务器IP
当他把响应处理完了,要回来的时候也能做到把回来的报文交给对应的运营商对应的公网入口路由器处。
至于接下来怎么回到我的主机上,先不说
我们发现我们用的是子网,运营商也会用子网。
下面的问题就是能出去了,回只能回到运营商的入口路由器中,接下来内网怎么转发先不谈。
我们用的全部都叫做私有IP
私有IP不断被替换的过程叫做NAT技术
1为什么不直接用公网IP呢?
划分到西安区时,IP地址也就剩下2^14才一万多,整个西安有多少人,IP地址严重不足
,更别说让你直接用公网了。
所以IP地址不足以支撑这么多人使用 的。
到了西安之后,区,省用的全是公网IP,
可是到西安之后网络不能拿着公网IP继续划分了,我们接入到当前这套模式。
西安当地也有自己的运营商
西安所以人用的全部都是内网IP,出来之后经过运营商路由器到了陕西省,再到公网
IP地址严重不足,我们主流互联网世界采用的是
公网 + 私有网络 = 互联网
因为大家网络的IP地址在局域网中是重复的,所以就可以让整个省的人都能上网。
总结
把IP地址32位在国家,省级划分好,国际级路由器,省之间的路由器,地区IP地址不可能继续划分了,所以采用私网方案。
所以私网前八位10开头,后24位 2^24= 16,777,216个地址
一个不够再来两个这样的网络。
10开头的IP 覆盖的网络足以覆盖整个区了。
互联网公司要被访问必须有公网IP
公网之间转发都是可以直接回来的
到了内网之后呢就是
报文出去时使用NAT技术,保证自己的源IP目的IP变成公网,在公网内做转发,转发之后把结果通过公网转回来,到我的入口路由器
唯一没做的就是在入口路由器处怎么再回到某主机的问题。
NAT怎么回来的问题
路由怎么路由一说
一个报文怎么转到外网,怎么转到其他主机也就知道了。
所以墙在哪呢?墙在运营商当中
所有人想访问网络前得先访问运营商的网络