第五章 網絡編程和併發編程

一、python的底層網絡交互模塊有哪些?

  socket, urllib,urllib3 , requests, grab, pycurlpython

二、簡述OSI七層協議

  應用層: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架構

  C/S架構:是指客服端和服務端,交互性好,對服務器壓力小,安全,可是更新服務端的是後客戶端也得更新。服務器

  B/S架構:是指瀏覽器和服務器,優勢是不須要更新客服端,缺點是交互性差,安全性低。網絡

四、簡述TCP三次握手四次揮手的過程。

  創建鏈接:

  第一次握手:客戶端向服務器發出請求。

  第二次握手:服務器收到請求,贊成鏈接,想客服端發送確認報文。

  第三次握手:客服端接收到報文,向上層應用傳達已創建鏈接。

  釋放鏈接:

  第一次揮手:數據傳輸結束後,客服端發送鏈接釋放報文段,並結束數據傳輸。

  第二次揮手:服務端接收到鏈接釋放報文段後,向客戶端發送確認報文。

  第三次揮手:服務器沒有要發送的數據後,其應用進程就通知服務器釋放TCP鏈接。這個階段服務器所發出的最後一個報文。

  第四次揮手:客戶端收到鏈接釋放報文段以後,必須發出確認。再通過2MSL(最長報文端壽命)後,本次TCP鏈接真正結束,通訊雙方完成了他們的告別。

五、什麼事arp協議?

  arp協議是地址解析協議,使用ARP協議可實現經過IP地址得到對應主機的物理地址(MAC地址)。

六、TCP協議和UDP協議的區別?爲何TCP協議更可靠?

  一、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協議的套接字通訊流程。

  Socket是應用層與TCP/IP協議族通訊的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來講,一組簡單的接口就是所有。  

九、什麼是黏包?socket中形成黏包的緣由是什麼?哪些狀況會發生黏包現象。

  黏包就是數據黏在一塊兒,TCP協議是面向字節流的,基於tcp的套接字客戶端往服務端上傳文件,發送時文件內容是按照一段一段的字節流發送的,在接收方看了,根本不知道該文件的字節流從何處開始,在何處結束

  所謂粘包問題主要仍是由於接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所形成的。

  只有TCP有粘包現象,UDP永遠不會粘包。

  客戶端粘包:

  發送端須要等緩衝區滿才發送出去,形成粘包(發送數據時間間隔很短,數據量很小,TCP優化算法會當作一個包發出去,產生粘包)

  服務端粘包:

  接收方不及時接收緩衝區的包,形成多個包接收(客戶端發送了一段數據,服務端只收了一小部分,服務端下次再收的時候仍是從緩衝區拿上次遺留的數據,產生粘包)

十、IO多路複用的做用

  阻塞IO:特色就是在IO執行的兩個階段(等待數據和拷貝數據兩個階段)都被阻塞了。

  非阻塞IO:特色就是,數據準備階段,用戶發出read操做時,若是數據沒有準備完成,會馬上返回一個error,用戶進程能夠去作其餘事情,須要不斷的輪詢查看數據是否準備完成,可是在數據拷貝期間,進程仍是阻塞的。

  IO多路複用:select和epoll可讓單個線程同時處理多個鏈接,內核會監視全部select負責的socket,當有一個數據準備完成時,select就會返回,這是用戶進程就能夠直接進行read操做了。適用於多個鏈接。

  異步IO:用戶進程發出read操做時就能夠去幹其餘事了,內核會等數據準備完成時,將數據拷貝到進程,這一切完成後,內核會給用戶進程發一個報文,告知一切都已完成。

十一、什麼是防火牆以及做用?

  防火牆做爲一個邊界防護工具,其監控流量——要麼容許它、要麼屏蔽它。

十二、select, poll, epoll的區別

  select:它僅僅知道了,有I/O事件發生了,卻並不知道是哪那幾個流(可能有一個,多個,甚至所有),咱們只能無差異輪詢全部流,找出能讀出數據,或者寫入數據的流,對他們進行操做。因此select具備O(n)的無差異輪詢複雜

  度,同時處理的流越多,無差異輪詢時間就越長。

  poll:本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,而後查詢每一個fd對應的設備狀態, 可是它沒有最大鏈接數的限制,緣由是它是基於鏈表來存儲的.

  epoll:epoll能夠理解爲event poll,不一樣於忙輪詢和無差異輪詢,epoll會把哪一個流發生了怎樣的I/O事件通知咱們。因此咱們說epoll其實是事件驅動(每一個事件關聯上fd)的,此時咱們對這些流的操做都是有意義的。

1三、請簡述進程、線程、協程的區別,以及應用場景。

  進程:操做系統是由一個個的進程組成的,一個應用程序就能夠看做一個進程,他有本身獨立的運行空間,有本身獨立的堆和棧,進程是操做系統資源分配的最小單位。

  線程:線程是屬於進程的,進程能夠建立線程,線程之間共享堆不共享棧,線程是操做系統資源調動的最小單位。

  協程:協程也是共享堆不共享棧,他是由程序員調度的。

1四、什麼是GIL鎖。

  GIL是全局解釋鎖,這個機制只容許一個線程控制python解釋器。

1五、python中如何使用線程池和進程池?

   concurrent.futures 模塊中的 Executor,Executor 提供了兩個子類,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用於建立線程池,而 ProcessPoolExecutor 用於建立進程池。

1六、threading.local的做用?

  threading.local()這個方法的特色用來保存一個全局變量,可是這個全局變量只有在當前線程才能訪問,若是你在開發多線程應用的時候  須要每一個線程保存一個單獨的數據供當前線程操做,能夠考慮使用這個方法,簡單有效。

1七、進程之間如何進行通訊?

  一、管道,一般指無名管道,是 UNIX 系統IPC最古老的形式。

  特色:單向的,具備固定的讀端和寫端,他只能用於有親緣關係的進程之間(父子進程、兄弟進程),他能夠看做特殊的文件,能夠讀寫,可是尋在於內存中。

  二、FIFO,也稱爲命名管道,它是一種文件類型。 

  特色:他能夠在無關進程之間通訊,能夠看做一種特殊的設備文件,存在於文件系統中。

  三、消息隊列,是消息的連接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。 

  特色:他是面向記錄的,有必定特殊的格式和優先級,消息隊列是獨立於進程的,進程消失,消息隊列不會消失,消息不必定是先進先出的順序,也能夠根據類型讀取。

  四、信號量(semaphore)與已經介紹過的 IPC 結構不一樣,它是一個計數器。信號量用於實現進程間的互斥與同步,而不是用於存儲進程間通訊數據。

  特色:信號量用於進程間同步,若要想在進程間傳遞順序須要共享內存。

  五、共享內存(Shared Memory),指兩個或多個進程共享一個給定的存儲區。

  特色:共享內存是最快的一種IPC,由於進程是直接堆內存進行存取,由於多個進程能夠同時操做,因此須要進行同步,信號量和共享內存一般一塊兒使用。

1八、什麼是併發和並行?

  併發:在計算機領域開發過程當中,併發指的是應用可以交替執行不一樣的任務,好比多線程,多線程並不是是同時執行多個任務,而是經過時間輪轉發等算法的調度,時多個任務以咱們察覺不到的速度交替執行。

  並行:指多個任務同時執行。

  區別:一個是交替,一個是同時。

1九、解釋什麼是異步非阻塞。

  同步阻塞:調用結果返回前,進程會被掛起,直到調用結果返回,效率低。

  異步阻塞:不一樣的是,調用結果返回前會用回調或者消息的方式通知進程,可是調用結果返回前,進程仍是會被掛起,效率同樣的低。

  同步非阻塞:調用結果返回前,進程能夠去作其餘事情,可是須要經過輪詢不斷的查看調用結果是否返回,效率比前兩個高,可是耗CPU,也通常。

  異步非阻塞:調用結果返回以前,進程能夠去作其餘事情,當函數調用完成後,會以回調或者消息的形式通知進程,效率最高。

20、路由器和交換機的區別?

  區別一:路由器能夠給局域網自動分配IP,虛擬撥號。交換機則只是用來分配網絡數據的。

  區別二:路由器能夠把一個IP分配給不少個主機使用,這些主機對外只表現出一個IP。交換機能夠把不少主機連起來,這些主機對外各有各的IP。

  區別三:交換機工做在中繼層,根據MAC地址尋址,不能處理TCP/IP協議。

      路由器工做在網絡層,根據IP地址尋址,能夠處理TCP/IP協議。

  區別四:路由器提供防火牆服務,交換機不能提供該功能。

2一、什麼是域名解析?

  域名解析是把域名指向網站空間IP,讓人們經過註冊的域名能夠方便地訪問到網站一種服務。IP地址是網絡上標識站點的數字地址,爲方便記憶,採用域名來代替IP地址標識站點地址。域名解析就是域名到IP地址的轉換過程。

2二、如何修改本地的hosts文件?

  vi/ etc/host

2三、生產者消費者模型應用場景

  不少的生產者同時生產數據到流水線上,而後消費者在從流水線上取下,這樣咱們能夠有多個生產者同時生產提高了效率,同時也能夠容納多個消費者在流水線上消費。

  爬蟲的時候,會將網上的大量數據爬取下來放入本地或者雲端供將來使用,若是數據量太大,咱們的處理器會處理不過來,這時候就能夠引入生產者,流水線,消費者的概念,就能夠解決這個問題。

2四、什麼是cdn?

  CDN的全稱是Content Delivery Network,即內容分發網絡。CDN是一組分佈在多個不一樣地理位置的Web服務器,用於更加有效地向用戶發佈內容,在優化性能時,會根據距離的遠近來選擇。

2五、程序從FlagA執行到FlagB的時間大體爲多少秒?

import threading
import time

def _wait():
    time.sleep(60)
#FlagA
t = threading.Thread(target=_wait, daemon=False)
t.start()
#FlagB

  大體爲0秒,由於線程開啓速度很是快,start()方法爲異步非阻塞,因此不會等待任務的結束。

2六、有A.txt和B.txt兩個文件,使用多進程和進程池的方式分別讀區者兩個文件。

2七、如下哪些是常見的TCP Flags?

  SYN, ACK

2八、下面有關網絡七層和四層的描述哪格式錯誤的?

  SNMP工做在四層

2九、tracerroute通常使用的是哪一種網絡層協議?

  ICMP

30、iptables知識考察,根據要求寫出防火牆規則。

  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

3一、

3二、請實現一個簡單的socket編程,要求:

  一、實現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()

3三、談一下對於多線程編程的理解,對於CPU密集型怎樣使用多線程,說說線程池,線程鎖的用法,有沒有用過multiprocessing和concurrent.future?

  多線程是爲了解決多個任務同時執行的需求,同個進程內的多線程共享資源,他們是併發的,各個線程是在交替執行,同一時間只有一個線程在運行,他能夠防止CPU資源浪費,防止阻塞,增長任務執行效率。

  CPU密集型就是計算密集型,應該使用多核多線程,這樣多個線程能夠真正意義上的並行處理,大大增長了運行效率,若是是IO密集型,多核就沒有用了,由於多核的狀況下,一個線程發出IO請求,也是會阻塞,並無在單核的狀況下有什麼提升,反而會增長CPU的損耗,因此應該使用單核多線程。

  線程池:去你媽的

  線程鎖:去你媽的

  沒有用過

3四、關於守護線程,正確的是

  全部守護線程終止運行時,即便存在非守護線程,進程運行終止。

  主線程:main,不是守護線程

  守護線程:指程序運行期間在後臺提供通用服務的一種線程。

  非守護線程:用戶線程,有用戶建立。

  主線程和守護線程一塊兒被銷燬,主線程和用戶想程互不影響。

3五、TCP協議在每次創建或者拆除鏈接時,都要在收發雙方之間交換幾回報文?

  三次

3六、描述多進程開發中join與deamon的區別。

  deamon是主線程會設置子線程爲守護線程,主線程一旦終止運行,所有線程都會被終止執行,即便子線程尚未執行完成。‘

  join的工做是線程同步,主線程執行結束後,會進入阻塞狀態,等所有子線程運行結束後,主線程在終止。

3七、請簡述GIL對python性能的影響。

  GIL是全局解釋器鎖,線程以後獲取GIL才能運行,因此在python的多線程中,實際上同個進程內同一時間只能有一個線程在工做,者無疑對python的多線程的效率有着不小的影響。

3八、曾經在哪裏使用過線程,進程,協程?

  沒有用過

3九、請使用yield實現一個協程。

  

40、請使用python內置的async語法實現一個協程

  

4一、簡述線程死鎖是如何形成的,如何避免?

  死鎖是在多線程或者多進程的狀況下,兩個線程或者進程在爭奪資源的時候,形成的一種互相等待的現象,被稱爲死鎖。

4二、asynio是什麼?

  異步IO

4三、gevent模塊是什麼?

  Gevent是一種基於協程的Python網絡庫,它用到Greenlet提供的,封裝了libevent事件循環的高層同步API。它讓開發者在不改變編程習慣的同時,用同步的方式寫異步I/O的代碼。

相關文章
相關標籤/搜索