Python_网络编程
UDP总结
使用udp发送/接收数据步骤:
1.创建客户端套接字
2.发送/接收数据
3.关闭套接字
import socket def main(): # 创建udp套接字 # socket.AF_INET 表示IPv4协议 AF_INET6 表示IPv6协议 socket.SOCK_DGRAM 数据报套接字,只要用于udp协议 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 准备接收方的地址 # 元组类型 ip是字符串类型 端口号是整型 dest_addr = ('192.168.113.111', 8888) # 要发送的数据 send_data = "我是要发送的数据" # 发送数据 udp_socket.sendto(send_data.encode("utf-8"), dest_addr) # 等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据 # 接收到的数据是一个元组 (接收到的数据, 发送方的ip和端口) # 1024 表示本次接收的最大字节数 recv_data, addr = udp_socket.recvfrom(1024) # 关闭套接字 udp_socket.close() if __name__ == '__main__': main()
编码的转换
str -->bytes: encode编码
bytes--> str: decode()解码
UDP绑定端口号:
1.创建socket套接字
2.绑定端口号
3.接收/发送数据
4.关闭套接字
import socker def main: # 1、创建udp套接字 # socket.AF_INET 表示IPv4协议 AF_INET6 表示IPv6协议 # socket.SOCK_DGRAM 数据报套接字,只要用于udp协议 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2、绑定端口 # 元组类型 ip一般不写 表示本机的任何的一个ip local_addr = ('', 7777) udp_socket.bind(local_addr) # 3、准备接收方的地址 # 元组类型 ip是字符串类型 端口号是整型 dest_addr = ('192.168.113.111', 8888) # 要发送的数据 send_data = "我是要发送的数据" # 4、发送数据 udp_socket.sendto(send_data.encode("utf-8"), dest_addr) # 5、等待接收方发送的数据 如果没有收到数据则会阻塞等待,直到收到数据 # 接收到的数据是一个元组 (接收到的数据, 发送方的ip和端口) # 1024 表示本次接收的最大字节数 recv_data, addr = udp_socket.recvfrom(1024) # 6、关闭套接字 udp_socket.close() if __name__ == '__main__': main()
怎么实现强行关闭客户端和服务器之间的连接?
在socket通信过程中不断循环检测一个全局变量(开关标记变量),一旦标记变量变为关闭,则 调
用socket的close方法,循环结束,从而达到关闭连接的目的。
简述TCP和UDP的区别以及优缺点?
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息。
优点:UDP速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送
缺点:UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数
据是否会正确接收,也不重复发送,不可靠。
TCP是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手
优点:TCP在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。
缺点:TCP相对于UDP速度慢一点,要求系统资源较多。
简述浏览器通过WSGI请求动态资源的过程?
1.发送http请求动态资源给web服务器 2.web服务器收到请求后通过WSGI调用一个属性给应用程序框架 3.应用程序框架通过引用WSGI调用web服务器的方法,设置返回的状态和头信息。 4.调用后返回,此时web服务器保存了刚刚设置的信息 5.应用程序框架查询数据库,生成动态页面的body的信息 6.把生成的body信息返回给web服务器 7.web服务器吧数据返回给浏览器
描述用浏览器访问www.baidu.com的过程
先要解析出baidu.com对应的ip地址
要先使用arp获取默认网关的mac地址
组织数据发送给默认网关(ip还是dns服务器的ip,但是mac地址是默认网关的mac地址)
默认网关拥有转发数据的能力,把数据转发给路由器
路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
目的网关(dns服务器所在的网关),把数据转发给dns服务器
dns服务器查询解析出baidu.com对应的ip地址,并原路返回请求这个域名的client
得到了baidu.com对应的ip地址之后,会发送tcp的3次握手,进行连接
使用http协议发送请求数据给web服务器
web服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
浏览器关闭tcp连接,即4次挥手结束,完成整个访问过程
说说HTTP和HTTPS区别
HTTP 协议传输的数据都是未加密的,也就是明文的,因此使用HTTP 协议传输隐私信息非常不安
全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于
对HTTP 协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP 协
议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP 的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP 协议构建的可进行加密传输、
身份认证的网络协议,比http协议安全。
简述 OSI 七层协议。
物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
数据链路层:定义了电信号的分组方式
网路层:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址
传输层:建立端口到端口的通信
会话层:建立客户端与服务端连接
表示层:对来自应用层的命令和数据进行解释,按照一定格式传给会话层。如编码、数据格式转换、加密解密、压缩解压
应用层:规定应用程序的数据格式
什么是C/S和B/S架构?
c/s架构,就是client(客户端)与server(服务端)即:客户端与服务端的架构。
b/s架构,就是brosver(浏览器端)与sever(服务端)即:浏览器端与服务端架构
优点:统一了所有应用程序的入口、方便、轻量级
简述浏览器访问HTTP服务器的过程。
1. 用户输入网址.
2. 浏览器请求DNS服务器, 获取域名对应的IP地址.
3. 请求连接该IP地址服务器.
4. 发送资源请求. (HTTP协议)
5. web服务器接收到请求, 并解析请求, 判断用户意图.
6. 获取用户想要的资源.
7. 将资源返回给web服务器程序.
8. web服务器程序将资源数据通过网络发送给浏览器.
9. 浏览器解析请求的数据并且完成网页数据的显示.
简述 三次握手、四次挥手的流程。
三次握手:
第一次握手
1:客户端先向服务端发起一次询问建立连接的请求,并随机生成一个值作为标识
第二次握手
2:服务端向客户端先回应第一个标识,再重新发一个确认标识
第三次握手
3:客户端确认标识,建立连接,开始传输数据
四次挥手 ---> 断开连接
第一次挥手
客户端向服务端发起请求断开连接的请求
第二次挥手
服务端向客户端确认请求
第三次挥手
服务端向客户端发起断开连接请求
第四次挥手
客户端向服务端确认断开请求
TCP和UDP的区别?
TCP/UDP区别
TCP协议是面向连接,保证高可靠性传输层协议
UDP:数据丢失,无秩序的传输层协议(qq基于udp协议)
为何基于tcp协议的通信比基于udp协议的通信更可靠?
tcp:可靠,因为只要对方回了确认收到信息,才发下一个,如果没收到确认信息就重发
UDP:不可靠,它是一直发数据,不需要对方回应
流式协议: TCP协议,可靠传输
数据报协议: UDP协议,不可传输
什么是socket?简述基于tcp协议的套接字通信流程
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面, 对用户来说,一组简单的接口就是全部。 服务端: 创建socket对象, 绑定ip端口bind(), 设置最大链接数listen(), accept()与客户端的connect()创建双向管道,等到联接, send(), recv(), 收发数据 close() 客户端: 创建socket对象, connect()与服务端accept()创建双向管道 , send(), recv(), close()
什么是粘包? socket 中造成粘包的原因是什什么? 哪些情况会发生粘包现象?
只有TCP有粘包现象,UDP永远不会粘包
粘包:在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,
我方接收时,应该收两次,一次是hello,一次是world,但事实上是一次收到helloworld,一次收到空,这种现象叫粘包
原因
粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
什么情况会发生:
1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)
2、接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,
服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)
简述 进程、线程、协程的区别 以及应用场景?
线程是指进程内的一个执行单元,
# 进程
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
# 线程
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度
# 协程和线程
协程避免了无意义的调度,由此可以提高性能;但同时协程也失去了线程使用多CPU的能力
进程与线程的区别
(1)地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是
(4)二者均可并发执行
(5)每个独立的线程有一个程序运行的入口
协程与线程
(1)一个线程可以有多个协程,一个进程也可以单独拥有多个协程,这样Python中则能使用多核CPU
(2)线程进程都是同步机制,而协程是异步
(3)协程能保留上一次调用时的状态
GIL锁是什么?
GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。
GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理
Python中如何使用线程池和进程池
进程之间如何进行通信
现在最常用的进程间通信的方式有信号、信号量、消息队列、共享内存。所谓进
程通信,就是不同进程之间进行一些“接触”。这种接触有简单,也有复杂。机制不同,复杂
度也不一样。通信是一个广义上的意义,不仅仅指传递一些message。它们的使用方法是基
本相同的,所以只要掌握了一种使用方法,然后记住其他的使用方法就可以了。信号和信号
量是不同的,它们虽然都可用来实现同步和互斥,但前者是使用信号处理器来进行的,后者
是使用P、V操作来实现的。消息队列是比较高级的一种进程间通信方法,因为它真的可以
在进程间传送message,连传送一个“I seek you”都可以。
一个消息队列可以被多个进程所共享(IPC就是在这个基础上进行的);如果一个进程
的消息太多,一个消息队列放不下,也可以用多于一个的消息队列(不过可能管理会比较复
杂)。共享消息队列的进程所发送的消息中除了message本身外还有一个标志,这个标志可
以指明该消息将由哪个进程或者是哪类进程接受。每一个共享消息队列的进程针对这个队列
也有自己的标志,可以用来声明自己的身份。
如何修改本地hosts件?
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,
当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,
一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
浏览器访问网站,要首先通过DNS服务器把要访问的网站域名解析成一个唯一的IP地址,之后,浏览器才能对此网站进行定位并且访问其数据。
文件路径:C:\WINDOWS\system32\drivers\etc。
将127.0.0.1 www.163.com 添加在最下面
修改后用浏览器访问“www.163.com”会被解析到127.0.0.1,导致无法显示该网页。