16為UDP長度,表示整個數據報(UDP首部+UDP數據)的最大長度(64KB)
檢驗和:如果校驗和出錯,就會直接丟棄(檢驗的是把首部和數據部分一起都檢驗)
校驗值首先在數據發(fā)送方通過特殊的算法計算得出,在傳遞到接收方之后,還要在重新計算。如果某個數據報在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗計算值將不會相符,由此UDP協(xié)議可以檢驗是否出錯。
源端口號:在對方回信是選用,不需要時可用全0
目的端口號:在終點交付報時必須要用到
長度:UDP用戶數據報的長度,其最小值是8(僅有首部)
UDP的特點
無連接:直到對端的IP和端口號就直接進行傳輸,不需要建立連接
不可靠:沒有確認機制,沒有重傳機制;因為沒有網絡故障該段無法發(fā)送到對方,UDP協(xié)議層也不會給應用層返回任何錯誤信息
面向數據報:不能夠靈活的控制讀寫數據的次數和數量
控制選項較少,數據傳輸過程中延遲小,數據傳輸效率高
面向數據報
應用層交給UDP多長的報文,UDP原樣發(fā)送,既不會拆分也不會合并
例:用UDP傳輸100個字節(jié)的數據
如果發(fā)送端調用一次sendto,發(fā)送100個字節(jié)。那么接收端也必須調用對應的一次recvfrom,接收100字節(jié);而不能循環(huán)調用10次recvfrom,每次發(fā)送10個字節(jié)
UDP的緩存區(qū)
UDP沒有發(fā)送緩存區(qū),調用sendto之后會直接交給內核,由內核·將數據傳給網絡層協(xié)議進行后續(xù)的傳輸動作。因為UDP是不面向連接的,所以沒有重發(fā)機制,也就不需要發(fā)送緩存區(qū)將已經發(fā)送的數據保存下來為了發(fā)送失敗進行重傳做準備
UDP具有接收緩存區(qū)。但是這個接收緩存區(qū)不能保證收到的UDP報的順序和發(fā)送UDP報的順序一致;如果緩存區(qū)滿了,在到達的UDP數據就會被丟棄
UDP的使用注意事項
UDP協(xié)議首部中有一個16位的最大長度,也就是說一個UDP能傳輸的數據的最大長度是64K(包含UDP首部)。但是64K在當今的互聯網環(huán)境下,是一個非常小的數字。如果我們需要傳輸的數據超過64K,就需要應用層手動的分包,多次發(fā)送,并在接收端拼裝
UDP首部中校驗和的計算方法有些特殊。在計算校驗和時,要在UDP用戶數據報之前增加12個字節(jié)的偽首部
偽首部既不向下傳輸也不想上遞送,而僅僅是為了計算校驗和
與IP數據報的校驗和只檢驗IP數據報的首部不同,UDP的校驗和是把首部和數據部分一起都檢驗
偽首部:
基于UDP的應用層的協(xié)議
NFS:網絡文件系統(tǒng)
TFTP:簡單文件傳輸文件協(xié)議
DHCP:動態(tài)主機配置協(xié)議
DNS:域名解析協(xié)議
對于UDP書寫服務器的思路
由于UDP是無連接的,所以對于兩個處于同一局域網下計算機的進程之間通信,是不需要兩臺計算機之間的進程進行連接的,對于UDP使用的接口是需要包含知道從哪里接收消息的,要發(fā)送消息到哪里的。
實現本地通信
服務器
只需要在服務器創(chuàng)建一個套接字
使該套接字對于本地地址(127.0.0.1)進行綁定,并且綁定一個端口號(1024--65535)就行
綁定本地地址是為了對于本地計算機的兩個進程進程通信,而綁定端口號是為了綁定一個進程,是為了對于客戶端進行發(fā)送消息到服務器的時候,可以找到服務器
然后就接受客戶端發(fā)來的消息
對于客戶端的消息進行處理然后就可以再次將處理后的消息進行返回
客戶端
綁定一個套接字
為了綁定一個進程,可以和服務器進行通信,將消息發(fā)送過去的時候要讓服務器知道是哪一個進程再和他進程通信
客戶端只需要向服務器發(fā)送消息
然后再次從客戶端接收消息就好了,不需要考慮要進行連接
實現處于同一局域網下的不同主機間進行通信
和本地通信的一致,只是對于套接字綁定的ip地址不一樣了
也對于套接字要綁定該局域網的ip地址以及一個端口號,不需要在綁定本地地址(127.0.0.1)
這樣的話處于同一局域網下的計算機的進程就可以進行通信了
對于客戶端來說沒有任何改變,仍然是只需要知道服務器的ip和端口號就行了
對于UDP服務器要注意的問題
啟動客戶端
啟動客戶端的時候必須給客戶端輸入一個ip地址和端口號,這個ip地址和端口號也就是要知道客戶端要發(fā)送消息給哪一個服務器進行發(fā)送
啟動服務器
必須要給服務器綁定一個ip地址和端口號,也就是要注意該服務器處于該計算機上的哪一個進程上