Linux网络编程: 网络基础
1.网络划分
计算机网络按照地理覆盖范围的大小,可以将网络划分为局域网(LAN)、城域网(MAN)和广域网(WAN)等几种类型。
局域网:小范围内使用的网络,广域网是大范围内使用的网络(是一种远程网,适合长距离的通信),城域网是覆盖范围介于两者之间的网络
而网络的发展也不是一蹴而就的,网络能够发展:
- 依赖于新的设备的诞生(集线器,网线,光纤,路由器,调制解调器,防火墙…)
- 依赖于三大运营商使用新设备对网络基础设施进行搭建和提供入网方式
- 依赖于互联网公司为用户提供服务从而促进互联网的传播
其中,我们学习过程中更关注前两点
一.网络通信
1.网络通信和本地通信的联系
本地通信就是同一台计算机内部实现的通信,比如我们之前学习的进程间通信,线程间通信(本来就能通信,只不过需要保护临界资源,最经典的模型就是生产者消费者模型)
甚至:
从体系结构角度来看:
进程要打开文件,势必涉及到CPU,内存,磁盘之间的数据交互,而通信的本质就是数据的交互,
因此这一过程也可以看做本机的数据交互,也就是本地通信啊
那么如果本地通信跟网络通信能有什么关联的话,我们学习网络不就能够更加轻松与深刻了吗?
因此我们能够得出:单台机器也是一种网络结构哦,
因此本地通信跟网络通信之间是有一定的联系的,学习过程中我们可以将我们之前学习系统时的部分经验/知识移植到网络当中来,你会发现我们能够很好地理解网络
2.网络通信与本地通信最本质的区别及其衍生出的问题
本地通信和网络通信最本质的区别就是:
网络通信的距离更长
就是这个看似平平无奇的区别,衍生出了一堆问题,而这些问题被很多计算机界的大佬总结归纳为了以下几点:
- 如何做到把数据交给下一跳中转站?(技术问题)
- 在转发过程中,如何进行路径选择,也就是目标主机的定位问题(选择/决策问题)
- 如何保证报文的安全性,处理/防止 报文丢失/出现错误 的问题(传输问题)
- 送达的数据如何才能被使用(应用问题)
针对于这4大问题,网络协议就出现了
二.网络协议初识
所谓协议其实就是一种约定,通信双方通过达成约定就能进行信息传递
1.为何本地通信不行?
命名管道的通信就是由两个进程约定好使用那个管道文件进行通信,你用读方式打开,我用写方式打开,然后我写数据,你读数据,实现进程间通信
共享内存的通信就是我们向OS申请一块内存空间,通过发送特定的信号量或互斥锁来表示某个进程已经完成了对共享内存的写入或读取操作,从而避免数据冲突
消息队列也需要进程间达成某种约定,例如确定使用哪个消息队列、消息的格式和内容等,从而保证数据的指向性传递
它们之间的这些约定本质上就是一种协议,叫做本地通信协议
=============================================================================================
而这只是本地通信,如果现在要进行通信的是两个独立的机器呢?
仅仅通过制定相应的协议就能实现通信吗?
是的,不过协议就没有本地通信这么简单了,需要小到硬件,大到OS,应用程序都需要遵守相应的协议才可以实现网络通信
为何,举一个例子:01序列的划分
计算机的数据可以按照 高低/有无电压、高低/有无电频来划分01序列
磁盘上的数据按照磁性N/S不同来划分01序列
光纤上的数据按照光的强弱/有无来划分01序列
比如如果两个计算机,一个按照磁盘上的N为1,S为0存放数据,另一个按照N为0,S为1存放数据
那么它们交互时发送的数据在二进制上不就完全相反了吗…
因此网络协议就出现了,而网络协议都是分层模型,我们后面会介绍
下面我们用一个例子来理解一下分层模型与网络协议