1. 程式人生 > 程式設計 >執行python提示no module named sklearn的解決方法

執行python提示no module named sklearn的解決方法

UDP資料報

# 解析 UDP 協議
def udp_segment(data):
    src_port, dest_port, size = struct.unpack('! H H 2x H', data[:8])
    return src_port, dest_port, size, data[8:]

一、UDP的概述(User Datagram Protocol,使用者資料報協議)
UDP是傳輸層的協議,功能即為在IP的資料報服務之上增加了最基本的服務:複用和分用以及差錯檢測。

UDP提供不可靠服務,具有TCP所沒有的優勢:

  • UDP無連線,時間上不存在建立連線需要的時延。空間上,TCP需要在端系統中維護連線狀態,需要一定的開銷。此連線裝入包括接收和傳送快取,擁塞控制引數和序號與確認號的引數。UCP不維護連線狀態,也不跟蹤這些引數,開銷小。空間和時間上都具有優勢。
    舉個例子:

    DNS如果執行在TCP之上而不是UDP,那麼DNS的速度將會慢很多。
    HTTP使用TCP而不是UDP,是因為對於基於文字資料的Web網頁來說,可靠性很重要。
    同一種專用應用伺服器在支援UDP時,一定能支援更多的活動客戶機。

  • 分組首部開銷小**,TCP首部20位元組,UDP首部8位元組。

  • UDP沒有擁塞控制,應用層能夠更好的控制要傳送的資料和傳送時間,網路中的擁塞控制也不會影響主機的傳送速率。某些實時應用要求以穩定的速度傳送,能容 忍一些資料的丟失,但是不能允許有較大的時延(比如實時視訊,直播等)

  • UDP提供盡最大努力的交付,不保證可靠交付。所有維護傳輸可靠性的工作需要使用者在應用層來完成。沒有TCP的確認機制、重傳機制。如果因為網路原因沒有傳送到對端,UDP也不會給應用層返回錯誤資訊

  • UDP是面向報文的,對應用層交下來的報文,新增首部後直接鄉下交付為IP層,既不合並,也不拆分,保留這些報文的邊界。對IP層交上來UDP使用者資料報,在去除首部後就原封不動地交付給上層應用程序,報文不可分割,是UDP資料報處理的最小單位。
    正是因為這樣,UDP顯得不夠靈活,不能控制讀寫資料的次數和數量。比如我們要傳送100個位元組的報文,我們呼叫一次sendto函式就會發送100位元組,對端也需要用recvfrom函式一次性接收100位元組,不能使用迴圈每次獲取10個位元組,獲取十次這樣的做法。

  • UDP常用一次性傳輸比較少量資料的網路應用,如DNS,SNMP等,因為對於這些應用,若是採用TCP,為連線的建立,維護和拆除帶來不小的開銷。UDP也常用於多媒體應用(如IP電話,實時視訊會議,流媒體等)資料的可靠傳輸對他們而言並不重要,TCP的擁塞控制會使他們有較大的延遲,也是不可容忍的

二、UDP的首部格式

UDP資料報分為首部和使用者資料部分,整個UDP資料報作為IP資料報的資料部分封裝在IP資料報中,UDP資料報文結構如圖所示:

UDP首部有8個位元組,由4個欄位構成,每個欄位都是兩個位元組,
1.源埠: 源埠號,需要對方回信時選用,不需要時全部置0.
2.目的埠:目的埠號,在終點交付報文的時候需要用到。
3.長度:UDP的資料報的長度(包括首部和資料)其最小值為8(只有首部)
4.校驗和:檢測UDP資料報在傳輸中是否有錯,有錯則丟棄。
該欄位是可選的,當源主機不想計算校驗和,則直接令該欄位全為0.
當傳輸層從IP層收到UDP資料報時,就根據首部中的目的埠,把UDP資料報通過相應的埠,上交給應用程序。
如果接收方UDP發現收到的報文中的目的埠號不正確(不存在對應埠號的應用程序0,),就丟棄該報文,並由ICMP傳送“埠不可達”差錯報文給對方。

UDP校驗

在計算校驗和的時候,需要在UDP資料報之前增加12位元組的偽首部,偽首部並不是UDP真正的首部。只是在計算校驗和,臨時新增在UDP資料報的前面,得到一個臨時的UDP資料報。校驗和就是按照這個臨時的UDP資料報計算的。偽首部既不向下傳送也不向上遞交,而僅僅是為了計算校驗和。這樣的校驗和,既檢查了UDP資料報,又對IP資料報的源IP地址和目的IP地址進行了檢驗。

UDP校驗和的計算方法和IP資料報首部校驗和的計算方法相似,都使用二進位制反碼運算求和再取反,但不同的是:IP資料報的校驗和之檢驗IP資料報和首部,但UDP的校驗和是把首部和資料部分一起校驗。

傳送方,首先是把全零放入校驗和欄位並且新增偽首部,然後把UDP資料報看成是由許多16位的子串連線起來,若UDP資料報的資料部分不是偶數個位元組,則要在資料部分末尾增加一個全零位元組(此位元組不傳送),接下來就按照二進位制反碼計算出這些16位字的和。將此和的二進位制反碼寫入校驗和欄位。在接收方,把收到得UDP資料報加上偽首部(如果不為偶數個位元組,還需要補上全零位元組)後,按二進位制反碼計算出這些16位字的和。當無差錯時其結果全為1,。否則就表明有差錯出現,接收方應該丟棄這個UDP資料報。

注意:
1.校驗時,若UDP資料報部分的長度不是偶數個位元組,則需要填入一個全0位元組,但是次位元組和偽首部一樣,是不傳送的。
2.如果UDP校驗和校驗出UDP資料報是錯誤的,可以丟棄,也可以交付上層,但是要附上錯誤報告,告訴上層這是錯誤的資料報。
3.通過偽首部,不僅可以檢查源埠號,目的埠號和UDP使用者資料報的資料部分,還可以檢查IP資料報的源IP地址和目的地址。
這種差錯檢驗的檢錯能力不強,但是簡單,速度快