網絡編程須知

網絡編程python


"""
1.簡述 OSI 七層協議算法

1.物理層:
定義物理設備標準,如網線的接口類型、光纖的接口類型、各類傳輸介質的傳輸速率等。
主要做用是傳輸比特流。

2.數據鏈路層:
定義瞭如何讓格式化數據以進行傳輸。
這一層一般還提供錯誤檢測和糾正,以確保數據的可靠傳輸。

3.網絡層:
在位於不一樣地理位置的網絡中的兩個主機系統之間提供鏈接和路徑選擇。

4.傳輸層:
定義了一些傳輸數據的協議和端口號(WWW端口80等),好比:
TCP(傳輸控制協議,傳輸效率低,可靠性強,用於傳輸可靠性要求高,數據量大的數據)。
UDP(用戶數據報協議,與TCP特性偏偏相反,用於傳輸可靠性要求不高,數據量小的數據,
如QQ聊天數據就是經過這種方式傳輸的)。
主要是將從下層接收的數據進行分段和傳輸,到達目的地址後再進行重組。經常把這一層數據叫作段。

5.會話層:
經過傳輸層(端口號:傳輸端口與接收端口)創建數據傳輸的通路。
主要在你的系統之間發起會話或者接受會話請求(設備之間須要互相認識能夠是IP也能夠是MAC或者是主機名)編程

6.表示層:
可確保一個系統的應用層所發送的信息能夠被另外一個系統的應用層讀取。

7.應用層:
是最靠近用戶的OSI層。這一層爲用戶的應用程序(例如電子郵件、文件傳輸和終端仿真)提供網絡服務。 緩存


2.簡述 三次握手、四次揮手的流程。服務器

三次握手:

第一次握手:客戶端(client)發送SYN包到服務器(server),
客戶端(client)狀態機進入SYN_SEND狀態,等待服務器確認;網絡

第二次握手:服務器(server)接收到SYN包,必須發送ACK包到客戶端,
同時本身也發送一個SYN包,即SYN+ACK包,此時服務器進入SYN_RECV狀態;多線程

第三次握手:客戶端(client)接收到服務器發送的SYN+ACK包,
必須向服務器發送確認包ACK,此包發送成功,則客戶端和服務器同時進入ESTABLISHED狀態。併發


四次揮手:
假設客戶端發起斷開鏈接請求,

第一次揮手:客戶端(client)發送FIN報文到Server端

第二次揮手:服務器(server)收到客戶端發送的FIN包以後,發送ACK包到客戶端,
客戶端收到服務器發送的ACK以後,進入FIN_WAIT狀態,等待server端發送FIN報文socket

第三次揮手:服務器(server)發送FIN報文到客戶端

第四次揮手:客戶端收到服務器發送的FIN報文以後,發送ACK包到服務器,
服務器收到ACK以後即斷開鏈接,等待一段時間TIME_WAIT以後,
客戶端發現服務器沒有再發FIN過來,就知道服務器已經斷開鏈接,此時客戶端也進入斷開鏈接狀態。tcp


3.什麼是arp協議?
地址解析協議,即ARP(Address ResoluTIon Protocol),是根據IP地址獲取物理地址的一個TCP/IP協議。

做用:由於在局域網中,若是源主機要和目的主機創建通訊關係,
那麼源主機必需要知道目的主機的MAC地址(即硬件地址),可是若是目的主機或者源主機是第一次進行通訊的,
那麼源主機要怎樣才能知道目的主機的MAC地址呢? 因此這樣就引入了ARP地址協議。


4.TCP和UDP的區別?
一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接

二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,
且按序到達;UDP盡最大努力交付,即不保證可靠交付

三、TCP面向字節流,其實是TCP把數據當作一連串無結構的字節流;UDP是面向報文的
UDP沒有擁塞控制,所以網絡出現擁塞不會使源主機的發送速率下降(對實時應用頗有用,如IP電話,實時視頻會議等)

四、每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊

五、TCP首部開銷20字節;UDP的首部開銷小,只有8個字節

六、TCP的邏輯通訊信道是全雙工的可靠信道,UDP則是不可靠信道


5.什麼是局域網和廣域網?
1、局域網

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

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


6.爲什麼基於tcp協議的通訊比基於udp協議的通訊更可靠?
TCP的可靠保證,是它的三次握手雙向機制,這一機制保證校驗了數據,保證了他的可靠性。
而UDP就沒有了,udp信息發出後,不驗證是否到達對方,因此不可靠。


7.什麼是socket?簡述基於tcp協議的套接字通訊流程。
網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。

基於tcp協議流程:
1.服務器先用 socket 函數來創建一個套接字,用這個套接字完成通訊的監聽。
2.用 bind 函數來綁定一個端口號和 IP 地址。由於本地計算機可能有多個網址和 IP,每個 IP 和端口有多個端口。
須要指定一個 IP 和端口進行監聽。
3.服務器調用 listen 函數,使服務器的這個端口和 IP 處於監聽狀態,等待客戶機的鏈接。

4.客戶機用 socket 函數創建一個套接字,設定遠程 IP 和端口。
5.客戶機調用 connect 函數鏈接遠程計算機指定的端口。

6.服務器用 accept 函數來接受遠程計算機的鏈接,創建起與客戶機之間的通訊。

7.創建鏈接之後,客戶機用 write 函數向 socket 中寫入數據。也能夠用 read 函數讀取服務器發送來的數據。

8.服務器用 read 函數讀取客戶機發送來的數據,也能夠用 write 函數來發送數據。
9.完成通訊之後,用 close 函數關閉 socket 鏈接。


8.什麼是粘包? socket 中形成粘包的緣由是什麼?
1 什麼是粘包現象?
TCP粘包是指發送方發送的若干包數據到接收方接收時粘成一包,從接收緩衝區看,後一包數據的頭緊接着前一包數據的尾。

2 爲何出現粘包現象
(1)發送方緣由
TCP默認會使用Nagle算法。而Nagle算法主要作兩件事:
1)只有上一個分組獲得確認,纔會發送下一個分組;
2)收集多個小分組,在一個確認到來時一塊兒發送。

因此,正是Nagle算法形成了發送方有可能形成粘包現象。

(2)接收方緣由
TCP接收到分組時,並不會馬上送至應用層處理,或者說,應用層並不必定會當即處理;
實際上,TCP將收到的分組保存至接收緩存裏,而後應用程序主動從緩存裏讀收到的分組。
這樣一來,若是TCP接收分組的速度大於應用程序讀分組的速度,多個包就會被存至緩存,應用程序讀時,
就會讀到多個首尾相接粘到一塊兒的包。

3 何時須要處理粘包現象
1)若是發送方發送的多個分組原本就是同一個數據的不一樣部分,
好比一個很大的文件被分紅多個分組發送,這時,固然不須要處理粘包的現象;

(2)但若是多個分組本絕不相干,甚至是並列的關係,咱們就必定要處理粘包問題了。
好比,我當時要接收的每一個分組都是一個有固定格式的商品信息,
若是不處理粘包問題,每一個讀進來的分組我只會處理最前邊的那個商品,後邊的就會被丟棄。這顯然不是我要的結果。

4 如何處理粘包現象
(1)發送方
對於發送方形成的粘包現象,咱們能夠經過關閉Nagle算法來解決,使用TCP_NODELAY選項來關閉Nagle算法。

(2)接收方
遺憾的是TCP並無處理接收方粘包現象的機制,咱們只能在應用層進行處理。

(3)應用層處理
解決方法就是循環處理:應用程序在處理從緩存讀來的分組時,
讀完一條數據時,就應該循環讀下一條數據,直到全部的數據都被處理;可是如何判斷每條數據的長度呢?


兩種途徑:
1)格式化數據:每條數據有固定的格式(開始符、結束符),這種方法簡單易行,
但選擇開始符和結束符的時候必定要注意每條數據的內部必定不能出現開始符或結束符;

2)發送長度:發送每條數據的時候,將數據的長度一併發送,好比能夠選擇每條數據的前4位是數據的長度,
應用層處理時能夠根據長度來判斷每條數據的開始和結束。


9.python的GIL
GIL 是python的全局解釋器鎖,同一進程中假若有多個線程運行,
一個線程在運行python程序的時候會霸佔python解釋器(加了一把鎖即GIL),
使該進程內的其餘線程沒法運行,等該線程運行完後其餘線程才能運行。若是線程運行過程當中遇到耗時操做,
則解釋器鎖解開,使其餘線程運行。因此在多線程中,線程的運行還是有前後順序的,並非同時進行。
多進程中由於每一個進程都能被系統分配資源,至關於每一個進程有了一個python解釋器,
因此多進程能夠實現多個進程的同時運行,缺點是進程系統資源開銷大


10.進程之間如何進行通訊?
進程間通信有多種方式,包括信號,管道,消息隊列,信號量,共享內存,socket等


11.什麼是併發和並行?
併發:交替作不一樣事的能力
並行:同時作不一樣事的能力

你吃飯吃到一半,電話來了,你一直到吃完了之後纔去接,這就說明你不支持併發也不支持並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支持併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持並行。

併發的關鍵是你有處理多個任務的能力,不必定要同時。
並行的關鍵是你有同時處理多個任務的能力。

它們最關鍵的點就是:是不是『同時』。

"""

相關文章
相關標籤/搜索