在用python编写网站或其他网络程序之前,需要学习基本的网络概念,以便更好地理解Python主流网络框架地原理以及运用。
目前较为主流地网络体系结构是ISO/OSI参考模型和TCP/IP协议簇。TCP/IP翻译为传输控制协议/互联网络协议(其中TCP是Transmission Control Protocol,传输控制协议;IP是Internet Protocol Address,互联网协议地址)。TCP/IP是Internet的基础协议,TCP/IP将网络分为应用层、传输层、网络层、链路层【还有一种五层的分法】
应用层协议:应用层的协议,其直接与最终用户交互,定义了运行在不同终端系统上的应用程序进程如何相互传递报文。下面是几种常见的应用层协议
1、远程登录协议(Telnet)
2、文件传输协议(FTP)
3、超文本传输协议(HTTP)
4、域名服务协议(DNS)
5、简单邮件传输协议(SMTP)
6、邮局协议(POP3)
其中,从网络上下载文件时使用的是FTP协议,上网游览网页时使用的是HTTP协议;在网络上访问一台主机时,通常不直接输入IP地址,而是输入域名,用的是DNS服务协议,它会将域名解析为IP地址;通过FoxMail发送电子邮件时,使用SMTP协议,接收电子邮件时就使用POP3协议。
传输层协议:TCP/IP的传输层包括两种协议传输控制协议TCP、用户数据报协议UDP。
TCP协议:面向连接的可靠传输协议。利用TCP进行通信时,首先要通过三步握手,以建立通信双方的连接。TCP提供了数据的确认和数据重传的机制,保证发送的数据一定能到达通信的对方。
第一次握手:客户端尝试连接服务器,向服务器发送 syn 包【(同步序列编号Synchronize Sequence Numbers),syn=j,】客户端进入 SYN_SEND 状态等待服务器确认。
第二次握手:服务器接收客户端syn包并确认(ack=j+1),同时向客户端发送一个 SYN包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态。
第三次握手:第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
UDP协议是无连接的,不可靠的传输协议。采用UDP进行通信时不用建立连接,可以直接向一个IP地址发送数据,但是不能保证对方是否能收到。UDP的信息包的标题很短只有8个字节开销小因此UDP能提供更快速、轻量级的传输层控制。
C/S架构是第一种比较早的软件架构,主要用于局域网内。也叫 客户机/服务器模式。
它可以分为客户机和服务器两层:
第一层: 在客户机系统上结合了界面显示与业务逻辑;
第二层: 通过网络结合了数据库服务器。
简单的说就是第一层是用户表示层,第二层是数据库层。
如python网络框架中Twisted就是主要面向C/S架构
1、C/S架构的优点:
1 C/S架构的界面和操作可以很丰富。(客户端操作界面可以随意排列,满足客户的需要)
2 安全性能可以很容易保证。(因为只有两层的传输,而不是中间有很多层。
3 由于只有一层交互,因此响应速度较快。(直接相连,中间没有什么阻隔或岔路,比如QQ,每天那么多人在线,也不觉得慢)
2、C/S架构的缺点:
1 适用面窄,通常用于局域网中。
2 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
3 维护成本高,发生一次升级,则所有客户端的程序都需要改变。
B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,
B/S是Web兴起后的一种网络结构模式。B/S使用Web浏览器作为客户端的应用软件,所以B/S可以看作C/S的一种特殊情况。python网络框架中Django、Flask就是主要面向B/S架构。主要特点
1, 跨平台、对客户端要求低:因为极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现,B/S架构的系统无须特别安装,只有Web浏览器即可。
2, 对安全性要求较高
3, 便于部署、维护、与升级
总而言之:B/C就是网站,C/S就是电脑上常用的客户端。
IP运行于网络体系结构的网络层,是网络互联的重要基础,IP地址主要用来标识网络上的主机,在公开网络上或同一个局域网内部,每一台主机都必须使用不同的IP。IP地址与端口号共同来标识网络上特定主机上的特定应用进程,俗称Socket。特殊的IP地址:127.0.0.1(本地回环地址、保留地址,点分十进制)。
Socket通常被称作套接字,是Windows、Mac等操作系统所共同遵守的网络编程标准,可以用来实现不同计算机之间的通信,当然也可以实现相同主机内的不同进程间通信。
Socket的方法socket.socket(family, type)建立Socket对象.
参数:
family:AF_INET服务器之间的通信(默认)、AF_UNIX在unix中进程之间的进程;
链接方式type:SOCK_STREAM(TCP默认)/SOCK_Dgrm(UDP)
Socket对象方法
1. bind((host,port))绑定端口和ip地址,端口必须是未被占用的端口
2. listen(num)监听,只允许在服务端使用,。允许排队的最大数量
3. connect((host,port))在客户端连接服务器
4. accept()调用阻塞等待客户端连接
5. send发送数据,只能发送bytes类型数据,通过send()的返回值。
6. recv()接受数据
7. close()关闭连接。
TCP服务器端的构建步骤:
1. 建立socket对象
2. 绑定IP端口
3. 确定监听数量
4. 等待客户连接
5. 发送或接受数据
6. 关闭socket
TCP客户端的构建步骤
1. 建立socket对象
2. 连接服务器
3. 收发数据
4. 关闭socket
示例服务器端
import socket
sk=socket.socket()
address=(“127.0.0.1”,7000)
sk.bind(address)
sk.listen(3)
while True:
con, addr = sk.accept()
while True:
try:
data=con.recv(1024)
except Exception:
break
else:
print(str(data,”utf8”))
if not data:break
str1=input(“>>>”)
if str1 == “exit”:
break
con.send(bytes(str1,”utf8”))
sk.close()
示例客户端
import socket
sk=socket.socket()#参数与服务端相同
print(sk)
address=("127.0.0.1",7000)#127.0.0.1回环地址代表本机地址
sk.connect(address)
while True:
str1=input(">>>")
if str1 == "exit":
break
sk.send(bytes(str1,"utf8"))
data=sk.recv(1024)#接收最大8k
if not data: break
print(str(data,"utf8"))
sk.close()
并发聊天示例
import socketserver
class MyServer(socketserver.BaseRequestHandler):#继承
def handle(self):#重写handle,根据需求设计逻辑
print ("服务端启动...")
while True:
conn = self.request#客户端sk
print (self.client_address)
while True:
client_data=conn.recv(1024)
print (str(client_data,"utf8"))
print ("waiting...")
server_response=input(">>>")
conn.sendall(bytes(server_response,"utf8"))
# conn.sendall(client_data)
conn.close()
# print self.request,self.client_address,self.server
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1',8098),MyServer)#多线程的并发效果
server.serve_forever()#启动
UDP没有建立连接、断开连接等概念。UDP可以复用TCP中socket()和bind()原语。UDP还有属于自己的原语
UDP服务端示例
import socket
HOST='127.0.0.1'
PORT=8090
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((HOST,PORT))
while True:
data,addr=s.recvfrom(1024)
print(data,'来自',addr)
s.close()
客户端
import socket
HOST='127.0.0.1'
PORT=8090
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
data='my name is udp'
s.sendto(data,(HOST,PORT))
s.close()
网络协议是计算机进行数据交换建立的规则、标准或约定的集合网络协议的三要素分别语义(做什么)、语法(怎么做)、时序(事件出现顺序)
在网络技术中,端口(Port)大致有两种意思:一是物理意义上的端口。二是逻辑意义上的端口,一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。我们这里将要说明的就是逻辑意义上的端口。当然也不是要介绍计算机硬件的I/O端口,而是软件形式上的概念.端口是网络的寻址方式。工具提供服务类型的不同,端口分为两种,一种是TCP端口,一种是UDP端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用TCP协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用UDP协议。对应这两种协议的服务提供的端口,也就分为TCP端口和UDP端口。值得注意的是一般端口是不允许共用的,但TCP与UDP在同一主机上可以使用相同的端口。
“域名可以简单理解为通往你网站的路,简称域名、网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)通常由一串字符和后缀组成,常见的后缀有:com、net、cn。最常见的域名如:www.baidu.com。最低级别的域名写在最左边。
统一资源定位符。URL的标准形式:
[协议]://[主机]:[端口]/[路径]?参数