Linux网络基础概念
前言
我们也是进入到了linux网络编程部分啦,首先是一些网络的相关概念,还是比较简单的,后面的难度将会加大,所以我们的第一篇就显得很轻松可爱啦!!(当然要提前说明的是:我们的网络部分和系统部分是息息相关的,所以说前面的系统部分的基础一定要打好!!)
1.网络背景
网络:计算机是人类的工具,人之间是需要协作的,就注定了计算机之间也是需要协作的——所以网络的产生是必然的
网络的产生:先产生于局部,再扩到整体
发展:
独立模式: 计算机之间相互独立
网络互联: 多台计算机连接在一起, 完成数据共享
局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起
广域网 WAN: 将远隔千里的计算机都连在一起
2.初识协议
协议本质是一种约定——可以减少通信的成本,用于快速形成共识
计算机之间的传输媒介是光信号和电信号. 通过 "频率" 和 "强弱" 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式
思考: 只要通信的两台主机, 约定好协议就可以了么?
• 定好协议, 但是你用频率表示 01, 我用强弱表示 01, 就好比我用中国话, 你用葡萄牙语一样, 虽然大家可能遵守的一套通信规则, 但是语言不同, 即是订好了基本的协议, 也是无法正常通信的
所以, 完善的协议, 需要更多更细致的规定, 并让参与的人都要遵守。
• 计算机生产厂商有很多
• 计算机操作系统, 也有很多
• 计算机网络硬件设备, 还是有很多
• 如何让这些不同厂商之间生产的计算机能够相互顺畅的通信? 就需要有人站出来, 约定一个共同的标准(全方位的,硬到软件), 大家都来遵守, 这就是 网络协议
我们所学的网络协议是由iso定制的——OSI协议,但是组织只生产标准,不写代码实现
协议分层
协议本质也是软件, 在设计上为了更好的进行模块化, 解耦合, 也是被设计成为层状结构的
(所有的软件都是层状、模块化的)
在这个例子中,我们的"协议"只有两层:语言层、 通信设备层,但是实际的网络通信协议, 设计的会更加复杂,需要分更多的层,但在上面的图中我们可以知道分层可以实现解耦合,让软件维护的成本更低
(网络协议栈就是分层的)
OSI七层模型
OSI 七层模型是一种框架性的设计方法, 其最主要的功能使就是帮助不同类型的主机实现数据传输,它的最大优点是将服务、 接口和协议这三个概念明确地区分开来, 概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,但是, 它既复杂又不实用; 所以我们按照 TCP/IP 四层模型来讲解
TCP/IP 五层(或四层)模型
(标准是OSI,实现时用的是TCP/IP四层模型)
TCP/IP 是一组协议的代名词, 它还包括许多协议, 组成了 TCP/IP 协议簇
TCP/IP通讯协议采用了 5 层的层级结构, 每一层都呼叫它的下一层所提供的网络来完成自己的需求
3.再识协议
从本地通信到网络通信必定会引发新的问题
为什么要有 TCP/IP 协议? 本质就是通信主机距离变远了
什么是 TCP/IP 协议?
• TCP/IP 协议的本质是一种解决方案
• TCP/IP 协议能分层, 前提是因为问题们本身能分层
网络是操作系统的一部分,虽然系统可能是linux、windows的,但是它们的网络部分一定是一样的,这也就是为什么手机和电脑可以进行通信
所以到底什么是协议?
协议本质:就是约定好的结构体
结构体是协议约定的计算机式的表达
现实的网络 = 多种局域网通信标准 + 一种广域网通信标准
(底层技术)
4.网络传输的基本流程
局域网(以太网为例)
(而令牌环网的令牌就相当于我们的锁,无线LAN是在手机上通信的局域网(和以太网相似))
通信原理
• 首先回答, 两台主机在同一个局域网, 可以直接通信
• 原理类似上课
• 每台主机在局域网上, 要有唯一的标识来保证主机的唯一性: mac 地址;就如同每个人有自己的名字一样
认识 MAC 地址
• MAC 地址用来识别数据链路层中相连的节点
• 长度为48个比特位, 即6个字节. 一般用 16 进制数字加上冒号的形式来表示(例如08:00:27:03:fb:19)
• 在网卡出厂时就确定了, 不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)
• 以太网中, 任何时刻, 只允许一台机器向网络中发送数据
• 如果有多台同时发送, 会发生数据干扰, 我们称之为数据碰撞
• 所有发送数据的主机要进行碰撞检测和碰撞避免 (碰撞避免算法)
• 没有交换机的情况下, 一个以太网就是一个碰撞域
• 局域网通信的过程中, 主机对收到的报文确认是否是发给自己的, 是通过目标mac地址判定
以太网本质就是共享的资源,为临界资源,我们的碰撞避免、检测就是为了维持互斥属性
主机之间通信:我们必须认识到本质是两个协议栈在通信
数据发送的原始动力是人(90%的情况)
网络协议栈每一层都有协议,所以当我进行上述传输流程的时候, 要进行封装和解包
[^] 局域网的通信是两主机的数据链路层在进行通信
这个报头叫做协议报头,就像是快递不会说发过来就只是买的商品,而是外面有快递盒和快递单,外面的协议报头就相当于那个快递单
在应用层的“你好”这条信息称作该层的有效载荷,要将它送往另一台主机得经过网卡,于是就是一层一层加上该层的协议报头往下走,每一层的有效载荷都是应用层信息加上上层的协议报头,比如说传输层的有效载荷就是:应用层报头+“你好”,依次往下递推,这一过程叫做封装
而右边一端同层要先解包:报头和有效载荷进行分离,再依次把有效载荷交给上层(分用的过程)
同层之间都认为在和对方同层直接通信,因为我收到的就是你发送的
细节:
细节:
除开应用层协议报头,对于其他任何协议报头
a. 报头必须要能做到和有效载荷进行分离的能力
b. 报头中必须包含如何将自己的有效载荷交付给上层的哪一个具体协议的属性
底层收到报文(报文【Message】是在网络中交换与传输的数据单元,即站点一次性要发送的数据块),但是该报文不是发送给我的,数据链路层就会直接丢弃
关于各层的叫法
我们再明确一下不同层的完整报文的叫法
不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报 (datagram),在链路层叫做帧(frame).
应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).
首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,层协议是什么等信息
数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理
在网络传输的过程中, 数据不是直接发送给对方主机的, 而是先要自定向下将数据交付给下层协议, 最后由底层发送, 然后由对方主机的底层来进行接受, 在自底向上进行向上交付
数据封装的过程:
数据分用的过程:
跨网络传输
网络中的地址管理——认识IP地址
IP地址用来标识全球范围内主机的唯一性(公网IP)
(和MAC相似,不过MAC要早于IP)
IP 协议有两个版本, IPv4 和 IPv6,我们学习的未特别说明的都是IPv4
IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址
对于 IPv4 来说, IP 地址是一个 4 字节, 32 位的整数
我们通常也使用 "点分十进制" 的字符串表示 IP 地址(字符串风格), 例如 192.168.0.1用点分割的每一个数字表示一个字节, 范围是 0 - 255
对比 IP 地址和 Mac地址的区别
IP 地址在整个路由过程中, 一直不变(目前的认知)
Mac 地址一直在变
目的IP是一种长远目标, Mac 是下一阶段目标, 目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据
MAC是写在网卡的固件上的,不可被修改;而IP地址是可以修改的
从哪里来,到哪里去——源IP,目标IP地址
上一站从哪来,下一站去哪里——源MAC,目标MAC地址
示意图:
转换:
路由过程中IP地址不变,mac地址一直在变——mac地址只会在本局域网内有效
网络层+IP的本质意义:给网络提供了一层虚拟化层,让世界上所有的网络都叫做IP网络(底层究竟是以太网、无线LAN、令牌环或者自定义局域网通信原理都不影响)
总结:
IP 网络层存在的意义: 提供网络虚拟层, 让世界的所有网络都是IP网络, 屏蔽最底层网络的差异