复习-网路编程和并发编程

网络编程

简述OSI 7层模型。

1)应用层       应用层       应用层         用户进层
                                 表示层
                                 会话层

   Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
   在设计模式中,Socket其实就是一个门面模式,他把复杂的TCP/IP协议族隐藏在Socket接口后面。
   对用户来说,一组简单的接口就是全部,以符合制定的协议。

2)传输层       传输层       传输层         TCP协议/UDP协议
3)网络层       网络层       网络层         ICPM/IP协议
4)数据链路层   数据链路层     ARP/硬件接口/RARP/arp协议
5)物理层       物理层

TCP 三次握手 和 四次挥手。

建立连接协议(三次握手)      
    (1)客户端发送一个带SYN标志的TCP报文到服务器      
    (2) 服务器端回应客户端的      
    (3) 客户必须再次回应服务段一个ACK报文        
连接终止协议(四次挥手)      
    (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送      
    (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1      
    (3) 服务器关闭客户端的连接,发送一个FIN给客户端      
    (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1

TCP和UDP区别?

TCP 可靠的、面向连接的协议、传输效率低、双全工通信(发送缓存/接受缓存)、面向字节流。
      使用TCP的应用:Web浏览器/电子邮件/文件传输程序
UDP 不可靠、无连接的服务,传输效率高(发送前延时小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。
      使用UDP的应用:域名系统(DNS)/视频流/IP语音

黏包现象

基于tcp协议出现的黏包现象,指的是:发送过来的一整条信息,由于server端没有及时接收,导致后来发送的数据和之前没有接收完的数据黏在了一起。
造成这种现象的的原因是:缓冲区+连续发送数据
解决:struct模块实现数据封包:头(数据长度)+数据

 

Http协议

   - 基于TCP协议实现
    - 一次请求一次响应后断开连接。
    - 格式:
        请求
            - 请求头
                - user-agent,告诉服务器我的设备信息。
                - accept,告诉服务器我能接受返回数据的格式。
                - content-type,告诉服务器我发送的请求体的格式(数据类型)
                - cookies,浏览器端的cookie信息。
                - host,主机信息
                - Connection,值keepalive,告诉服务器保持连接状态。
                - referer,将浏览器上一次访问的地址发送给服务器(可以做图片防盗链)。
                - 请求方法:GET/POST/DELETE/PUT/PATCH/OPTIONS    
            - 请求体
            
            "GET /yuanchenqi/articles/9993188.html http1.1\r\nuser-agent:k1\r\nhost:cnblogs.com...\r\n\r\n"
            "POST /yuanchenqi/articles/9993188.html http1.1\r\nuser-agent:k1\r\nhost:cnblogs.com...\r\n\r\nk1=123&k2=456"
            
        响应:
            - 响应头
                - location,让用户重定向到指定url。
                - set-cookies,给用户浏览器设置cookie。
                - 状态码:
                    - 200,201、202
                    - 300
                    - 400
                    - 500
            - 响应体
                - 用户看到的内容。

Websocket协议(服务器向客户端主动推送消息)

- 基于TCP实现的协议。
    - 连接之后不断开
    - 连接之后需要先进行握手
        - 获取客户端发送过来的随机字符串:在请求Sec-WebSocket-Key中获取,如:mnwFxiOlctXFN/DeMt1Amg==
        - base64.b64encode(hashlib.sha1(mnwFxiOlctXFN/DeMt1Amg== + magic string))
        - 返回给客户浏览器,在响应头中设置:Sec-WebSocket-Accept: 加密后的值
    - 握手通过后,进行收发数据(加密):
        - 127: 2+8字节   MASK(4字节)+数据
        - 126: 2+2字节   MASK(4字节)+数据
        - 125: 2字节     MASK(4字节)+数据
    - 返回数据加密。

Http协议与websocket协议的区别:

1.连接方式的不同:http一次请求一次响应就断开连接,但是websocket连接之后不断开
2.数据加密:http发送接收数据不加密,但是websocket进行发送数据要加密。
3.握手信息:http连接之后不需要握手,websocket连接之后需要先进行握手。

Https

到现在为止,我们已了解到 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。HTTP 主要有这些不足,例举如下。
1、通信使用明文( 不加密) , 内容可能会被窃听

2、不验证通信方的身份, 因此有可能遭遇伪装
3、无法证明报文的完整性, 所以有可能已遭篡改
这些问题不仅在 HTTP 上出现,其他未加密的协议中也会存在这类问题。
除此之外,HTTP 本身还有很多缺点。而且,还有像某些特定的 Web 服务器和特定的 Web 浏览器在实际应用中存在的不足(也可以说成是脆弱性或安全漏洞),另外,用 Java 和 PHP 等编程语言开发的 Web 应用也可能存在安全漏洞。

所以就有了https

在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用 HTTPS 通信机制可以有效地防止这些问题。
HTTP+ 加密 + 认证 + 完整性保护 =HTTPS
HTTP 加上加密处理和认证以及完整性保护后即是 HTTPS
如果在 HTTP 协议通信过程中使用未经加密的明文,比如在 Web 页面中输入信用卡号,如果这条通信线路遭到窃听,那么信用卡号就暴露了。
另外,对于 HTTP 来说,服务器也好,客户端也好,都是没有办法确认通信方的。
因为很有可能并不是和原本预想的通信方在实际通信。并且还需要考虑到接收到的报文在通信途中已经遭到篡改这一可能性。
为了统一解决上述这些问题,需要在 HTTP 上再加入加密处理和认证等机制。我们把添加了加密及认证机制的 HTTP 称为 HTTPS (HTTP Secure)。
经常会在 Web 的登录页面和购物结算界面等使用 HTTPS 通信。使用 HTTPS 通信时,不再用 http://,而是改用 https://。另外,当浏览器访问 HTTPS 通信有效的 Web网站时,浏览器的地址栏内会出现一个带锁的标记。对 HTTPS 的显示方式会因浏览器的不同而有所改变。

进程、线程、协程区别?

进程,计算机中资源分配的最小单元。
线程,计算机cpu调度的最小单元。一个进程中中可以创建多线线程,进程用于维护一个空间,线程则在此空间内进行工作。
协程,在计算机中不存在,是由开发者人为创造出来的,也可以称为“微线程”。(人为控制一个线程在函数见进行切换执行),单纯的协程无法提供性能。
 协程          !=> 性能提高 
 协程 + IO切换  => 性能提高

GIL锁

1、GIL,全局解释器锁。
2、GIL锁,保证一个进程中同一时刻只有一个线程可以被CPU调度。
Python:
        计算型的操作(利用cpu):多进程。
                      IO性操作:多线程、协程
                      
应用:
        爬虫,进程+协程。
        
注意:C Python中才有GIL。

GIL锁可以保证数据安全吗?

无法保证数据安全,想要数据安全必须使用:Lock、RLock、Condition、Event...

IO多路复用?

为什么要用I/O多路复用:就是因为在单线程中,多个服务器无法监听多个客户端的请求,所以要用。
作用:帮助开发者监听多个“IO句柄”发生变化(连接、收发部署)。简单来说就是(帮助开发者监听多个socket是否发生变化)
实现IO多路复用:
windows:
    select
linux:
    select, 个数最多1024个;轮询检测。
    poll,轮询检测。(一个一个挨着问)(水平触发)
    epoll,回自动调通知。(边缘触发)
应用场景:
        wsgiref,socket
        uwsgi,socket+IO多路复用
        nginx,IO多路复用

 进程间的通信 

队列、管道、消息队列

 

posted @ 2018-11-21 20:03  hnlmy  阅读(326)  评论(1编辑  收藏  举报