网络编程-软件开发架构 OSI七层协议 以太网协议 IP 端口 TCP UDP
网络编程前言
计算机,由硬件 操作系统,应用程序组成,有了这三个元素,就可以在自己的电脑上运行一些应用程序了,比如玩玩纸牌,扫扫雷什么的
如果要想与其他计算机一起玩,就必须要让你的计算机和其他计算机能够互相传递数据
学习网络编程就是要学习利用网络来与另一台计算机相互传输数据, 开发出支持网络通讯的应用程序,这样即使足不出户也能尽知天下事
软件开发架构
1. c/s架构 (client / server)
c:客户端
s:服务端
1.1应用领域:
- 大型网络游戏
计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端。
客户端:用户安装的软件;
服务端:统一管理数据库的主机中的软件就叫做服务端,再后来服务端不只是管理数据,外加处理业务逻辑。
1.2 CS架构要求
- 用户操作系统安装客户端;产商操作系统部署服务端
- 每个用户需要独立安装软件、服务端升级也要每个用户升级
1.3 面试题:数据放在服务端和客户端的利与弊?
答:
- 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
- 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!
2.b/s架构(browser / server)
b:浏览器
s:服务器
应用领域:
- 淘宝
- 京东
统一客户端即默认安装用户电脑中的浏览器,访问同种类的网站,具体业务的处理根据相应协议和标准提供通用的服务器程序,在不同的服务器处理。
3.两种架构比较
bs架构本质也是cs架构
手机端看上去cs架构比较火,实际上bs已经在崛起
微信支付宝都在做一件事:统一接口
手机端之后肯定也是bs比较火
学习网络编程 就可以开发一个cs架构的软件
并发 数据库 前端 django 就可以开发一个bs架构的软件
通讯协议
什么是协议?
协议就是标准,大家要遵循相同的标准才能正常交流通讯
两个人要交流,必须说双方都能理解的语言,想象一下一个说新疆话的人打电话给说闽南语的人,基本说了等于没说 双方都能理解的语言就是,就是标准,就是协议
为什么要制定协议?
在计算机中,链接介质 通常是网线,网线本质就是一条电线,可以传播电流,而电流可以按照强弱,被理解为0和1
那问题是,一台计算机被电了一下是什么意思?被电了两下又是什么意思? 这就必须由发送方和接收方共同商定出一套标准,从而可以知道0和1表示的含义
如何使用协议?
然而作为应用程序开发者,物理介质显然不是我们需要关心的,比如如何牵网线
所以通讯协议是我们学习的重点
OSI网络通讯协议
Open System Interconnection Reference Model,开放式系统互联通信参考模型,缩写为OSI,是由国际标准组织推出的,其实就是一大堆协议,OSI把整个通讯过程划分为七层,简称OSI七层模型
实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让你明白哪一层是干什么用的。
每一层都运行不同的协议。协议是干什么的,协议就是标准。
实际上还有人把它划成五层、四层。
七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
五层划分为:应用层、传输层、网络层、数据链路层、物理层。
四层划分为:应用层、传输层、网络层、网络接口层。
一、物理层
物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
二、数据链路层
以太网协议(局域网通讯):
1.规定了二进制数据的分组依据
2.规定了每台计算机都必须有一块网卡
1+2=以太网协议
2.1 分组
数据链路层的由来:单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
以太网协议(Ethernet)工作在数据链路层,其规定了电信号分组方式,以及一组电信号应该包含哪些内容
规定如下:
1.一组电信号构成一个数据包,叫做‘帧’
2.每一数据帧分成:报头head和数据data两部分
head包含:(固定18个字节)
- 发送者/源地址,6个字节
- 接收者/目标地址,6个字节
- 数据类型(标签+以太类型),6个字节
data包含:(最短46字节,最长1500字节)
- 数据包的具体内容
head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
2.2 MAC 地址
规定了任何一台接入互联网的计算机都必须有一块网卡
每一块网卡上面都刻有世界上独一无二的编号
12位16进制数
前6位是厂商编号
后6位是流水线编号
我们管这12数叫mac地址
2.4 基于以太网协议通信
基于以太网协议通信
通信基本靠吼
广播
单播
广播风暴
交换机:
让局域网下连接了交换机的计算机实现彼此之间互联
局域网:
构成互联网的基本单位
ps:以太网协议不能跨局域网传输
广播:
有了mac地址,同一网络内的两台主机就可以通信了
ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼
交换机不仅负责让网络中的计算机能够互相通信,还要优化网络传输,
如何优化广播风暴呢?
当pc1想要与pc2通讯前
1.需要知道pc2的MAC地址,所以必须先将这个信息广播给所有的计算机,
2.这个信息必须先交给交换机,再由交换机广播出去,
3.pc2收到消息消息后发现目标MAC是自己,就回复数据给发送方,
4.而回复也必须先交给交换机,此时交换机就会记录pc2的MAC地址与网口号的对应关系存到自己的缓存中,
5.下一次在要给pc2发数据时从缓存中查找pc2的MAC地址,
6.如果找到了就直接单独给pc2发送,不在需要广播,
7.如果没有则重复之前的广播过程
这一优化功能称之为自动学习功能
三、网络层
3.1 网络层由来:
有了ethernet、mac地址、广播的发送方式,世界上的计算机就可以彼此通信了
3.2 以太网通讯存在的问题:
世界范围的互联网是由一个个彼此隔离的小的局域网组成的,如果所有的计算机都采用以太网的广播方式来寻找其他计算机,那么一台机器发送的包全世界都会收到,这就不仅仅是效率低的问题了,这会是一种灾难,(广播风暴就是这么产生的)
必须找出一种方法来区分哪些计算机属于同一广播域,哪些不是,如果是就采用广播的方式发送,如果不是,就采用路由的方式(向不同广播域/子网分发数据包),mac地址是无法区分的,它只跟厂商有关;
网络层功能:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址,网络地址到底长什么样,又是如何区分子网的?
Mac地址是用来标识你这个教室的某个位置,IP地址是用来标识你在哪个教室(哪个局域网)。你要跨网络发包你是不是要知道对方的IP地址,比如你要访问百度,你肯定得知道百度服务器的IP地址。计算机在发包前,会判断你在哪个教室,对方在哪个教室,如果在一个教室,基于Mac地址的广播发包就OK了;如果不在一个教室,即跨网络发包,那么就会把你的包交给教室负责人(网关)来转发。Mac地址及IP地址唯一标识了你在互联网中的位置
3.3 IP协议
IP协议是工作在网络层的协议,全称:Internet Protocol Address,翻译为互联网协议地址
规定了任何一台接入互联网的计算机都必须有一个IP地址
IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络
规定了只要是接入互联网的计算机都必须有一个IP地址
ip地址特点:点分十进制
ip地址最小:0.0.0.0
ip地址最大:255.255.255.255
ip地址目前有两个版本:IPV4 IPV6(由于IPV4已经不够表示目前存在的计算机了 所以推出了IPV6版本)
IP地址是动态分配的
3.4 arp协议
根据ip地址解析对方的mac地址
3.5 路由器
路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络(即局域网)
路由器具有判断网络地址和选择IP路径的功能
路由和交换机之间的主要区别就是交换机发生在OSI参考模型第二层(数据链路层),而路由发生在第三层,即网络层。两者实现各自功能的方式是不同的。
IP地址的分类: A类保留给政府机构 10.0.0.1 - 10.255.255.254 B类分配给中等规模公司 172.16.0.1 - 172.31.255.254 C类分配给任何需要的人 192.168.0.1 - 192.168.255.254 D类用于组播 E类用于实验 我们的电脑ip通常都是C类的,以192.168开头,正因为C类任何人都可以用
什么是子网掩码 子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。 它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。 为什么需要子网掩码 单纯的ip地址段只是标识了ip地址的种类,无法辨识一个ip所处的子网 例:192.168.10.1与192.168.10.2并不能确定二者处于同一子网,因为不清楚哪些位表示网络号,哪些表示主机号 子网掩码如何判断两个ip是否属于同一个子网 知道”子网掩码”,我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。 案例: 已知IP地址172.16.10.1和172.16.10.2的子网掩码都是255.255.255.0,请问它们是否在同一个子网络?两者与子网掩码分别进行AND运算, 172.16.10.1:10101100.00010000.00001010.000000001 255255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 172.16.10.2:10101100.00010000.00001010.000000010 255255.255.255.0:11111111.11111111.11111111.00000000 AND运算得网络地址结果:10101100.00010000.00001010.000000001->172.16.10.0 结果都是172.16.10.0,因此它们在同一个子网络。 总结一下,IP协议的作用主要有两个,一个是为每一台计算机分配IP地址,另一个是确定哪些地址在同一个子网络。
四、 传输层(重点)
传输层功能:建立端口到端口的通信
4.1传输层的由来:
通过物理层建立链接通道
IP地址,子网掩码,(网络层)可以定位到全球范围某一局域网
MAC(数据链路层),可以定位到某个局域网中的某台主机,
端口(port):用来唯一标识一台计算机上的某个应用程序
IP+PORT能够唯一标识一台计算机上的某一个应用程序
4.2 端口(port)
域名解析:我们访问的网站地址实质上都是端口,我们可以直接通过端口访问,但是太不好记就搞了个域名
www.baidu.com >>> 14.215.177.39:80
一台计算机上是不可能只运行一个应用程序的,比如同时登陆qq和微信,那接收到的数据到底是交给微信还是qq呢?
答案就是:端口号,端口是需要联网的应用程序与网卡关联的编号
端口:用来唯一标识一台计算机上的某个应用程序
端口号的范围:0~65535
注意:0~1024这些都是操作系统默认使用的端口号
建议:使用8000之后的端口
MySQL默认端口:3306
Redis默认端口:6379
django默认端口:8000
flask默认端口:5000
端口号是动态分配的
第一次起qq分配到的是8989
将qq关闭再次启动端口号可能就变了
4.3 TCP\UDP都是基于端口工作的协议
TCP类似于打电话
UDP类似于发短信
TCP协议:
流式协议,可靠协议
基于TCP协议通信 必选先建立双向通道
当应用程序想通过TCP协议实现远程通信时,彼此之间必须先先建立双向通信通道,基于该双向通道实现数据的远程交互,该双向通道直到任意一方主动断开才会失效
总结
其优点很明显:能够保证数据传输是完整的
缺点:由于每次都需要传输确认信息,导致传输效率降低
场景:多用于必须保证数据完整性的场景,例如文本信息,支付信息等!
TCP传输数据可靠的原因:
TCP协议传输数据之所以可靠的原因是就在于有双向通道么???如果你说是你就是个low比
UDP协议:
不可靠传输
UDP协议采取的方式与TCP完全不同,其根本不关心,对方是否收到数据,甚至不关心,对方的地址是否有效,只要将数据报发送到网络,便什么都不管了!
总结:
优点:由于不需要传输确认信息,所以传输效率高于TCP协议
缺点:传输数据可能不完整
场景:视频聊天,语音聊天等,不要求数据完整性,但是对传输速度要求较高
五、应用层
HTTP协议(https 的s就是女人的衣服,提高安全性)
FTP协议