php udp傳送和接收 學習筆記 UDP簡單理解

2021-10-14 07:37:53 字數 2800 閱讀 3644

上一章節我們介紹了tcp(詳見學習筆記-tcp簡單理解),這一章節我們來學習一下udp。

udp 是user datagram protocol的簡稱, 中文名是使用者資料報協議,是(open system interconnection,osi) 參考模型中一種無連線的協議,它是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。ietf rfc 768 是udp的正式規範。udp在ip報文的協議號是17。

使用者資料報 udp 有兩個字段:資料字段和首部字段。首部欄位很簡單,只有8個位元組,由四個字段組成,每個欄位都是兩個位元組

目的埠 :目的埠號。這在終點交付報文時必須使用

長度:udp 使用者資料報的長度,其最小值是8(僅有首部)

檢驗和: 檢測 udp 使用者資料報在傳輸中是否有錯。有錯就丟棄。udp和tcp的校驗和都覆蓋到了它們的首部和資料。

偽首部的源ip位址欄位和目的ip位址字段記錄了傳送udp報文時使用的源ip位址和目的ip位址。協議字段指明了所使用的協議型別**(udp是17),而長度欄位是udp資料報的長度。接收方進行正確性驗證的時候,必須要把這些欄位的資訊從ip報文的首部中抽取出來,以偽首部的格式進行裝配,然後再重新計算校驗和。

udp 使用者資料報首部中檢驗和的計算方法有些特殊。在計算檢驗和時,要在 udp 使用者資料報之前增加 12 個位元組的偽首部。所謂"偽首部"是因為這種偽首部並不是 udp 使用者資料報真正的首部。只是在計算檢驗和時,臨時新增在 udp 使用者資料報前面,得到乙個臨時的 udp 使用者資料報。檢驗和就是按照這個臨時使用者資料報來計算的。偽首部既不向下傳也不向上遞交,而僅僅是為了計算檢驗和

udp是乙個無連線協議。即傳送資料之前不需要建立連線(傳送資料結束時也沒有連線可釋放),減少了開銷和傳送資料之前的時延。傳輸資料時就簡單地去抓取來自應用程式的資料,並盡可能快地把它扔到網路上。

盡最大努力交付。即不保證可靠交付,主機不需要維持複雜的連線狀態表。

udp是面向報文的。傳送方的 udp 對應用程式交下來的報文,在新增首部後就向下交付 ip 層。udp 對應用層交下來的報文,既不合併,也不拆分,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。

udp 的首部開銷小。只有8個位元組,比 tcp 的20個位元組的首部要短

udp 沒有擁塞控制。吞吐量不受擁擠控制演算法的調節,只受生成資料的速率、傳輸頻寬、源端和終端主機效能的限制。網路出現的擁塞不會使源主機的傳送速率降低。

udp 支援一對

一、一對多、多對一和多對多的互動通訊。

①開銷更小。tcp為了保證其可靠性,首部包含20位元組,以及40位元組的可選項,udp首部只有8位元組

②速度更快。udp傳送資料之前沒有tcp的連線建立過程。tcp提供了過多的保護,在及時性上做了很多的妥協,比如:控制微包(nagle演算法),延時ack,流量控制,超時重傳等,這些設計嚴重影響了tcp的速度和及時性

①丟失和亂序。因為udp不提供ack、序列號等機制,所以是沒有辦法知道是否有報文丟失以及接收方到達等報文順序是否和傳送方傳送的報文資料一樣;

②差錯。對於差錯問題則是可以通過校驗和等檢測到,但是不提供差錯糾正。

③資料完整性。udp協議頭部雖然有16位的校驗和,但是ipv4並不強制執行,也就是說udp無法保證資料的完整性

在交給ip層之前,udp給使用者要傳送的資料加上乙個首部。ip層又給從udp接收到的資料報加上乙個首部。最後,網路介面層把資料報封裝到乙個幀裡,再進行機器之間的傳送。如圖所示。幀的結構根據底層的網路技術來確定。通常網路幀結構包括乙個附加的首部。

協議各層的軟體都要對相鄰層的多個物件進行多路復用和多路分解操作。udp軟體接收多個應用程式送來的資料報,把它們送給ip層進行傳輸,同時它接收從ip層送來的udp資料報,並把它們送給適當的應用程式。udp軟體與應用程式之間所有的多路復用和多路分解都要通過埠機制來實現。實際上,每個應用程式在傳送資料報之前必須與作業系統進行協商,以獲得協議埠和相應的埠號。當指定了埠之後,凡是利用這個埠傳送資料報的應用程式都要把埠號放入udp報文的源埠欄位中。在處理輸入時,udp從ip層軟體接收了傳入的資料報,根據udp的目的埠號進行多路分解操作,如下圖。理解udp端的最簡單的方式是把它看成是乙個佇列。在大多數實現中,當應用程式與作業系統協商,試圖使用某個給定埠時,作業系統就建立乙個內部佇列來容納收到的報文。通常應用程式可以指定和修改這個佇列的長度。當udp收到資料報時,先檢查當前使用的埠是否就是該資料報的目的埠。如果不能匹配,則傳送乙個icmp埠不可達報文並丟棄這個資料報。如果匹配,它就把這個資料報送到相應的佇列中,等待應用程式的訪問。當然,如果埠已滿也會出錯,udp也要丟棄傳入的這個資料報。

C tcpClient傳送和接收

先做乙個簡單的tcpclient收發功能。先簡單做乙個介面。引入命名空間 using system.net.sockets using system.net 其中定義了三個按鈕,分別是建立連線,接收和傳送。c 中的tcp通訊實質就是socket通訊。private void button1 clic...

python tcp 傳送和接收

import socket def main 1.建立tcp的套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2.鏈結伺服器 tcp socket.connect 192.168.33.11 7890 server ip ...

Jmail傳送和接收郵件

一 利用jmail傳送郵件 1 2 利用jmail傳送郵件 3 4private void sendmailbyjmail 545 46 郵件內容 47 ojmailmessage.body txtcontent.text.trim 4849 if ojmailmessage.send txtsmt...