网络编程
什么是网络编程?
编写基于网络的应用程序的过程称之为网络编程
一.CS构架
C/S构架 服务器和客户端之间用网线连接 提供数据的计算机称为服务器,访问数据的计算机称为客户端
二.网络通讯的基本要素
两台计算机想要通讯,必须具备两个基本要素
1.物理连接介质,包括网线,无线电,光纤等
2.通讯协议
三.网络通讯协议
OSI七层模型
1.什么是OSI?
开放式系统互联网通讯参考模型
OSI把整个通讯过程划分为七层,简称OSI七层模型
①应用层②表示层③会话层④传输层⑤网络层⑥数据链路层⑦物理层
①②③统称为应用层
物理层
物理连接介质
物理层的功能:基于电子器件发送电流信号,根据电流的高低可以对应到数字0和1,也就是二进制数据
数据链路层
单纯的电信号0和1没有任何意义,必须规定电信号多少位一组,每组什么意思
以太网协议:
一组电信号构成一个数据包,叫做帧
每一数据帧分成:报头head 和 data数据两部分
head包含:发送者/源地址(6字节),接受者/目的地址(6字节),数据类型(标签+以太类型)(6字节)
data包含:数据包的具体内容(56-1500字节)
MAC地址:源地址和目标地址
每个电脑必须由mac地址,它是全球唯一的
广播:有了mac地址同一网络内的两台主机就可以通讯了
广播太多会造成广播风暴 交换机会自动学习 会降低广播的次数
数据帧:head:源mac地址,目标mac地址 data:01001010
网络层
IP协议:规定网络地址的协议叫IP协议,它定义的地址称为IP地址 范围:0.0.0.0-255.255.255.255
一个IP地址通常写成四段十进制
子网掩码:任意两个IP地址是否属于同一子网络
ARP协议:通讯是基于mac的广播方式实现的.计算机在发包时,获取自身的mac是容易的,如何获取目标主机mac,就需要通过ARP协议.
数据报: 同一子网 :源IP 源MAC 目标的MAC 目标的IP 数据
不同子网 :源IP 源MAC 目标MAC 对方的网关地址 数据
传输层
工作在传输层的两个协议 TCP/UDP
网络层的IP帮我们区分了子网,以太网的mac帮我们找到了主机,如何识别主机上的应用程序,这就需要端口,端口即应用程序与网卡关联的编号.
传输层功能:建立端口与端口的通讯 端口范围:0-65535,0-1023为系统的占用端口
端口号在同一层计算机中不能重复
注意:不要使用常见的程序已经占用的端口 比如:apache 是8080,mysql是3306,FTP是21
这一堆网络协议 本质就是做两件事情:
1.如何找到对方
2.数据如何发送
Ip用来标识一个局域网中的一台电脑 端口用于标识某个应用程序 这样我们就可以准确定位到某个计算机中的某个程序
TCP是一种可靠的传输协议,可以保证数据传输是完整的
如何保证数据传输是完整的?
TCP在传输数据前 会经过一个三次握手的过程 来验证数据传输是否可靠
TCP三次握手解释:①客户端(client)先发一个数据syn=1 ②服务器(server)返回一个确认信息确信我收到了ack=2,然后给客户端发送一个数据syn=1 ③客户端返回一个确认信息 ack=2
连接是虚拟概念不实际存在
TCP四次挥手 断开连接:①客户端先发一个结束请求fin=1 ②服务器返回一个确认的信息表示我收到了ack=2 ③服务器思考了一段时间确认结束,给客户端发送一个结束请求fin=1 ③客户端返回一个确认信息表示我收到了ack=2
四次分手也是保证数据传输是完整的
在三次握手时,的确保证了数据传输是可靠,但是后续有可能由于种种原因例如网络中断,丢包等等,导致数据不完整
TCP的解决方案
每次发送数据报,都需要对方返回一个确认信息,如果一段时间后,对方没有返回,就重复发送,直到重试的次数超过某个指定的值,就判断连接已经丢失
TCP的优点: 可以保证数据完整性
缺点:由于需要接收确认信息,所以整体传输效率较低
四.socket
什么是socket?
socket是Python提供的一个模块,当然其他任何语言都有
用来处理网络传输相关的操作,其实就是封装了底层复杂,丑陋的TCP和UDP协议,对外提供简单优雅的使用接口
socket的作用:减少网络编程的工作量
如何使用?
默认使用的是TCP协议
cs构架的程序必然有客户端程序和服务端程序
为了同一方法,服务器和客户端使用的都是socket
socket服务器
import socket
#创建socket对象
server=socket.socket()
#作为服务器必须为socket指定ip和端口
server.bind(('192.168.12.207',4554))#明确饭店地址
server.listen() #监听端口,饭店们开了
#接受顾客的连接请求
client,address =server.accept()
#接受
data=client.recv(1024)
print(data.decode('utf-8'))
#发送
client.send('我是你的服务器'.encode('utf-8'))
#收发数据都是bytes类型,收发数据都是客户端的socket完成的,服务端的socket只做数据处理
#关闭socket 回收资源
server.close()
socket客户端
import socket
#创建socket对象
client=socket.socket()
#连接服务器 就是在做三次握手
client.connect(('192.168.12.207',4554))
#收发数据
client.send('你好'.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
#关闭连接 就是在做四次挥手
client.close()