网络通信原理
一:概述
本文为自己看阮一峰文章后的笔记.加入了一些自己类比的比喻.
原地址: 互联网协议入门
互联网的实现原理->五层模型.png二.实体层(电脑)
实体层.png全世界各个电脑想相互通信.首先要把各个电脑连接起来.
可以通过光缆.电缆.电磁波等连接起来.
这就叫做实体层.他主要规定了网络的一些电气特性.负责传送0/1电信号.
类比: 电脑 ==>> 人 && 0/1信号 ==>> 声音
每台电脑就像我们每个人.我们发出的声音就是0/1电信号
三.链路层(以太网)
单纯的0/1没有任何意义.链路层就是制定一套规则.让0/1变得有意义.
类比: 以太网协议 ==>> 语言协议
就像人发出声音.没有任何意义.
但是通过语言这个规则.让声音可以表达信息.
3.1.以太网协议
以太网数据包(帧).png举例如语言规定 矮老虎油
这句话发音表达的意思是我爱你.
以太网也规定一组0/1电信号构成一个数据包.叫做帧
. 每一帧分成两个部分: 表头(Head)和数据(Data)
表头: 包含 发送者.接收者.数据类型 ==>> 对应语言就是主语(我). 谓语(你). 语言类型(中文)
数据: 具体内容 ==>> 对应语言就是我爱你中的爱
.
3.2.MAC地址
上面提到.以太网数据包中标头
包含了发送者.接收者.那么如何标识发送者和接收者呢?
MAC地址.png
以太网规定.连入网络的所有设备.都必须具有网卡
接口(理论上是唯一的也是必须有的).
数据包必须从一块网卡传送到另一块网卡.网卡的地址就是发送地址和接收地址.也叫做MAC地址.
每块网卡出厂的时候.都伴有独一无二的MAC地址.长度48个二进制单位.通常用12个十六进制数表示.
前6个十六进制数是厂商编号.后6个是该厂商的网卡流水号.
MAC地址类比.png类比: MAC地址 ==>> 传声筒的杯子(如下图)
每个杯子上都有一个名字.标识这是你的杯子.
3.3.广播
3.3.1问题一:
但是一块网卡怎么知道另一块网卡的MAC地址呢.就像传声筒的一端杯子怎么知道另一端的杯子是谁的呢.
这个时候就有ARP协议可以解决这个问题.后面介绍.
3.3.2问题二:
就算我知道了对方的MAC地址.但我怎么准确的将帧发送给他呢.
以太网采用了一种很原始的方式.他不是吧数据包准确送到接收方.而是想本子网络内所有计算机发送.让每台计算机自己判断是否为接收方.
广播类比.png如: 电脑A像电脑B发送一个数据包.
那么电脑A会给子网络里所有电脑B.C.D.E.F都发送数据包.
然后电脑B.C.D.E.F电脑接收到数据包后拿到接收地址跟自己的MAC地址比较.如果相同就接收.不相同就丢弃.
类比: 广播 ==>> 村喇叭
现在传声筒升级了.每个人手里的传声筒都连接村里的大喇叭
这是小明说了一句话.小明爱小红
.发送给村喇叭.这句话包含了发送地址(小明).接收地址(小红).
然后村喇叭再向全村人广播这句话.
这时全村人都听到了这句话
小红一听.接受者是自己.那他就知道了小明对他说的内容了.
村里其他人听到后手里碗一摔.md.又撒狗粮.然后就无视这段话了.
四.网络层(IP)
以太网协议依靠MAC地址发送数据.理论上单单依靠MAC地址.上海的网卡就可以找到洛杉矶网卡了.
村喇叭在一个村传播还好.那要是全世界都用这一个喇叭.
那么30亿人每人用传声筒说一句话.那每个人都要听到30亿句话.那不炸了吗.
子网络.png因此必须找到一个方法.能够区分哪些MAC地址属于同一个子网络.哪些不是.
如果是同一子网络.就采用广播方式发送.
如果不是就采用路由
方式发送.
类比: 路由 ==>>省喇叭
就像一个人说一句话.要区分这句话的接收者是不是该村的.
如果是就用本村的村喇叭喊话.
如果不是就让村喇叭把话发给省喇叭(如果湖北省总喇叭).
遗憾的是MAC地址本身无法做到区分.他只与厂商有关.与所处网络无关.
这就导致了网络层
的诞生.网络层作用就是引进一套新的地址>>IP地址
4.1IP协议
IP地址.pngIP协议规定每台电脑分配一个IP地址.他由32个二进制数组成.
习惯上我们会分成4段十进制数表示.从0.0.0.0一直到255.255.255.255
IP地址分成两部分.前一部分代表子网络
(村喇叭).后一部分代表主机
(每个人).
比如IP地址172.16.254.1.
那么172.16.254就标识子网络
最后的1标识主机
这个时候就可以知道与他同一子网的IP地址为172.16.254.xxx
4.2子网掩码
但是我们怎么知道前多少位标识子网络呢.
这个时候就引入了子网掩码
.
子网掩码的 网络部分全部为1. 主机部分全部为0
如: 11111111.11111111.11111111.00000000
十进制:255.255.255.0
知道子网掩码
我们就能判断任意两个IP地址是否是处于同一子网络.
4.3子网掩码使用方法
比如IP地址A: 172.16.254.1和IP地址B:172.16.254.233的子网掩码都是255.255.255.0
拿IP地址A和IP地址B分别与子网掩码进行AND运算(即与
运算.两个数都为1则为1.否则为0)
IP地址A:
10101100.00010000.11111110.00000001
11111111.11111111.11111111.00000000 AND运算
=======================================
10101100.00010000.11111110.00000000 >> 172.16.254.0
IP地址B:
10101100.00010000.11111110.11101001
11111111.11111111.11111111.00000000 AND运算
=======================================
10101100.00010000.11111110.00000000 >> 172.16.254.0
可以发现IP地址A和B的运算结果都是172.16.254.0.因此他们在同一个网络
假如一个姓氏一个村.比如小岗村的人都姓孙.
类比: AND运算 ==>> AND运算后发现两个人都姓孙
那么这个姓氏就是小明的子掩码.其他人拿自己的姓名与这个子掩码.就能得到是否是一个村的.
4.4IP数据包(帧)
根据IP协议发送的数据.就叫IP数据包.其中必须包括IP地址(姓氏).
但是前面提过以太网数据包
只包含MAC地址(名字).
并没有IP地址的烂尾.那么是否需要修改数据定义呢?
不需要.我们可以把IP数据包
直接放进以太网数据包
的Data
部分.
完全不用修改以太网的规格.
这就是互联网分层结构的好处.
如下.蓝色为以太网数据包
的Head.红色为以太网数据包
的Data
我们将IP数据包
直接放在以太网数据包
的Data里
类比: 增加IP地址信息 ==>> 相当于增加了姓氏
4.5分段
IP数据包:
Head长度为20-60字节.
Data部分.最长为65515字节.
整个数据包的总长度最大为65535字节.
而以太网数据包
的Data部分最长只有1500字节.
因此如果IP数据包
超过了1500字节.他就需要分割成几个以太网数据包
分开发送了.
类比: 数据分段 ==>> 一句话分段
此时小明向小红说一段话就相当于分了几次说.
先说: 我
再说: 爱
再说: 你
4.6ARP协议
即获取同一子网络的主机MAC地址的协议方法.
有两种情况:
4.6.1)情况一
如果两台主机不在同一子网络.那么事实上就没办法得到对方的MAC地址.只能把数据包传送到两个子网络连接处的网关(geteway)
处理.
4.6.2)情况二
如果两台主机在同一个子网络.那么我们可以使用ARP协议.得到对方的MAC地址.
ARP协议也是发出一个数据包(包含在以太网数据包中).其中包含他所要查询的IP地址.
在对方的MAC地址这一栏.填的是FF:FF:FF:FF:FF:FF.表示这是一个广播地址
.
他所在子网络的每一台主机.都会收到这个数据包.
从中取出IP地址.与自身的IP地址进行比较.如果相同.则回复.向对方报告自己的MAC地址.
五.传输层(端口)
5.1由来
有了MAC地址和IP地址.我们已经可以在全世界任意两台主机上建立通信.
接下来的问题是.同一台主机上有许多APP都需要用到网络.比如.你一边浏览网页.一边与朋友在线聊天.
当一个数据包从网上发来的时候.你怎么知道.他是表示网页的内容还是表示在线聊天的内容.
也就是说.我们还需要一个参数.表示这个数据包到底供哪个APP(进程)使用.
这个参数就叫做端口(Port)
.他其实就是每个APP的编号.
每个数据包都发到主机的特定端口.所以不同的程序能取到自己所需要的数据.
5.2端口
端口是0到65535之间的一个整数.正好16个二进制位.
0-1023的端口被系统占用.
APP只能选用大于1023的端口.
不管是浏览网页还是在线聊天.APP会随机选用一个端口.然后与服务器的相应端口联系.
现在传声筒又升级啦.每个传声筒的两端都有多个杯子.
类比: 端口 ==>> 传声筒一端的不同杯子
相当于你对着不同的杯口说话.对方就能分辨出来你说的是哪件事.(这比喻有点牵强.尴尬😓)
5.3套接字(socket)
传输层
的功能就是建立端口与端口的通信.
相比之下.网络层的功能是建立主机到主机的通信.
只要确定主机和端口.我们就能实现程序之间的交流.
因此Unix系统就把主机+端口 叫做 套接字.
有了它.就可以进行网络APP开发了.
5.4UDP/TCP协议
现在.我们必须在数据包中加入端口信息.这就需要新的协议.最简单的实现叫做UDP协议.
其实就是添加一个端口信息的协议方法.
如下.蓝色为以太网数据包
的Head.
红色和蓝色为以太网数据包
的Data
我们将UDP数据包
直接放在以太网数据包
的Data里.
即将端口信息放在红色Head里
除了UDP协议.还有另一个协议叫TCP协议.他们功能是一样的.
5.5UDP/TCP区别
UDP:
协议简单.容易实现.可靠性差.一旦数据包发出.无法知道对方是否收到.
TCP:
3次握手.4次挥手确保了可靠性.但是过程复杂.实现困难.消耗较多资源.
5.6UDP/TCP应用
对实时性要请高的场景:如实时会议.实时视频.多点通讯
这些场景如果用TCP.当网络不好会发生重传.画面会有延迟.甚至越堆越多.选择UDP就会好很多.
除了这些场景.其他都用TCP准备错.
六:应用层
应用层数据包.png应用程序收到传输层
的数据.接下来就要进行解读了.
由于互联网的开放架构.数据来源五花八门.
必须实现规定好格式.否则根本无法解读.
应用层的作用就是规定应用程序的数据格式.
比如.TCP协议可以为各种各样的APP传递数据.
如Email.WWW.FTP.HTTP等等.这些应用程序协议就构成了应用层.
这是最高的一层.直接面对用户.他的数据就放在TCP数据包的Data部分.
像平常我们都是使用HTTP协议获取传输数据.
其实也可以直接绕过应用层(HTTP协议)
直接使用传输层的TCP协议来获取传输数据.
类比: 应用层协议 ==>> 英语/日语/法语
? 应用层的各种协议就相当于各个国家制定的语言协议一样.