socket, urllib,urllib3 , requests, grab, pycurlpython
應用層:HTTP,FTP,NFS程序員
表示層:Telnet,SNMP算法
會話層:SMTP,DNS編程
傳輸層:TCP,UDP設計模式
網絡層:IP,ICMP,ARP,數組
數據鏈路層:Ethernet,PPP,PDN,SLIP,FDDI瀏覽器
物理層:IEEE 802.1A,IEEE 802.11安全
C/S架構:是指客服端和服務端,交互性好,對服務器壓力小,安全,可是更新服務端的是後客戶端也得更新。服務器
B/S架構:是指瀏覽器和服務器,優勢是不須要更新客服端,缺點是交互性差,安全性低。網絡
創建鏈接:
第一次握手:客戶端向服務器發出請求。
第二次握手:服務器收到請求,贊成鏈接,想客服端發送確認報文。
第三次握手:客服端接收到報文,向上層應用傳達已創建鏈接。
釋放鏈接:
第一次揮手:數據傳輸結束後,客服端發送鏈接釋放報文段,並結束數據傳輸。
第二次揮手:服務端接收到鏈接釋放報文段後,向客戶端發送確認報文。
第三次揮手:服務器沒有要發送的數據後,其應用進程就通知服務器釋放TCP鏈接。這個階段服務器所發出的最後一個報文。
第四次揮手:客戶端收到鏈接釋放報文段以後,必須發出確認。再通過2MSL(最長報文端壽命)後,本次TCP鏈接真正結束,通訊雙方完成了他們的告別。
arp協議是地址解析協議,使用ARP協議可實現經過IP地址得到對應主機的物理地址(MAC地址)。
一、TCP是面向鏈接的,發送數據以前必須創建鏈接,UDP不須要創建鏈接就能夠發送數據。
二、TCP協議提供可靠的服務,經過TCP傳輸數據,無差錯,不丟失,不重複,且按序到達,UDP是盡最大努力交付,且不保證可靠交付。
三、TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;UDP是面向報文的UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等)
四、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊。
五、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節。
六、TCP的邏輯通訊信道是全雙工的可靠信道,UDP則是不可靠信道
tcp:可靠 對方給了確認收到信息,才發下一個,若是沒收到確認信息就重發
udp:不可靠 一直髮數據,不須要對方迴應
局域網,LAN(Local Area Network)是指在某一區域內(如一個學校、工廠和機關內)由多臺計算機互聯成的計算機組。
廣域網,WAN(Wide Area Network)也稱遠程網。一般跨接很大的物理範圍,所覆蓋的範圍從幾十千米到幾千千米,它能鏈接多個城市或國家,或橫跨幾個洲並能提供遠距離通訊,造成國際性的遠程網絡。
Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有。
黏包就是數據黏在一塊兒,TCP協議是面向字節流的,基於tcp的套接字客戶端往服務端上傳文件,發送時文件內容是按照一段一段的字節流發送的,在接收方看了,根本不知道該文件的字節流從何處開始,在何處結束
所謂粘包問題主要仍是由於接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所形成的。
只有TCP有粘包現象,UDP永遠不會粘包。
客戶端粘包:
發送端須要等緩衝區滿才發送出去,形成粘包(發送數據時間間隔很短,數據量很小,TCP優化算法會當作一個包發出去,產生粘包)
服務端粘包:
接收方不及時接收緩衝區的包,形成多個包接收(客戶端發送了一段數據,服務端只收了一小部分,服務端下次再收的時候仍是從緩衝區拿上次遺留的數據,產生粘包)
阻塞IO:特色就是在IO執行的兩個階段(等待數據和拷貝數據兩個階段)都被阻塞了。
非阻塞IO:特色就是,數據準備階段,用戶發出read操做時,若是數據沒有準備完成,會馬上返回一個error,用戶進程能夠去作其餘事情,須要不斷的輪詢查看數據是否準備完成,可是在數據拷貝期間,進程仍是阻塞的。
IO多路複用:select和epoll可讓單個線程同時處理多個鏈接,內核會監視全部select負責的socket,當有一個數據準備完成時,select就會返回,這是用戶進程就能夠直接進行read操做了。適用於多個鏈接。
異步IO:用戶進程發出read操做時就能夠去幹其餘事了,內核會等數據準備完成時,將數據拷貝到進程,這一切完成後,內核會給用戶進程發一個報文,告知一切都已完成。
防火牆做爲一個邊界防護工具,其監控流量——要麼容許它、要麼屏蔽它。
select:它僅僅知道了,有I/O事件發生了,卻並不知道是哪那幾個流(可能有一個,多個,甚至所有),咱們只能無差異輪詢全部流,找出能讀出數據,或者寫入數據的流,對他們進行操做。因此select具備O(n)的無差異輪詢複雜
度,同時處理的流越多,無差異輪詢時間就越長。
poll:本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,而後查詢每一個fd對應的設備狀態, 可是它沒有最大鏈接數的限制,緣由是它是基於鏈表來存儲的.
epoll:epoll能夠理解爲event poll,不一樣於忙輪詢和無差異輪詢,epoll會把哪一個流發生了怎樣的I/O事件通知咱們。因此咱們說epoll其實是事件驅動(每一個事件關聯上fd)的,此時咱們對這些流的操做都是有意義的。
進程:操做系統是由一個個的進程組成的,一個應用程序就能夠看做一個進程,他有本身獨立的運行空間,有本身獨立的堆和棧,進程是操做系統資源分配的最小單位。
線程:線程是屬於進程的,進程能夠建立線程,線程之間共享堆不共享棧,線程是操做系統資源調動的最小單位。
協程:協程也是共享堆不共享棧,他是由程序員調度的。
GIL是全局解釋鎖,這個機制只容許一個線程控制python解釋器。
concurrent.futures 模塊中的 Executor,Executor 提供了兩個子類,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用於建立線程池,而 ProcessPoolExecutor 用於建立進程池。
threading.local()這個方法的特色用來保存一個全局變量,可是這個全局變量只有在當前線程才能訪問,若是你在開發多線程應用的時候 須要每一個線程保存一個單獨的數據供當前線程操做,能夠考慮使用這個方法,簡單有效。
一、管道,一般指無名管道,是 UNIX 系統IPC最古老的形式。
特色:單向的,具備固定的讀端和寫端,他只能用於有親緣關係的進程之間(父子進程、兄弟進程),他能夠看做特殊的文件,能夠讀寫,可是尋在於內存中。
二、FIFO,也稱爲命名管道,它是一種文件類型。
特色:他能夠在無關進程之間通訊,能夠看做一種特殊的設備文件,存在於文件系統中。
三、消息隊列,是消息的連接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。
特色:他是面向記錄的,有必定特殊的格式和優先級,消息隊列是獨立於進程的,進程消失,消息隊列不會消失,消息不必定是先進先出的順序,也能夠根據類型讀取。
四、信號量(semaphore)與已經介紹過的 IPC 結構不一樣,它是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通訊數據。
特色:信號量用於進程間同步,若要想在進程間傳遞順序須要共享內存。
五、共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。
特色:共享內存是最快的一種IPC,由於進程是直接堆內存進行存取,由於多個進程能夠同時操做,因此須要進行同步,信號量和共享內存一般一塊兒使用。
併發:在計算機領域開發過程當中,併發指的是應用可以交替執行不一樣的任務,好比多線程,多線程並不是是同時執行多個任務,而是經過時間輪轉發等算法的調度,時多個任務以咱們察覺不到的速度交替執行。
並行:指多個任務同時執行。
區別:一個是交替,一個是同時。
同步阻塞:調用結果返回前,進程會被掛起,直到調用結果返回,效率低。
異步阻塞:不一樣的是,調用結果返回前會用回調或者消息的方式通知進程,可是調用結果返回前,進程仍是會被掛起,效率同樣的低。
同步非阻塞:調用結果返回前,進程能夠去作其餘事情,可是須要經過輪詢不斷的查看調用結果是否返回,效率比前兩個高,可是耗CPU,也通常。
異步非阻塞:調用結果返回以前,進程能夠去作其餘事情,當函數調用完成後,會以回調或者消息的形式通知進程,效率最高。
區別一:路由器能夠給局域網自動分配IP,虛擬撥號。交換機則只是用來分配網絡數據的。
區別二:路由器能夠把一個IP分配給不少個主機使用,這些主機對外只表現出一個IP。交換機能夠把不少主機連起來,這些主機對外各有各的IP。
區別三:交換機工做在中繼層,根據MAC地址尋址,不能處理TCP/IP協議。
路由器工做在網絡層,根據IP地址尋址,能夠處理TCP/IP協議。
區別四:路由器提供防火牆服務,交換機不能提供該功能。
域名解析是把域名指向網站空間IP,讓人們經過註冊的域名能夠方便地訪問到網站一種服務。IP地址是網絡上標識站點的數字地址,爲方便記憶,採用域名來代替IP地址標識站點地址。域名解析就是域名到IP地址的轉換過程。
vi/ etc/host
不少的生產者同時生產數據到流水線上,而後消費者在從流水線上取下,這樣咱們能夠有多個生產者同時生產提高了效率,同時也能夠容納多個消費者在流水線上消費。
爬蟲的時候,會將網上的大量數據爬取下來放入本地或者雲端供將來使用,若是數據量太大,咱們的處理器會處理不過來,這時候就能夠引入生產者,流水線,消費者的概念,就能夠解決這個問題。
CDN的全稱是Content Delivery Network,即內容分發網絡。CDN是一組分佈在多個不一樣地理位置的Web服務器,用於更加有效地向用戶發佈內容,在優化性能時,會根據距離的遠近來選擇。
import threading import time def _wait(): time.sleep(60) #FlagA t = threading.Thread(target=_wait, daemon=False) t.start() #FlagB
大體爲0秒,由於線程開啓速度很是快,start()方法爲異步非阻塞,因此不會等待任務的結束。
SYN, ACK
SNMP工做在四層
ICMP
A、屏蔽192.168.1.5訪問本機dns服務端口。
BLOCK_THIS_IP="192.168.1.5"
B、容許10.1.1.0/24訪問本機的udp 8888 9999 端口
iptables -t filter -A INPUT -s 192.168.1.0/24 -p udp -m state --state NEW -m udp --dport 8888 9999 -j ACCEPT
一、實現server端的功能便可
二、遵循基本語言編程規範
import socket sk = socket.socket() sk.bind(('127.0.0.1', 8800)) # 把地址綁定到套接字 sk.listen() # 監聽連接 conn, addr = sk.accept() # 接受客戶端連接 ret = conn.recv(1024) # 接受客服端發來的數據 print(ret) # 保存客戶端數據 conn.send(b'hi') # 想客戶端發送信息 conn.close() # 關閉客戶端連接 sk.close() # 關閉服務器套接字套接字
順便把客戶端的也放上來吧
import socket sk = socket.socket() sk.connect(('127.0.0.1', 8800)) sk.send(b'hi') ret = sk.recv(1024) print(ret) sk.close()
多線程是爲了解決多個任務同時執行的需求,同個進程內的多線程共享資源,他們是併發的,各個線程是在交替執行,同一時間只有一個線程在運行,他能夠防止CPU資源浪費,防止阻塞,增長任務執行效率。
CPU密集型就是計算密集型,應該使用多核多線程,這樣多個線程能夠真正意義上的並行處理,大大增長了運行效率,若是是IO密集型,多核就沒有用了,由於多核的狀況下,一個線程發出IO請求,也是會阻塞,並無在單核的狀況下有什麼提升,反而會增長CPU的損耗,因此應該使用單核多線程。
線程池:去你媽的
線程鎖:去你媽的
沒有用過
全部守護線程終止運行時,即便存在非守護線程,進程運行終止。
主線程:main,不是守護線程
守護線程:指程序運行期間在後臺提供通用服務的一種線程。
非守護線程:用戶線程,有用戶建立。
主線程和守護線程一塊兒被銷燬,主線程和用戶想程互不影響。
三次
deamon是主線程會設置子線程爲守護線程,主線程一旦終止運行,所有線程都會被終止執行,即便子線程尚未執行完成。‘
join的工做是線程同步,主線程執行結束後,會進入阻塞狀態,等所有子線程運行結束後,主線程在終止。
GIL是全局解釋器鎖,線程以後獲取GIL才能運行,因此在python的多線程中,實際上同個進程內同一時間只能有一個線程在工做,者無疑對python的多線程的效率有着不小的影響。
沒有用過
死鎖是在多線程或者多進程的狀況下,兩個線程或者進程在爭奪資源的時候,形成的一種互相等待的現象,被稱爲死鎖。
異步IO
Gevent是一種基於協程的Python網絡庫,它用到Greenlet提供的,封裝了libevent事件循環的高層同步API。它讓開發者在不改變編程習慣的同時,用同步的方式寫異步I/O的代碼。