Python——網絡編程(傳輸層、應用層、socket介紹)


網絡通信——傳輸層

  • 傳輸層功能:建立端口到端口的通信
  • 補充:端口范圍0-65535,其中0-1023為系統占用端口,自定義時不推薦去使用0-1023這個范圍內的端口

tcp協議

  • 可靠傳輸(開辟雙向通道傳輸),TCP數據包沒有長度限制,理論上可以無限長,但是為了保證網絡的效率,通常TCP數據包的長度不會超過IP數據包的長度,以確保單個TCP數據包不必再分割。

udp協議

  • 不可靠傳輸(只負責傳,不管對方受否能接收到),”報頭”部分一共只有8個字節,總長度不超過65,535字節,正好放進一個IP數據包。

tcp報文

img

tcp三次握手和四次揮手(SYN=1 ACK=1)

  • 三次握手

  • 客戶端和服務端通信前要進行連接,“3次握手”的作用就是雙方都能明確自己和對方的收、發能力是正常的。

  • 第一次握手:客戶端發送網絡包,服務端收到了。這樣服務端就能得出結論:客戶端的發送能力、服務端的接收能力是正常的。

  • 第二次握手:服務端發包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、發送能力,客戶端的接收、發送能力是正常的。 從客戶端的視角來看,我接到了服務端發送過來的響應數據包,說明服務端接收到了我在第一次握手時發送的網絡包,並且成功發送了響應數據包,這就說明,服務端的接收、發送能力正常。而另一方面,我收到了服務端的響應數據包,說明我第一次發送的網絡包成功到達服務端,這樣,我自己的發送和接收能力也是正常的。

  • 第三次握手:客戶端發包,服務端收到了。這樣服務端就能得出結論:客戶端的接收、發送能力,服務端的發送、接收能力是正常的。 第一、二次握手后,服務端並不知道客戶端的接收能力以及自己的發送能力是否正常。而在第三次握手時,服務端收到了客戶端對第二次握手作的回應。從服務端的角度,我在第二次握手時的響應數據發送出去了,客戶端接收到了。所以,我的發送能力是正常的。而客戶端的接收能力也是正常的。

經歷了上面的三次握手過程,客戶端和服務端都確認了自己的接收、發送能力是正常的。之后就可以正常通信了。

每次都是接收到數據包的一方可以得到一些結論,發送的一方其實沒有任何頭緒。我雖然有發包的動作,但是我怎么知道我有沒有發出去,而對方有沒有接收到呢?

而從上面的過程可以看到,最少是需要三次握手過程的。兩次達不到讓雙方都得出自己、對方的接收、發送能力都正常的結論。其實每次收到網絡包的一方至少是可以得到:對方的發送、我方的接收是正常的。而每一步都是有關聯的,下一次的“響應”是由於第一次的“請求”觸發,因此每次握手其實是可以得到額外的結論的。比如第三次握手時,服務端收到數據包,表明看服務端只能得到客戶端的發送能力、服務端的接收能力是正常的,但是結合第二次,說明服務端在第二次發送的響應包,客戶端接收到了,並且作出了響應,從而得到額外的結論:客戶端的接收、服務端的發送是正常的。

'''
建立客戶端與服務器端之間的雙向通路需要進行三次握手。
1、客戶端向服務器端發送SYN報文,請求建立連接,此時客戶端就處於 SYN_SENT 狀態
2、服務器監測並接收客戶端的SYN報文后返回一個ACK給客戶端表示確認並且也向客戶端
   發起建立連接請求的SYN報文,此時服務器端就會處於 SYN_RCVD 狀態
3、客戶端接收到服務器返回來的響應之后就會變成 ESTABLASHED 狀態表示客戶端到服
   務器端的通道建立成功,之后接收到服務器端傳過來的請求報文后同樣也返回一個ACK
   給服務器表示確認,服務器端接收到客戶端傳回的ACK后就會變成 ESTABLASHED 狀態
   最終服務器端到客戶端的傳輸通道建立完畢,至此客戶端與服務器之間的雙向通道建立完
   成,這就是三次握手。
'''

# 為什么不能是二次握手?(簡言之,二次握手會產生資源浪費)
'''
如果是兩次握手的情景: 
客戶端在發送一個連接建立請求之后進入等待狀態,等到服務端確認之后就進入established狀態。
服務端在發送一個確認連接建立請求報文之后(不管客戶端是否有回應)也進入established狀態。 
這就好比, A給B打電話, A:你聽得到我說話嗎? B:我聽得到啊 A和B就都以為對方都能聽得到自己了。
但有一種情況是,B的麥是壞的,A根本就聽不到B說話,結果A沒收到B的回應,但B卻以為A能聽得到他,
B就一直等着A說點什么...這樣讓B身心俱疲。

而三次握手:
客戶端在發送一個連接建立請求報文之后進入等待狀態,等到服務端返回確認建立連接的通知
服務端發送確認建立連接請求報文,同時向客戶端發送連接建立請求報文,進入等待狀態
客戶端接受到服務端發送的確認請求報文以及來自服務端的連接建立請求報文。進入established狀態
並發送確認連接建立請 求報文給服務端。服務端接受到來自客戶端的確認建立連接報文,進入established
A:你能聽得到我說話嗎? B:我聽得到啊,你能不能聽得到我說話? 
A:我也聽得到你啊。( established) B:(established) A和B都能明確知道對方肯定能聽得到自己說話

當然4次握手或者n次握手也可以但是沒有必要,因為如果建立連接的時間過長的話那么效果也就會大打折扣
'''

在這里插入圖片描述

  • SYN洪水攻擊

    '''
    SYN洪水攻擊:tcp是好人協議,不管是什么客戶端,只要向服務器發送了請求服務器就會接收並嘗試向客戶端建立連
    接。SYN洪水攻擊,就是利用建立大量的虛擬ip去向服務器發送請求,發完之后就消失,此時服務器就會被大量的
    虛擬ip所占滿了一直處於`SYN_RCVD`狀態,導致真正的客戶端再想訪問服務器就沒法訪問
    (類似於讓一群乞丐去堵一家公司的大門,導致公司員工無法進入公司)
    '''
    
  • 四次揮手

    # 斷開鏈接時,由於鏈接內有數據傳輸,所以必須分四次斷開
    

img

網絡通信——應用層

自定義協議

  • 在應用層如果覺得別人的協議過於的復雜,我們可以自定義協議=》頭部+數據部分

    # 自定義協議需要注意的問題:
    '''
    1、兩大組成部分=頭部+數據部分
       頭部:放對數據的描述信息
          比如:數據要發給誰,數據的類型,數據的長度
       數據部分:想要發的數據
    
    2、頭部的長度必須固定
      因為接收端要通過頭部獲取所接接收數據的詳細信息
    '''
    
    # 應用層的協議:http https ftp
    

Socket

socket的作用

  • 我們只需要負責應用層即可,傳輸層網絡層數據鏈路層以及物理層之間的通信,socket幫我們全部都處理好了,所以我們只要負責好應用層就可以利用socket來進心網絡通信了。

  • socket是位於應用層與傳輸層之間的一個抽象層它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用已實現進程在網絡中通信。

  • 也有人將socket說成ip+port,ip是用來標識互聯網中的一台主機的位置,而port是用來標識這台機器上的一個應用程序,ip地址是配置到網卡上的,而port是應用程序開啟的,ip與port的綁定就標識了互聯網中獨一無二的一個應用程序而程序的pid是同一台機器上不同進程或者線程的標識

    img程在網絡中通信。

小結

總結圖附上:

img

數據傳輸動圖如下

img


免責聲明!

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



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