某个设备上的应用怎么跟其他设备进行交换,这就是这次的内容。
要学习这次内容,我们需先了解OSI七层网络模型、TCP/IP三次握手、UDP
1、OSI七层网络模型、TCP/IP、三次握手、UDP
我们大部分开发软件和系统都属于应用层的范畴
TCP三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
SYN:同步序列编号(Synchronize Sequence Numbers)
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手.
UDP
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。
2、Socket套接字
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口
Socket套接字是处在应用层和运输层之间的,能够帮我们抽象出TCP或UDP的协议,能够帮我们指定IP地址的端对端的发送。
用户进程(应用程序)是通过创建一个Socket端口,然后才能与网络进行通信,去连接到网络上其他的用户进程。
python提供了socket模块、socketserver模块
服务端与客户端在网络上交换数据时,都需要创建Spcket才能进行数据交换。Socket也分为服务端Socket和客户端Socket
,
3、TCP/IP协议、各层次通信协议简图
4、B/S架构和C/S架构
S: Sever 服务端
CS: Client/Server(客户机/服务器)结构
BS: Browser/Server(浏览器/服务器)结构
标准网络编程用的都是C/S架构,比如QQ、微信、端游
B/S 浏览器:ie,火狐,谷歌(Google Chrome)
B/S架构减轻了工作量,但是B/S架构只能在浏览器,http协议,html等等这一系列标准下去运行,做一些特殊处理是有一定的障碍,而且有一些私有化数据的安全性要求的话,浏览器更容易被攻破。所以更需要一些安全漏洞的检查。但是B/S架构的优点还是远远大于缺点的,所以应用广泛。
5、TCP和UDP
都是传输协议
服务端server& 客户端client
服务端一般就是装在机房里的服务器,客户端就是装在自己电脑和手机上的应用程序。
TCP是安全的,或者说传输相对UDP是安全的,它经过三次握手之后这个链接是可以被信任的,确保客户端和服务端的通信时可以完成的。
UDP就是相当于我就对着你扔出去一些消息,你不需要告诉我你收没收到,所以这个连接相对来说是不安全的,也就是说客户端发送给服务端的消息,你收没收到,客户端是不管的。
所以要根据不同的应用场景来选择不同的传输协议,若更在意系统的性能,对收没收到消息反而不是很在意,此时就应该选择UDP。
如果是局域网,可以用UDP来做一些应用;互联网的话还是使用TCP。
TCP的Server端和Client端
TCP建立链接的一些要求,有发就有收,收发必须相等
Client事先知道Server的ip地址和端口
6、Python网络编程模块
socket、 socketserver
服务器端要先运行
1、将小写转化为大写
服务端
import socket # 引入socket模块
hostaddress = ("127.0.0.1", 8888) # 定义本机地址,端口,IP地址代表一台服务器,端口号代表运行在终端上的某一个应用程序
# 使用ipv4,使用TCP协议
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个socket对象
sk.bind(hostaddress) # 绑定
sk.listen(5) # 监听,默认是1
print("启动socket服务,等待客户端连接...")
conn, clientaddress = sk.accept() # 阻塞状态,等到客户端一个连接的对象
# bytes 字节数组
data = conn.recv(1024).decode() # 接受客户端发来的内容,长度,decode方法转化为字符串
print("接收到客户端 %s 发送来的信息 : %s" % (clientaddress, data))
res = data.upper() # 发来的字母转换为全大写
# str
conn