单机时代 -> 局域网时代 -> 广域网时代 -> 移动互联网时代
计算机之间相互独立
随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。
网络互连:将多台计算机连接在一起,完成数据共享。
数据共享本质是网络数据传输,即计算机之间通过网络来传输数据,也称为网络通信。
根据网络互连的规模不同,可以划分为局域网和广域网。
把几个电脑,通过路由器连接到一起
局域网,即 Local Area Network
,简称LAN
。
Local
即标识了局域网是本地,局部组建的一种私有网络。
局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的。
以下是局域网组建网络的几种方式:
把更多的局域网连接到一起,所构成的网络更加庞大,可能已经覆盖一个城市/一个国家/全世界
广域网,即 Wide Area Network
,简称WAN
。
通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。广域网内部的局域网都属于其子网。
但是有一个点:局域和广域之间是没有明确的界限的!
描述了一个设备,在网络上的地址
举例子:
生活中:江苏省 盐城市 建湖县境内 蔡徐村
计算机中:使用一个32位,4字节数字,表示地址,一啊不能来说,会把IP地址给表示成4个0-255之间的十进制数字,并且使用3个点进行分隔,点分十进制
特殊IP
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)
区分一个主机上不同的应用程序的
端口号也是一个整数(2个字节,相对比较小的数字)
不同的程序,就可以关联/绑定到不同的端口号
要求同一个主机上的应用程序,不能关联到同一个端口号、
(一个端口号只能被一个程序绑定,但是一个程序可以绑定多个端口号)
端口号是2字节:0->65535
0 :一般不是使用
1-1023 : 这个范围的端口号,系统留作特殊用途,我们写的程序不要去占用
知名端口号:
22 :ssh
80 :http
443 :https
23 : telnet
在实际的通信过程中,IP和端口往往是一对
举个例子:
我们买东西
收件人地址,收件人电话
发件人地址,发件人电话
好比西游记中的唐僧
贫僧自东土大唐而来,前往西方拜佛求经
贫僧:源端口
东土大唐:源IP
西方:目的IP
佛:目的端口
协议就是一种约定,约定了通信双方按照啥样的方式来传递数据~
网络上,本质就是通过光/电信号佬传输数据的
比如说:低电平(电压)表示1,高电平表示0,高频光信号表示1,低频光信号表示0
举个例子
就好比你去相亲,你们约好了在xx酒店相遇,然而呢别的相亲对象也约定好在xx酒店,那待会你就会可能发生认错人的情况(你懂的,反正我不懂)
那么此时就有一个简单的方法,你们可以约定见面的时候带个绿帽子或者戴个项圈(正经的哈别乱想)
通过这样的操作,就像相当于是一种协议~
协议,就是单纯的约定,并不一定会遇到很复杂的。
由于在网络通信的世界中,遇到的场景/问题往往比较棘手,的确是有一些网络协议是非常复杂的~
在TCP/IP协议中,用五元组来标识一个网络通信:
源IP:标识源主机
源端口号:标识源主机中该次通信发送数据的进程
目的IP:标识目的主机
目的端口号:标识目的主机中该次通信接收数据的进程
协议号:标识发送进程和接收进程双方约定的数据格式
五元组在网络通信中的作用,类似于发送快递:
同时我们也可以在cmd
中输入netstat -ano
来查看网络数据传输中五元组的信息:
我们平时写代码,若代码越写越多,越写越复杂,那么我们往往需要将代码拆分成多个部分~
网络通信的场景,可能会比较复杂
有很多的问题需要通过协议来进行解决,
如果搞一个大的协议来解决所有问题,此时这个协议就会非常庞大.非常复杂,就不利于人们去学习和理解,
相比之下,也可以把大的协议,拆分成多个小的协议.让每个小的协议只专注于做一小块事情~~
使每个小的协议,都不会太复杂.(化繁为简)由于网络通信实在太复杂,拆分就拆出来太多的小的协议.这么多小的协议也就不好管理了.
此时就需要对协议进行分层了.
并且约定了不同层次之间的"调用关系
“上层协议,调用下层协议”"下层协议给上层协议提供支持
这样的话,这么多协议就不容易混乱~~
这里我们用一个例子来理解
协议分层的好处就是;
协议分层之后,好处多多.因此现在网络世界都是这种分层的结构。
这种一般就出现在教科书中~
OSI:即Open System Interconnection
,开放系统互连
OSI 七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了7层。
OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整。通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
越往下,越进阶硬件~
重点还是关注TCP/IP协议
描述的是网络通信的硬件设备.
好比基础设施.公路,铁路,
比如使用的网线,光纤都应该是啥规格~
两个相邻节点之间的数据传输情况
进行路径规划
关注起点和终点
如何使用数据(也是我们最需要关注的一点)
物理层我们考虑的比较少。因此很多时候也可以称为 TCP/IP四层模型
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
交换机的作用就是针对路由器端口进行拓展,路由器上的端口可能是有限、不够
对于集线器,它只实现了物理层;
实际上,现在的路由器和交换机功能都越来越强大了.(甚至说一些高端的交换机,也有路由功能)
另一方面,路由器交换机可能还会支持一些更复杂的操作.甚至可能会工作在传输层或者应用层
以下为跨网段的主机的文件传输:数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器:
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。
首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 “上层协议字段” 将数据交给对应的上层协议处理
描述了网络通信中,基本的数据传输过程
A通过qq将hello发给B
应用层:QQ应用程序.QQ就会把用户输入的"hello",给打包成一个应用层的数据报(这个数据报的格式,得是qq的程序员才能知道)
就可以将应用层数据报,通过操作系统的API,将数据交给传输层
传输层
就要对列才的应用层数据,再进行打包,变成传输层的数据报~~
这里的打包过程,本质上还是"字符串拼接"
把刚才的应用层数据,基础上拼接上传输层的报头
传输层典型的协议TCR/UDP
传输层将数据报搞好了之后,这个数据就会进一步交给网络层
网络层
网络层的数据打包好了之后,继续将数据交给“数据链路层”再来进一步打包
数据链路层
把这个数据给物理层
物理层
把上述数据,转换成2进制的01序列
通过光信号/电信号进行传输
数据发送出去之后,就会经过一系列的交换机和路由器进行转发
A和B一般来说不是直接网线连接的.中间还要经过很多的交换机/路由器设备进行转发
从上层协议到下层协议,层层给数据报添加报头
这个过程称为"封装"
注意区分,此处的封装不是面向对象的封装了,
作用有点像~
当数据到达B这边之后,B就要针对上述数据进行"分用”(针对上述数据报进行层层的解析)
另外,数据报在网络中还会经历一定的转发过程
如果经过路由器:就会封装分用到网络层
路由器解析到网络层,拿到P地址,决定进一步如何传输
下一步传输的时候,又会重新经过网络层,数据链路层和物理层的封装
如果经过交换机:就会封装分用到数据链路层
那么本篇文章就此结束咯,简单介绍一下网络传输的基本流程
接下来关于网络编程的干货满满,敬请期待~