筆記(網絡編程和併發)

1.OSI七層協議前端

OSI是一個開放性的通訊系統互連參考模型,其中應用層 、表示層  、會話層、 傳輸層定義了應用程序的功能,下面網絡層 、 數據鏈路層 、物理層主要面向經過網絡的端到端的數據流。python

OSI七層網絡模型web

TCP/IP四層概念模型  算法

對應網絡協議數據庫

各層的做用    編程

應用層(Application)瀏覽器

應用層緩存

HTTP、TFTP, FTP, NFS, WAIS、SMTP服務器

直接爲用戶的應用進程提供服務網絡

表示層(Presentation)

Telnet, Rlogin, SNMP, Gopher

定義數據格式及加密

會話層(Session)

SMTP, DNS

定義瞭如何開始、控制和結束一個會話,包括對多個雙向消息的控制和管理,以便在只完成連續消息的一部分時能夠通知應用,從而使表示層看到的數據是連續的,在某些狀況下,若是表示層收到了全部的數據,則用數據表明表示層

傳輸層(Transport)

傳輸層

TCP, UDP

向兩個主機中進程之間的通訊提供服務

網絡層(Network)

網絡層

IP, ICMP, ARP, RARP, AKP, UUCP

使用無鏈接的網際協議 IP 和許多種路由選擇協議。負責爲分組交換網上的不一樣主機提供通訊服務,把運輸層產生的報文段或用戶數據報封裝成分組(也叫IP數據報或數據報)或包進行傳送。網絡層的另外一個任務就是選擇合適的路由

數據鏈路層(Data Link)

數據鏈路層

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各類介質有關,將網絡層交下來的 IP 數據報組裝成幀,在兩個相鄰結點(主機和路由器,或兩個路由器)之間的鏈路上「透明」地傳送幀中的數據

物理層(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

 

傳送數據的單位是比特。物理層的任務就是透明地傳送比特流

 

C/S和B/S架構

Client/Server結構(C/S結構)客戶機和服務器結構,它是軟件系統體系結構,經過它能夠充分利用兩端硬件環境的優點,將任務合理分配到Client端和Server端來實現,下降了系統的通信開銷。服務器一般採用高性能的PC、工做站或小型機,並採用大型數據庫系統執行後臺服務,如ORACLE、SYBASE、InfORMix或 SQL Server。客戶端須要安裝專用的客戶端軟件,負責執行前臺功能。優勢就是客戶端響應速度快,充分發揮客戶端PC的處理能力。缺點:只適用於局域網;專用的客戶端軟件,維護和升級成本很是高;對客戶端的操做系統通常也會有限制;

B/S結構(Browser/Server,瀏覽器/服務器模式),是WEB興起後的一種網絡結構模式,WEB瀏覽器是客戶端最主要的應用軟件,在這種結構下,用戶界面徹底經過WWW瀏覽器實現,一部分事務邏輯在前端實現,可是主要事務邏輯在服務器端實現。瀏覽器經過Web Server 同數據庫進行數據交互。

ARP協議

地址解析協議,即ARP(Address Resolution Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的全部主機,

並接收返回消息,以此肯定目標的物理地址;收到返回消息後將該IP地址和物理地址存入本機ARP緩存中並保留必定時間,下次請求時直接查詢ARP緩存以節約資源。

局域網(Local Area Network),簡稱LAN,是指在某一區域內由多臺計算機互聯成的計算機組。「某一區域」指的是同一辦公室、同一建築物、同一公司和同一學校等,通常是方圓幾公里之內。局域網可以實現文件管理、應用軟件共享、打印機共享、掃描儀共享、工做組內的日程安排、電子郵件和傳真通訊服務等功能。局域網是封閉型的,可以由辦公室內的兩臺計算機組成,也能夠由一個公司內的上千臺計算機組成。

廣域網(Wide Area Network),簡稱WAN,是一種跨越大的、地域性的計算機網絡的集合。一般跨越省、市,甚至一個國家。廣域網包括大大小小不一樣的子網,子網能夠

是局域網,也能夠是小型的廣域網。

socket

網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket,Socket又稱"套接字",應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求,是面向客戶/服務器模型而設計的,解決了進程之間創建通訊鏈接的問題。

基於TCP(面向鏈接)的socket編程,分爲客戶端和服務器端。

客戶端的流程以下:

(1)建立套接字(socket)

(2)向服務器發出鏈接請求(connect)

(3)和服務器端進行通訊(send/recv)

(4)關閉套接字

服務器端的流程以下:

(1)建立套接字(socket)

(2)將套接字綁定到一個本地地址和端口上(bind)

(3)將套接字設爲監聽模式,準備接收客戶端請求(listen)

(4)等待客戶請求到來;當請求到來後,接受鏈接請求,返回一個新的對應於這次鏈接的套接字(accept)

(5)用返回的套接字和客戶端進行通訊(send/recv)

(6)返回,等待另外一個客戶請求。

(7)關閉套接字。

粘包:指TCP中,發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。

數據粘包問題的出現,是由於在客戶端/服務器端都會有一個比較大的數據緩衝區,來存放接收的數據,爲了保證可以完整的接收到數據,所以緩衝區都會設置的比較大。在收發數據頻繁時,因爲tcp傳輸消息的無邊界,會致使客戶端/服務器端不知道接收到的消息究竟是第幾條消息,所以,會致使相似一次性接收幾條消息的狀況,從而亂碼。

發生粘包的狀況

要發送的數據小於TCP發送緩衝區的大小,TCP將屢次寫入緩衝區的數據一次發送出去,將會發生粘包。

接收數據端的應用層沒有及時讀取接收緩衝區中的數據,將發生粘包。

...

 

所謂I/O多路複用機制,就是說經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做。select,poll,epoll都是IO多路複用的機制

select、poll、epoll模型的區別

 

進程、線程和協程的區別以及應用場景

一、進程多與線程比較

線程與進程的區別:

1) 地址空間:線程是進程內的一個執行單元,也是進程內的可調度實體。進程內至少有一個線程,它們共享進程的地址空間,而進程有本身獨立的地址空間

2) 資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源

3) 線程是處理器調度的基本單位,但進程不是

4) 兩者都可併發執行 

5) 每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口,可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制

二、協程多與線程進行比較 

1) 一個線程能夠多個協程,一個進程也能夠單獨擁有多個協程,這樣python中則能使用多核CPU。 

2) 線程進程都是同步機制,而協程則是異步 

3) 協程能保留上一次調用時的狀態,每次過程重入時,就至關於進入上一次調用的狀態

IO密集型通常使用多線程或者多進程,CPU密集型通常使用多進程,強調非阻塞異步併發的通常都是使用協程。其餘狀況也會使用多進程線程池結合的或者其餘組合。

GIL

GIL全稱Global Interpreter Lock全局解釋器鎖,一個防止多線程併發執行機器碼的一個Mutex,解決解決多線程之間數據完整性和狀態同步。做用:保證同一時刻,只有一個線程被CPU執行,不管你有多少個線程。全局鎖的存在會對多線程的效率有不小影響。甚至就幾乎等於Python是個單線程的程序

python如何使用線程池和進程池

Python標準庫爲咱們提供了threading和multiprocessing模塊編寫相應的多線程/多進程代碼,可是當項目達到必定的規模,頻繁建立/銷燬進程或者線程是很是消耗資源的,這個時候咱們就要編寫本身的線程池/進程池,以空間換時間。但從Python3.2開始,標準庫爲咱們提供了concurrent.futures模塊,它提供了ThreadPoolExecutor和ProcessPoolExecutor兩個類,實現了對threading和multiprocessing的進一步抽象,對編寫線程池/進程池提供了直接的支持。

threading.local的做用

建立全局ThreadLocal線程局部變量對象,能夠建立一個對象,每一個線程均可以對他讀寫屬性,但不會互相影響。

進程間通信有多種方式

包括信號,管道,消息隊列,信號量,共享內存,socket等,multiprocessing模塊支持兩種形式:隊列和管道,這兩種方式都是使用消息傳遞的。

 

異步非阻塞:能夠同時監控多個事件,調用時是帶超時時間的阻塞,準備好了就返回,沒準備好放到epoll中等待。

同步非阻塞:當即返回EAGAIN,告知沒準備好數據,能夠作其餘事情,可是須要去輪詢

 

路由器和交換機有哪些區別:

A.工做層次不一樣,路由器在網絡層,交換機在中繼層。

B.數據轉發所依據的對象不一樣,交換機是利用物理地址或者說MAC地址來肯定轉發數據的目的地址。而路由器則是利用不一樣網絡的ID號(即IP地址)來肯定數據轉發的地址。

C.傳統的交換機只能分割衝突域,不能分割廣播域;而路由器能夠分割廣播域。

D.路由器提供了防火牆的服務。

域名解析

就是將域名從新轉換爲IP地址的過程。一個域名對應一個IP地址,一個IP地址能夠對應多個域名;因此多個域名能夠同時被解析到一個IP地址。域名解析須要由專門的域名解析服務器(DNS)來完成

生產者和消費者模型應用場景以及優點

 生產者不關心數據何時被處理,消費者不關心數據何時產生,實現瞭解耦,也解決了阻塞

 

CDN的全稱是Content Delivery Network,即內容分發網絡。其基本思路是儘量避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸得更快、更穩定。

LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務器,是一個虛擬的服務器集羣系統。LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具備很好的吞吐率,將請求均衡地轉移到不一樣的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,並且無需修改客戶端和服務器端的程序。爲此,在設計時須要考慮系統的透明性、可伸縮性、高可用性和易管理性。

Nginx (engine x) 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。支持高併發請求的同時保持高效的服務。

keepalived是一個相似於layer3, 4 & 5交換機制的軟件,也就是咱們平時說的第3層、第4層和第5層交換,做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的服務器。

HAProxy是一個使用C語言編寫的自由及開放源代碼軟件[1],其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。

負載均衡(Load Balance,簡稱LB)是一種服務器或網絡設備的集羣技術。負載均衡將特定的業務(網絡服務、網絡流量等)分擔給多個服務器或網絡設備,從而提升了業務處理能力,保證了業務的高可用性。負載均衡基本概念有:實服務、實服務組、虛服務、調度算法、持續性等,其經常使用應用場景主要是服務器負載均衡,鏈路負載均衡。

RPC(Remote Procedure Call)—遠程過程調用,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。開發人員在使用的時候只須要了解誰在什麼位置提供了什麼樣的遠程服務接口便可,並不須要關心底層通訊細節和調用過程

asyncio是Python 3.4版本引入的標準庫,直接內置了對異步IO的支持。

gevent是第三方庫,經過greenlet實現協程

twisted框架是一個異步機制的框架,用python語言寫的事件驅動的網絡框架

twisted網絡框架的三個基礎模塊:Protocol, ProtocolFactory, Transport.這三個模塊是構成twisted服務器端與客戶端程序的基本。

Protocol:Protocol對象實現協議內容,即通訊的內容協議
ProtocolFactory: 是工廠模式的體現,在這裏面生成協議
Transport: 是用來收發數據,服務器端與客戶端的數據收發與處理都是基於這個模塊

相關文章
相關標籤/搜索