Python 經典面試題匯總之網絡篇


 網絡篇

1.簡述 OSI 七層協議

 

物理層:定義物理設備標准,如網線的接口類型、光纖的接口類型、各種傳輸介質。

數據鏈路層:定義如何傳輸格式化數據,以及如何訪問物理介質。

網絡層:定義邏輯網絡地址。

傳輸層:定義傳輸協議和端口。

會話層:定義客戶端與服務端的連接。

表示層:定義數據格式轉換,對來自應用層的數據進行解釋。

應用層:定義應用程序。

2. 什么是C/S和B/S架構?

c/s架構,就是client(客戶端)與server(服務端)即:客戶端與服務端的架構。

b/s架構,就是brosver(瀏覽器端)與sever(服務端)即:瀏覽器端與服務端架構

3. 簡述 三次握手、四次揮手的流程

三次握手 ---> 請求連接
第一次握手
  客戶端先向服務端發起一次詢問建立連接的請求,並隨機生成一個值作為標識
第二次握手
  服務端向客戶端先回應第一個標識,再重新發一個確認標識
第三次握手
  客戶端確認標識,建立連接,開始傳輸數據
四次揮手 ---> 斷開連接
第一次揮手
    客戶端向服務端發起請求斷開連接的請求
第二次揮手
    服務端向客戶端確認請求,表示知道了
第三次揮手
    服務端向客戶端發起斷開連接請求
第四次揮手
    客戶端向服務端確認斷開請求,表示已斷開

4.TCP和UDP的區別

TCP/UDP區別
 TCP協議:面向連接,高可靠性的傳輸層協議
 UDP協議:不面向連接,數據會丟失,不可靠的傳輸層協議 (短信和QQ基於UDP協議)

5.為何基於TCP協議的通信比基於UDP協議的通信更可靠?

TCP:可靠,因為只要對方回了確認收到信息,才發下一個,如果沒收到確認信息就重發
UDP:不可靠,它是一直發數據,不需要對方回應
流式協議:TCP協議,可靠傳輸
數據報協議:UDP協議,不可傳輸

6.什么是socket?簡述基於TCP協議的套接字通信流程

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。
在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,
對用戶來說,一組簡單的接口就是全部。 服務端:
創建socket對象;
綁定IP和端口bind();
創建雙工通信,等待連接;
send(), recv(), 收發數據;
close() 客戶端:
創建socket對象;
與服務端創建雙工通信,請求連接;
send(),recv(), 收發數據;
close()

7.什么是粘包?socket 中造成粘包的原因是什什么?哪些情況會發生粘包現象?

只有TCP有粘包現象,UDP永遠不會粘包!
粘包
:在接收數據時,一次性多接收了其它請求發送來的數據(即多包接收)。如,對方第一次發送hello,第二次發送world,
   在接收時,應該收兩次,一次是hello,一次是world,但事實上是一次收到helloworld,一次收到空,這種現象叫粘包。 原因 粘包問題主要還是因為接收方不知道消息之間的界限,不知道一次性提取多少字節的數據所造成的。 什么情況會發生: 1、發送端需要等緩沖區滿才發送出去,造成粘包(發送數據時間間隔很短,數據很小,會合到一起,產生粘包) 2、接收方不及時接收緩沖區的包,造成多個包接收(客戶端發送了一段數據,服務端只收了一小部分,服務端下次再收的時候還是從緩沖區拿上次遺留的數據,產生粘包)

8.IO多路復的作用

socketserver,多個客戶端連接,單線程下實現並發效果,就叫多路復用。

與多進程和多線程技術相比,I/O多路復用技術的最大優勢是系統開銷小,系統不必創建進程/線程,也不必維護這些進程/線程,從而大大減小了系統的開銷。

9.select、poll、epoll 模型的區別?(屬於多路復用IO的模型)

都是i/o多路復用的機制,監視多個socket是否發生變化,本質上都是同步i/o
select,poll實現需要自己不斷輪詢所有監測對象,直到對象發生變化,在這個階段中,
可能要睡眠和喚醒多次交替,而epoll也需要調用epoll_wait不斷輪詢就緒鏈表,但是當對象發生變化時,
會調用回調函數,將變化的對象放入就緒鏈接表中,並喚醒在epoll_wait中進入睡眠的進程。
雖然都會睡眠和喚醒,但是select和poll在被喚醒的時候要遍歷整個監測對象集合,
而epoll只要判斷就緒鏈表是否為空即可,節省了大量cpu的時間。
 select、poll、epoll都是IO多路復用的機制,但select,poll,epoll本質上都是同步I/O,
 因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的.

FD(文件描述符)
select模型
優點:
    1:可移植性好,在某些Unix系統不支持poll()
    2:對於超時值提供了更好的精度:微妙,而poll是毫秒
缺點:
    1:最大並發數限制,因為一個進程所打開的 FD (文件描述符)是有限制的,由 FD_SETSIZE 設置,默認值是 1024/2048 ,因此 Select 模型的最大並發數就被相應限制了。
    2:效率問題,select每次調用都會線性掃描全部的FD集合,所以將FD_SETSIZE 改大,會越慢
    3:需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大。 

poll本質上和select 沒有區別,它將用戶傳入的數組拷貝到內核空間,
它沒有最大連接數的限制,原因是它基於鏈表來存儲的但是同樣有一個缺點:
大量的fd的數組被整體復制於用戶態和內核地址空間,而不管這樣的復制是不是有意義。

10.什么是防火牆以及作用?

防火牆是一個分離器、一個限制器,也是一個分析器,有效地監控了內部網和Internet之間的任何活動,保證了內部網絡的安全。

作用
  網絡安全的屏障
  對網絡存取和訪問進行監控審計
  防止內部信息的外泄
  除了安全作用,防火牆還支持具有Internet服務特性的企業內部網絡技術體系VPN(虛擬專用網)

11.簡述 進程、線程、協程的區別 以及應用場景

線程是指進程內的一個執行單元,

# 進程 進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度。 # 線程 線程擁有自己獨立的棧和共享的堆,共享堆,不共享棧,線程亦由操作系統調度。 # 協程 協程是運行在單線程中的"並發",協程相比多線程的一大優勢就是省去了多線程之間的切換開銷,獲得了更高的運行效率。所以可以用協程取代多線程。協程避免了無意義的調度,由此可以提高性能;但同時協程也失去了線程使用多核CPU的能力。 進程與線程的區別
如果把進程比喻成項目組辦公室,那么線程就是辦公室里的員工,一個辦公室可以有多個員工,每個員工的任務不同,但他們共享辦公司資源。 (1)地址空間:線程是進程內的一個執行單位,進程內至少有一個線程,他們共享進程的地址空間,而進程有自己獨立的地址空間 (2)資源擁有:進程是資源分配和擁有的單位,同一個進程內多線程共享進程的資源 (3)線程是處理器調度的基本單位,但進程不是 (4)二者均可並發執行 (5)每個獨立的線程有一個程序運行的入口 協程與線程 (1)一個線程可以有多個協程,一個進程也可以有多個協程,這樣Python則能使用多核CPU (2)線程、進程都是同步機制,而協程是異步 (3)協程能保留上一次調用時的狀態

12.GIL鎖是什么?

GIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將並發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改,進而保證數據安全。

GIL保護的是解釋器級的數據,保護用戶自己的數據則需要自己加鎖處理。

應用(總結):
多線程用於IO密集型,如socket,爬蟲,web
多進程用於計算密集型,如金融分析
  1. 每個cpython進程內都有一個GIL
  2. GIL導致同一進程內多個進程同一時間只能有一個運行
  3. 之所以有GIL,是因為cpython的內存管理不是線程安全的

13.Python中如何使用線程池和進程池?

因為在切換線程/進程的時候,需要切換上下文環境,線程很多的時候,依然會造成CPU的大量開銷。為解決這個問題,線程池的概念被提出來了。
預先創建好一個數量較為優化的線程/進程組,在需要的時候立刻能夠使用,就形成了線程/進程池。
如果池還沒有滿,那么就會創建一個新的線程/進程用來執行該請求;但如果池中的線程/進程數已經達到規定最大值,那么該請求就會等待。

from multiprocessing import Pool

p = Pool(processes=4)        # 允許最多同時放入4個進程,自由調配子程序。默認是本機的CPU核數。
for i in range(20):          # 開啟20個進程
    res = p.apply_async(func=task, args=(x,), callback='回調函數')    # 異步運行進程池,func傳入函數,arg是元組,有返回結果
                                                                            
p.close()                    # 調用join()之前必須先調用close()
p.join()                     # 等待目前子進程結束后,繼續運行下一個子進程。如果沒有則進入主進程

14.threading.local()的作用

實現線程的不同函數之間局部變量的傳遞。

threading.local()最常用的地方:
為每個線程綁定一個資源(數據庫連接,HTTP請求,用戶身份信息等),這樣一個線程的所有調用到的處理函數都可以非常方便地訪問這些資源。

15.進程之間如何進行通信?

線程/進程彼此之間互相隔離,要實現線程/進程間通信,Python提供了隊列Queue(線程通信)、管道Pipe(進程通信)等多種方式來交換數據。

Queue主要方法:put(),get()

Pipe主要方法:send(),recv()

16.什么是並發和並行?

# 並發:同一時刻只能處理一個任務,但可以交替處理多個任務。(一個處理器同時處理多個任務)
# 並行:同一時刻可以處理多個任務。(多個處理器或者是多核的處理器同時處理多個不同的任務)
# 類比:並發是一個人同時吃三個饅頭,而並行是三個人同時吃三個饅頭。 

17.進程鎖和線程鎖的作用

為了保證數據安全,Python設計了鎖,即同一時刻只允許一個線程或進程操作數據。

18.同步和異步,阻塞和非阻塞的區別?

同步:執行一個操作之后,需要主動等待返回結果;
異步:執行一個操作之后,不需要主動等待返回結果,若接收到結果通知,再回來執行剛才沒執行完的操作。
同步和異步關心的問題是:要不要主動等待結果。

阻塞:在執行一個操作時,不能做其他操作;
非阻塞:在執行一個操作時,能做其他操作。
阻塞和非阻塞關心的問題是:能不能做其他操作。

19.路由器和交換機的區別

1:交換機:是負責內網里面的數據傳遞(arp協議)根據MAC地址尋址。
   路由器:在網絡層,路由器根據路由表,尋找該ip的網段。
2:路由器可以把一個IP分配給很多個主機使用,這些主機對外只表現出一個IP。
   交換機可以把很多主機連起來,這些主機對外各有各的IP。
3:交換機是做端口擴展的,也就是讓局域網可以連進來更多的電腦。
   路由器是用來做網絡連接,也就是連接不同的網絡。

20.什么是域名解析?

在互聯網上,所有的地址都是ip地址,現階段主要是IPv4(比如:110.110.110.110)。
但是這些ip地址太難記了,所以就出現了域名(比如http://baidu.com)。
域名解析就是將域名,轉換為ip地址的這樣一種行為。

21.如何修改本地hosts件?

Hosts是一個沒有擴展名的系統文件,可以用記事本等工具打開,其作用就是將一些常用的網址域名與其對應的IP地址建立一個關聯“數據庫”,
當用戶在瀏覽器中輸入一個需要登錄的網址時,系統會首先自動從Hosts文件中尋找對應的IP地址,
一旦找到,系統會立即打開對應網頁,如果沒有找到,則系統會再將網址提交給DNS域名解析服務器進行IP地址的解析。 文件路徑:C:\WINDOWS\system32\drivers\etc。 將127.0.0.1 www.163.com 添加在最下面 修改后用瀏覽器訪問“www.163.com”會被解析到127.0.0.1,導致無法顯示該網頁。

22.生產者消費者模型應用場景及優勢

生產者與消費者模式是通過一個容器來解決生產者與消費者的強耦合關系,生產者與消費者之間不直接進行通訊,
而是利用阻塞隊列來進行通訊,生產者生成數據后直接丟給阻塞隊列,消費者需要數據則從阻塞隊列獲取,
實際應用中,生產者與消費者模式則主要解決生產者與消費者的生產與消費的速率不一致的問題,達到平衡生產者與消費者的處理能力,而阻塞隊列則相當於緩沖區。 應用場景:用戶提交訂單,訂單進入引擎的阻塞隊列中,由專門的線程從阻塞隊列中獲取數據並處理。 優勢: 1;解耦 假設生產者和消費者分別是兩個類。如果讓生產者直接調用消費者的某個方法,那么生產者對於消費者就會產生依賴(也就是耦合)。 將來如果消費者的代碼發生變化,可能會影響到生產者。而如果兩者都依賴於某個緩沖區,兩者之間不直接依賴,耦合也就相應降低了。 2:支持並發 生產者直接調用消費者的某個方法,還有另一個弊端。由於函數調用是同步的(或者叫阻塞的),在消費者的方法沒有返回之前,生產者只能一直等着 而使用這個模型,生產者把制造出來的數據只需要放在緩沖區即可,不需要等待消費者來取。 3:支持忙閑不均 緩沖區還有另一個好處。如果制造數據的速度時快時慢,緩沖區的好處就體現出來了。 當數據制造快的時候,消費者來不及處理,未處理的數據可以暫時存在緩沖區中。等生產者的制造速度慢下來,消費者再慢慢處理掉。

23.什么是cdn?

目的是使用戶可以就近到服務器取得所需內容,解決 Internet網絡擁擠的狀況,提高用戶訪問網站的響應速度。

cdn 即內容分發網絡

24.LVS是什么及作用?

LVS :Linux虛擬服務器
作用:LVS主要用於多服務器的負載均衡。
它工作在網絡層,可以實現高性能,高可用的服務器集群技術。
它廉價,可把許多低性能的服務器組合在一起形成一個超級服務器。
它易用,配置非常簡單,且有多種負載均衡的方法。
它穩定可靠,即使在集群的服務器中某台服務器無法正常工作,也不影響整體效果。另外可擴展性也非常好。

25.Nginx是什么及作用

 Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器,同時也是一個IMAP、POP3、SMTP代理服務器。

可以用作HTTP服務器、方向代理服務器、負載均衡。

26.什么是負載均衡?

將服務器接收到的請求按照規則分發的過程,稱為負載均衡。

27.twisted框架的應用

 twisted是異步非阻塞框架。爬蟲框架Scrapy依賴twisted。
 
來自轉載,有較大改動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM