网络编程
一、软件开发架构
C/S架构
- Client :客户端(24小时不间断提供服务)
- Server :服务端(客户需要服务时,就去访问服务端)
ps:服务端需要遵循的原则:
- 服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定
- 对外一直提供服务,稳定运行
- 服务端应该支持并发
比如:微信客户端,QQ客户端
- 优点:软件的使用稳定;节省网络资源
- 缺点:安装麻烦,用户体验差,软件的每一次更新,用户都需要重新下载或更新版本
B/S架构:
- Browser(本质上也是一个客户端): 浏览器
- Server: 服务端
比如: 在浏览器上输入一个 网址
-优点:软件的使用方便,无需跟着软件的更新去下载
-缺点:如果网络不稳定,软件的使用就不稳定
其中,比较流行的是B/S架构,用户体验高
二、网路基础
网路的建立目的是为了数据交互(通信)
早期的电话需要有电话线、后面的大屁股电脑需要插网线、再后来的智能手机电脑需要有网卡。
也就是说网络通信的第一步必须得先有物理连接介质
有了物理连接介质就能实现通信了吗
不同语言国家的人彼此之间打电话沟通,彼此都无法理解对方说了些什么,需要双方都精通对方的语言或者用一种全世界通用的语言进行沟通交流才可以解决。
回到计算机上,不同计算机之间要想实现无障碍的通信,除了物理连接介质以外,也应该有一套共用的标准,只有大家都按照这个标准来,计算机之间才能实现通信,这个标准我们叫它互联网协议!
网路:物理连接介质+互联网协议
三、互联网协议(OSI七层协议)
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层,重点关注tcp/ip五层协议
在这里插入图片描述
1.物理层:获取到对象计算机的电信号数据(高低电平)
如:0101010111
010: 你
1011: 爱
101: 我
问题: 无法获取具体数据内容,将电信号数据扔给数据链路层
2.数据链路层:
- 我要知道数据是什么?
- 我要知道数据是给谁的?
物理层接收到一长串010101如何切分取值,这个是数据链路层的里面的以太网协议
以太网协议:
它规定了0101的二进制电信号的分组方式,将电信号转成数据报。
数据报分为报头head和数据data两部分。head包含发送者,接收者和数据类型
但凡接入互联网的主机,必须有一块网卡。
网卡(用来标识全世界独一无二的一台计算机),每块网卡出厂时都会被烧制上一个全世界唯一的编号,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号),这些数称之为“mac地址”
“mac地址”作用:标识全世界上一台独一无二的计算机。
以太网协议的通信方式:单播和广播
弊端:广播风暴 只能在局域网内实现通信,无法跨局域网通信
在这里插入图片描述
3.网络层:实现全世界某一台计算机之间的通信
每台计算机都必须有一个ip地址(ip协议),其由点分十进制的数字组成,如 180.101.49.11
最小范围: 0.0.0.0
最大范围: 255.255.255.255
ip的作用: 用于表示全世界某一局域网的位置。
ip地址 + mac地址:标识全世界某一个局域网内的某一台计算机。
4.传输层:
TCP/UDP协议都是基于端口工作的协议
TCP:三次握手,四次挥手
-TCP协议建立双向通道。
优点:数据安全
缺点:传输速度慢,粘包
三次握手,建连接:
客户向服务端发送建立连接的请求
服务端返回收到请求的信息给客户端,并且同时发送往客户端建立连接的请求
客户端接收到服务端发来的请求,返回接收成功得信息给服务端,完成双向连接
总结:之所以称之为三次握手就是因为中间的 服务端的同意和请求 合并成了一次请求
ps:
反馈机制:
客户端往服务端发送请求,服务端必须返回响应,告诉客户端收到请求了,并且将服务端的数据一并返回给客户端。
C ----> S:一次请求,必须有一次响应。
四次挥手,断连接:
客户端由于已经没有任何需要发送给服务端的消息了,所以发起断开客户端到服务端的通道请求
服务端收到该请求后同意了 至此客户端到服务端的单项通道断开
服务端这个时候不会立刻朝客户端发器请求说那我也断开到你家的通道吧,服务端需要想想我手上还有没有需要发送给客户端的消息,如果还有的话,那我不能立马断开,先把数据发完才能断。服务端检查后发现没有数据需要发送了,再朝客户端发起断开服务端到客户端的通道请求
客户端同意该请求,至此四次挥手完成
总结:挥手必须是四次,中间的两次不能合并成一次,原因就在于需要检查是否还有数据需要给对方发送
UDP:称之为数据包协议。(了解)
特点:
-1)不需要建立链接
-2)不需要知道对方是否收到
-3)数据不安全,容易丢失
-4)传输速度快
-5)能支持并发
-6)不会粘包
-7)无需先启动服务端
优点:传输速度快,能支持并发,不会粘包
缺点:数据不安全,容易丢失
应用场景:早期的QQ聊天室
python实现网络通信:
server.py
import socket
socket.SOCK_DGRAM--->UDP协议
server = socket.socket(type=socket.SOCK_DGRAM)
服务端需要绑定一个地址,让别人知道你在哪里
server.bind(('127.0.0.1',9001)
while True:
#发送数据给服务端的用户地址
data,addr = server.recvfrom(1024)
print(addr)
print(data)
msg = input('服务端--->客户端:').encode('utf-8')
#无论服务端还是客户端,发送消息时,都必须知道对方是谁
server.sendto()
client.py
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
while True:
msg = input('客户端 --->服务端'