Django学习笔记--网络基础与socket编程基本介绍

文章目录

  • 前言
  • 网络基础
    • TCP/IP网络
      • 对TCP/IP从上到下说明
    • UDP协议
    • C/S架构和B/S架构
      • C/S
      • B/S
    • IP
  • Socket编程
  • TCP原语
      • 使用
    • UDP原语
  • 概念补充:
    • 网络·协议:
    • 端口:
    • 域名
    • URL

前言

在用python编写网站或其他网络程序之前,需要学习基本的网络概念,以便更好地理解Python主流网络框架地原理以及运用。

网络基础

TCP/IP网络

目前较为主流地网络体系结构是ISO/OSI参考模型和TCP/IP协议簇。TCP/IP翻译为传输控制协议/互联网络协议(其中TCP是Transmission Control Protocol,传输控制协议;IP是Internet Protocol Address,互联网协议地址)。TCP/IP是Internet的基础协议,TCP/IP将网络分为应用层、传输层、网络层、链路层【还有一种五层的分法】

Django学习笔记--网络基础与socket编程基本介绍_第1张图片

对TCP/IP从上到下说明

  1. 应用层:为用户的进程直接提供服务,应用层负责发送、接收、解释、呈现、加密数据,网络应用程序开发者重点打交道对象。
  2. 传输层:为两个主机的不同端口之间的通信提供服务。传输层的发送方与接收方无须相邻。
  3. 网络层:为两个主机之间提供通信服务,网络层定义数据如何被封装为传送包,并且,并且定义了不同主机之间的寻址方式。主要由IP组成
  4. 接口层:处理物理细节,开发者无须关心。

应用层协议:应用层的协议,其直接与最终用户交互,定义了运行在不同终端系统上的应用程序进程如何相互传递报文。下面是几种常见的应用层协议
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提供了数据的确认和数据重传的机制,保证发送的数据一定能到达通信的对方。
Django学习笔记--网络基础与socket编程基本介绍_第2张图片
第一次握手:客户端尝试连接服务器,向服务器发送 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协议是无连接的,不可靠的传输协议。采用UDP进行通信时不用建立连接,可以直接向一个IP地址发送数据,但是不能保证对方是否能收到。UDP的信息包的标题很短只有8个字节开销小因此UDP能提供更快速、轻量级的传输层控制。

C/S架构和B/S架构

C/S

C/S架构是第一种比较早的软件架构,主要用于局域网内。也叫 客户机/服务器模式。
它可以分为客户机和服务器两层:
第一层: 在客户机系统上结合了界面显示与业务逻辑;
第二层: 通过网络结合了数据库服务器。
简单的说就是第一层是用户表示层,第二层是数据库层。
如python网络框架中Twisted就是主要面向C/S架构

1、C/S架构的优点:
	1 C/S架构的界面和操作可以很丰富。(客户端操作界面可以随意排列,满足客户的需要)
	2 安全性能可以很容易保证。(因为只有两层的传输,而不是中间有很多层。
	3 由于只有一层交互,因此响应速度较快。(直接相连,中间没有什么阻隔或岔路,比如QQ,每天那么多人在线,也不觉得慢)
2、C/S架构的缺点:
	1 适用面窄,通常用于局域网中。
	2 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
	3 维护成本高,发生一次升级,则所有客户端的程序都需要改变。

B/S

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。IP地址与端口号共同来标识网络上特定主机上的特定应用进程,俗称Socket。特殊的IP地址:127.0.0.1(本地回环地址、保留地址,点分十进制)。

Socket编程

Socket通常被称作套接字,是Windows、Mac等操作系统所共同遵守的网络编程标准,可以用来实现不同计算机之间的通信,当然也可以实现相同主机内的不同进程间通信。

TCP原语

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没有建立连接、断开连接等概念。UDP可以复用TCP中socket()和bind()原语。UDP还有属于自己的原语

  • recvfrom()从绑定的地址接收数据
  • sendto((host,port)):向指定地址发送数据

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

统一资源定位符。URL的标准形式:

[协议]://[主机]:[端口]/[路径]?参数

你可能感兴趣的:(Django)