网络(50-77)

50、谈谈你对多进程,多线程,以及协程的理解,项目是否有用?

'''
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最
小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。

线程:  调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。

协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存
器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切
换非常快。
'''

51、什么死锁?

若干子线程在系统资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁,互相干等着,程序无法执行下去,这就是死锁。
GIL锁(有时候,面试官不问,你自己要主动说,增加b格,尽量别一问一答的尬聊,不然最后等到的一句话就是:你还有什么想问的么?)
GIL锁 全局解释器锁(只在cpython里才有)
作用:限制多线程同时执行,保证同一时间只有一个线程执行,所以cpython里的多线程其实是伪多线程!
所以Python里常常使用协程技术来代替多线程,协程是一种更轻量级的线程,
进程和线程的切换时由系统决定,而协程由我们程序员自己决定,而模块gevent下切换是遇到了耗时操作才会切换。
三者的关系:进程里有线程,线程里有协程。

52、什么时线程安全,什么时互斥锁?

每个对象都对应于一个可称为" 互斥锁"的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
同一个进程中的多线程之间是共享系统资源的,多个线程同时对一个对象进行操作,一个线程操作尚未结束,
另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁,保证每个线程对该对象的操作都得到正确的结果。

53、同步,异步,阻塞,非阻塞概念?

同步:多个任务之间有先后顺序执行,一个执行完下个才能执行。
异步:多个任务之间没有先后顺序,可以同时执行有时候一个任务可能要在必要的时候获取另一个同时执行的任务的结果,这个就叫回调!
阻塞:如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了。
非阻塞:如果不会卡住,可以继续执行,就是说非阻塞的。
同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言。

54、什么是僵尸进程和孤儿进程?怎么避免僵尸进程?

孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被 init 进程(进程号为 1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:
        在子进程结束后,主进程没有正常结束, 子进程PID不会被回收。危害:致系统不能产生新的进程
        - 操作系统中的PID号是有限的,如有子进程PID号无法正常回收,则会占用PID号。
        - 资源浪费。
        - 若PID号满了,则无法创建新的进程。

避免僵尸进程的方法:
-fork两次用孙子进程去完成子进程的任务;
-用wait()函数使父进程阻塞;
-使用信号量,在 signal handler 中调用waitpid,这样父进程不用阻塞。

55、进程与线程的使用场景?

多进程适合在 CPU 密集型操作(cpu 操作指令比较多,如位数多的浮点运算)。
多线程适合在 IO 密集型操作(读写数据操作较多的,比如爬虫)。

56、线程是并发还是并行?进程是并发还是并行?

线程是并发,进程是并行;
进程之间相互独立,是系统分配资源的最小单位,同一个线程中的所有线程共享资源。

57、UDP协议?

UDP协议又叫:数据报协议(自带报头)
	1.数据报协议(自带报头)
	2.没有双向通道
	3.也没有半连接池
发送数据就类似发短信,给指定的IP,port发送,不用管对方有没有收到
​ 缺点:容易数据丢失,不安全
​ 优点:速度快

58、UDP协议使用方式?

type=socket.SOCK_DGRAM

# 服务端
import socket

server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议
server.bind(('127.0.0.1', 8080))   # 绑定自己的地址端口


while True:
    data, addr = server.recvfrom(1024)  # 接收
    print('接收到数据:', data)
    print('地址:', addr)
    server.sendto(data.upper(), addr)   # 发送
    

# 客户端
import socket

client = socket.socket(type=socket.SOCK_DGRAM)

server = ('127.0.0.1', 8080)  # 要发送的地址端口
while True:
    client.sendto(b'hello', server)  # 发送
    data, addr = client.recvfrom(1024)   # 接收
    print(data)  # 打印

59、UDP创建流程?

1.创建UDP的socket套接字对象
2.绑定端口号
3.接收/发送数据
4.关闭套接字

60、TCP客户端创建流程?

1.创建TCP客户端的socket的套接字对象
2.连接服务器
3.发送数据给服务端
4.接收服务端发来的数据
5.关闭套接字

61、TCP服务端创建流程?

1.创建TCP服务端的socket对象
2.bing绑定ip地址和端口号
3.listen半连接池
4.accept接收连接
5.接收/发送数据
6.关闭套接字

62、TCP连接

服务端:
import socket

server = socket.socket()  # 生成对象
server.bind(('127.0.0.1', 8080))  # 绑定IP和端口 (自己的)
server.listen(5)  # 半连接池,允许等待数

conn, addr = server.accept()  # 等待接听
# conn:地址 addr:端口号(随机分配)

while True:
    data = conn.recv(1024)  # 接收
    print(data)  # 打印接收的内容
    # 判断如果接收的是空,就跳出循环
    if len(data) == 0:
        break
    conn.send(data.lower())  # 发送反馈内容
   
   
客户端:
import socket

client = socket.socket()  # 生成对象
client.connect(('127.0.0.1', 8080))  # 拨号,对方IP和端口

while True:
    msg = input('请输出 >>>:').strip().encode('utf-8')  # 转二进制
    if len(msg) == 0:
        continue
    client.send(msg)  # 发送
    data = client.recv(1024)  # 接收反馈内容
    print(data)

63、简述浏览器通过WSGI请求动态资源的过程?

'''
1.发送http请求动态资源给web服务器
2.web服务器收到请求后通过WSGI调用一个属性给应用程序框架
3.应用程序框架通过引用WSGI调用web服务器的方法,设置返回的状态和头信息。
4.调用后返回,此时web服务器保存了刚刚设置的信息
5.应用程序框架查询数据库,生成动态页面的body的信息
6.把生成的body信息返回给web服务器
7.web服务器吧数据返回给浏览器
'''

64、描述用浏览器访问www.baidu.com的过程

1.浏览器向DNS服务器发出解析域名的请求;
2.DNS服务器将"www.baidu.com"域名解析为对应的IP地址,并返回给浏览器;
3.浏览器与百度服务器进行三次握手,建立TCP连接;
4.浏览器发出HTTP请求报文;
5.服务器回复HTTP响应报文;
6.浏览器解析响应报文,渲染HTML内容,并显示在页面上;
7.收发报文结束,释放TCP连接,执行四次挥手。

65、POST和GET请求?

GET请求:1.向服务要数据。
		2.数据暴露在URL之后,关键数据不安全
		3.浏览器对url有长度限制
		
POST请求:1.向服务器提交数据。
		 2.数据放在HTTP包中,数据安全比GET请求高
		 3.理论上大小不受限制,实际上各个服务器会规定对post提交数据大小进行限制。Apache、IIS等
        
效率:GET>POST

66、POST和GET请求过程?

'''
POST请求的过程:
  1.浏览器请求tcp连接(第一次握手)
  2.服务器答应进行tcp连接(第二次握手)
  3.浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行
第一次数据发送)
  4.服务器返回100 continue响应
  5.浏览器开始发送数据
  6.服务器返回200 ok响应
GET请求的过程:
    1.浏览器请求tcp连接(第一次握手)
    2.服务器答应进行tcp连接(第二次握手)
    3.浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时
进行第一次数据发送)
    4.服务器返回200 OK响应
'''

67、cookie和session?

涉及到用户安全:cookie和session。。。还有token

'''
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使
用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服
务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在cookie中
'''

68、HTTP协议状态码

'''
通过状态码告诉客户端服务器的执行状态,以判断下一步该执行什么操作。
常见的状态机器码有:
100-199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。
200-299:表示服务器成功接收请求并已完成处理过程,常用200(OK请求成功)。
300-399:为完成请求,客户需要进一步细化请求。302(所有请求页面已经临时转移到新的url)。
 304、307(使用缓存资源)。
400-499:客户端请求有错误,常用404(服务器无法找到被请求页面),403(服务器拒绝访问,
权限不够)。
500-599:服务器端出现错误,常用500(请求未完成,服务器遇到不可预知的情况)。
'''

69、说一下什么是tcp的2MSL?

'''
主动发送fin关闭的一方,在4次挥手最后一次要等待一段时间我们称这段时间为2MSL
TIME_WAIT状态的存在有两个理由:
1.让4次挥手关闭流程更加可靠
2.防止丢包后对后续新建的正常连接的传输造成破坏
'''

70、为什么客户端在TIME-WAIT状态必须等待2MSL的时间?

'''
1、为了保证客户端发送的最后一个ACK报文段能够达到服务器。 这个ACK报文段可能丢失,
因而使处在LAST-ACK状态的服务器收不到确认。服务器会超时重传FIN+ACK报文段,客户端就
能在2MSL时间内收到这个重传的FIN+ACK报文段,接着客户端重传一次确认,重启计时器。最
好,客户端和服务器都正常进入到CLOSED状态。如果客户端在TIME-WAIT状态不等待一段时间,
而是再发送完ACK报文后立即释放连接,那么就无法收到服务器重传的FIN+ACK报文段,因而也
不会再发送一次确认报文。这样,服务器就无法按照正常步骤进入CLOSED状态。
2、防止已失效的连接请求报文段出现在本连接中。客户端在发送完最后一个ACK确认报文段
后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样
就可以使下一个新的连接中不会出现这种旧的连接请求报文段。
'''

71、说说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协议安全。
'''

72、说一下HTTP协议以及协议头部中表示数据类型的字段?

请求报文的组成:
	请求行	信息头	请求头	实体头	报文主体
响应报文的组成:
	状态行	信息头	响应头	实体头	报文主体

73、HTTP请求方法都有什么?

'''
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1、 GET 请求指定的页面信息,并返回实体主体。
2、HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3、POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在
请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4、PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5、DELETE 请求服务器删除指定的页面。
6、CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7、OPTIONS 允许客户端查看服务器的性能。
8、TRACE 回显服务器收到的请求,主要用于测试或诊断。
'''

74、socket套接字需要传入哪些参数?

server = socket.socket(type=socket.SOCK_DGRAM)  # UDP协议  type=socket.SOCK_DGRAM  UDP协议

75、HTTP常见请求头?

'''
1. Host (主机和端口号)
2. Connection (链接类型)
3. Upgrade-Insecure-Requests (升级为 HTTPS 请求)
4. User-Agent (浏览器名称)
5. Accept (传输文件类型)
6. Referer (页面跳转处)
7. Accept-Encoding(文件编解码格式)
8. Cookie (Cookie)
9. x-requested-with :XMLHttpRequest  (是 Ajax 异步请求)
'''

76、七层模型中,IP、TCP、UDP、HTTP、RTSP、FTP分别在哪层?

'''
IP: 网络层 
TCP/UDP: 传输层 
HTTP、RTSP、FTP: 应用层协议
'''

77、URL的形式?

'''
形式: scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:协议(例如:http, https, ftp)
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
http://localhost:8000/file/part01/1.2.html
'''
posted @ 2020-02-08 21:25  Jeff的技术栈  阅读(250)  评论(0编辑  收藏  举报
回顶部