目录
网络的起源
网络的前身是美国国防部用于军事(20世纪60年代末,美苏冷战时期,为了确保通信,保证第一时间能够发射导弹,组建出来的一个军用网,叫做"阿帕网"),到了70年代,慢慢发展,最终形成了现在的"互联网",简称"Internet".
局域网 与 广域网
用两根线把3个主机连接起来 , 形成了局域网. 这样三个主机之间就可以进行通信.
如下连接就是太废网线了.也废网口.
现如今组建局域网, 使用交换机 与路由器 , 交换机就是把若干个设备给组建到一个局域网中,
这个局域网内部的各个主机之间就可以相互访问.
互联网发展到如今 , 路由器和交换机功能也近乎一样了.
通过交换机和路由器,组建起来的在这些都叫做局域网.
更大的局域网就是广域网.
IP地址 和 端口号
IP地址 : 描述了网络上的每个主机的位置.
例如 : 127.0.0.1 IP地址本质上是一个32个bit位.为了方便记忆, 将8个bit位设为一个字节.分为四个部分,用 . 分开, 称为"点分十进制".
端口号 : 描述了一个主机上的某个应用程序.
端口号本质上是2个字节(16位) 的无符号整数. 范围是 0 ~ 65535
例如 : 3306 这是MySQL的默认端口号.
什么是协议?
协议 : 可以理解为是一种"约定"
让发送方与接收方约定好我们以什么样的格式来通信.发送方发出来的数据是啥样的格式,接收方按照对应的格式来进行解析.
网络通信的时候 , 本质上, 传输的是 光信号和电信号 , 通过(光纤)光信号的频率(高频率/低频率)或者(网线)电信号的电平(高电平/低电平) 来表示 0 和 1 . 具体的这一串0 1 表示的是什么意思, 取决于是什么约定的.也就是协议.因此在传输前 , 就需要让发送方和接收方都约定好,每01都是什么意思.
例如 : 像 摩斯密码 , 还有电视剧中的发电报操作 . 就算你给情报截获了, 要是你不了解其中的协议, 就没办法翻译.
网络中的协议
网络通信是非常复杂的, 也就导致协议很庞大.里面有非常多的细节.
在面对一些比较特殊的环境 , 就需要更复杂的协议, 但协议太复杂,使用起来过于困难.
一个很好的方法就是 : 将一个庞大的协议拆分成多个协议. 拆分为更简单的协议 , 每个协议,负责一部分工作.
例如 : 像平常我们写代码一样 , 我们不会让一个main方法实现全部功能 , 而是创建一些辅助方法来帮我们实现其中的一些功能.
拆分出来的这些小协议 , 进行"分类" (功能类似的,放到一个组里)
同时再针对这些不同的类别, 进行分层. (约定了层级和层级之间的调用关系)
要求上层协议调用下层协议,下层协议给上层协议提供支持.不能跨层调用.
协议的好处
1 . 分层之后 , 层次之间,耦合程度比较低.
上层协议不必了解下层的细节, 下层协议也不必了解上层的细节.
2. 方便对某一层的协议进行替换 .
站在语言的双方 , 我们不在意使用的是什么通信设备来交流.
站在通信设备的角度 , 不在意交流的两个人说的是什么语言.
OSI 七层网络模型
从上往下 : 应用层 , 表示层 , 会话层 , 传输层 , 网络层 , 数据链路层 , 物理层
七层模型现如今已经很少使用.
TCP / IP 五层网络模型
当下最广泛使用的网络模型TCP/IP
五层 : 应用层 , 传输层 , 网络层 , 数据链路层 , 物理层
四层 : 应用层 , 传输层 , 网络层 , 数据链路层. (对于程序猿来说主要考虑的是软件上的事情,物理层是纯硬件, 和软件的关系不大)
应用层 : 主要关注的是传输过来的数据是干什么用的.
传输层 : 不考虑中间路径 , 只关注起点与终点.
网络层 : 主要负责起点节点和终点节点之间的路径规划.[全局考虑]
数据链路层 : 主要关注的是相邻的两个节点之间的传输.[局部考虑]
物理层 : 网络通信的基础设施 , 网线, 光纤, 网络接口等等.
举个栗子 : 好比是在淘宝上买东西 .
站在卖家和买家的角度 , 他只关心这个货物能不能送到 , 这就是传输层 .
而中间的快递公司, 它关注的就是这个送货的路径,好比从北京 - 西安 - 太原 - 朔州.快递公司做的就是规划路线. 这就是网络层.
而从北京到西安是通过火车还是货车还是飞机. 这就是数据链路层考虑的问题.相邻的两个节点如何传输. 这就是数据链路层.
物理层 : 就是中间使用的介质 , 高速公路 , 汽车.....
最后站在我们用户的角度来说 : 我们只关心这个买回来的东西能不能用.怎么用.
对于我们程序猿来说 : 打交道最多的就是应用层.
传输层和网络层 由操作系统实现.
数据链路层和物理层 是由设备的驱动程序及硬件实现的.
对于一台主机来说 : 它就实现了这5层协议.
而传统的路由器, 主要就是物理层到网络层(主要是实现了物理层,数据链路层,网络层).
传统的交换机, 主要就是物理层到数据链路层(主要是实现了物理层,数据链路层).
数据是如何通过网络传输的?
答案是 : 封装和分用.
发送方发送数据 , 把数据从应用层到物理层依次进行封装.
接收方接收数据 , 把数据从物理层到应用层依次进行解析.
封装
举个栗子 : Guo祥 要给 ting婷发一个微信说 : 吃不吃zaotan.
应用层调用传输层提供的api (api : 应用程序的编程接口)
将应用层的数据 , 交给传输层. (交给传输层以为着进入了操作系统内核)
传输层再把数据传给网络层
网络层交给数据链路层
mac 地址 与 IP 地址的区别
IP地址指站在网络层的角度 的 起始地址 和 目的地址
而mac地址是站在数据链路层的角度上的 起始地址 和 目的地址 , 也就是相邻两个节点的起始地址和目的地址.
并且 mac地址是唯一的 , 而 IP地址是不唯一的.
最后将数据链路层传输给物理层
5 . 物理层就会把上述数据链路层传输过来的二进制数据 (一组010101011010 的数据)
转换为光信号或者电信号或者电磁波信号, 进行传输.
以上就是从应用层到物理层的大致封装过程 , 简单来说就是发送出的消息, 经过每一层的封装(其实就类似于字符串拼接) 最后由物理层以电磁波或者光信号或者电信号 发送出去.
分用
封装是从应用层到物理层.
把发送方的消息进行封装好通过电磁波或光信号或电信号 发送到接收方.
接收方的物理层的网卡收到高低电平二进制数据. 就会对这里的信号进行解析 , 还原成010101这样的二进制序列.
由物理层交给数据链路层
网络层 也是去掉IP报头 , 取出载荷交给传输层.
传输层 去掉 UDP报头后 , 取出载荷 , 把数据交给应用层.
最后由微信这个应用程序来进行解析. 取出下列字段,放到程序的界面中.
总结 : 封装就是打包快递. (由应用层到物理层 , 层层进行封装).
分用就是拆快递 . (由物理层到应用层 , 层层进行分用).
在发送和接收双方它们之间还有多个节点进行转发.
A 将消息发给B , 它们之间需要将过多个路由器和交换机来负责数据的转发.
路由器要做的事情就是先分用到网络层 , 将IP地址进行更新 , 进行下一阶段的路径规划.
然后重新往下封装 , 并进行转发.
交换机会先分用到数据链路层 , 更新以太网数据帧的mac地址然后再重新封装 , 并进行转发.