我们学习网络编程的目的是为了开发C/S架构或者B/S架构的软件
Client-------Server # C/S架构,由客户端和服务端组成
数据放在服务端和客户端的利与弊
- 服务端统一处理有更好的安全性和稳定性而且升级比较容易,不过服务器负担就增加了。
- 客户端将负担分配到每个用户,从而可以节约服务器资源,安全性和稳定性可能会有一定的问题,但是升级比较麻烦,每个安装的客户端程序都需要升级,另外为了节省网络资源,通过网络传输的数据应该尽量减少!
Browser-------WEB Server-------Database Server # B/S架构,
- 统一客户端即默认安装用户电脑中的浏览器,访问同种类的网站,具体业务的处理根据相应协议和标准提供通用的服务器程序,在不同的服务器处理。
我们知道,一个完整的计算机系统是由硬件、操作系统、软件三者组成,一台计算机系统就可以自己跟自己玩了,如果你想和别人一起玩,那就需要用到互联网了。
什么是互联网,互联网的核心技术由一堆协议组成,这个协议叫做OSI协议,按照功能不同,分为七层,但实际上七层只是一个概念,实际上并不存在,所以有人将它划成七层,还有人将它划成五层、四层
物理传输,用物理设备(网线,光纤)连接,传输的是电信号,发送高低电压,高电压对应数字1,低电压对应数字0
单纯的电信号0和1没有任何意义,而数据链路层的功能介绍定义了电信号的分组方式,规定了电信号多少位一组,每组是什么意思
以太网协议ethernet
ethernet规定:一组电信号构成一个数据报,叫做'帧',每一数据帧分成:报头(head)和数据(data)两部分
head包含:(固定18个字节)
发送者/源地址,6个字节
接收者/目标地址,6个字节
数据类型,6个字节
data包含:(最短46字节,最长1500字节)
数据报的具体内容:head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送
这就像写信,发送者的地址(源地址)就是你家的地址,接收者地址(目标地址)就是对方的收信地址,你家的路由器就相当于邮局。其实在计算机通信中的源地址和目标地址指的是Mac地址。
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另外一台主机的mac地址)
ethernet采用最原始的方式,广播的方式进行通信,即计算机通信基本靠吼,具体请百度
有了物理和数据链路层,其实就可以实现互联网通信啦,但是通信范围很小,大概就是一个教室,那如何扩大范围,进行跨局域网通信,这就要经过网络层,网络层实体代表:路由器。
规定网络地址的协议,广泛采用的v4版本即ipv4,范围:0.0.0.0-255.255.255.255
ip地址分为 网络部分:标识子网,主机部分:标识主机
就是表示子网络特征的一个参数,用于判断任意两个IP地址是否处在同一个子网络
ip和mac的对照表
0--65535,一个应用程序可以监听多个端口,但是一个端口只能属于一个应用程序
应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL 熟知端口 21,20 69 23 25 53 80 22 3306 传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP DNS:把网址转换成ip地址
从浏览器发送出去的数据,都是http协议,默认是80端口
1 tcp可靠传输:三次握手,四次挥手保证数据可靠
2 三次握手
-客户端向服务端发送链接请求 # 第一次
-服务端回复可以建立,并且带着跟客户端建立链接的数据报 # 第二次
-客户端收到后,链接建好了 # 第三次3 这个过程后就可以可靠传输数据
4 断开链接(4四挥手)
-客户端告诉服务端,要断开 # 第一次
-服务端收到,回复ok # 第二次
-服务端可能还有数据在传递,暂时还没断开,需要等数据传完
-服务端告诉客户端,我要断了 # 第三次
-客户端收到,回复ok # 第四次
现在基本用不上了,略
htpp协议,ftp协议,websocket协议
1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关,任何语言都会有socket的封装
2 专门给开发人员用的
# 导入socket模块 import socket import time # 第一个socket是模块名,第二个socket是类名 #类实例化得到对象,得到一个socket对象 # server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM) #不写默认就是他 server=socket.socket() # 绑定地址跟端口 ,传一个元组,监听的地址,监听的端口 server.bind(('192.168.11.28',8008)) #监听 # 半连接池是5,可以缓冲5个 server.listen(5) #等待用户连接(看源码,有两个返回结果) # sock是连接对象,以后这个服务端和客户端交互,使用这个对象交互 # addr是客户端地址(ip和端口) sock,addr=server.accept() # 接收客户端发给我的消息 data=sock.recv(1024) # 打印 print(data) #服务端给客户端发送消息(必须是byte格式) sock.send(b'helloworld') time.sleep(1) # 关闭连接对象 sock.close() #关闭服务 server.close()
import socket # 创建socket对象 client=socket.socket() # 连接服务端 client.connect(('127.0.0.1',8008)) #给服务端发了一个sb client.send(b'sb') # 收到了服务端给我的 data=client.recv(1024) print(data) # 关闭 client.close()