一,udp
linux udp資料結構
\linux-2.6.32.27\include\linux\udp.h
udp頭部資料結構
struct udphdr ;
,由此知,16bit*4=64bit=8位元組,udp首部長度8位元組。
如果tcp和udp同時提供某種知名服務,兩個協議通常選擇相同的埠號,這純粹是為了使用的方便,而不是協議本身規定的
需要注意的是udp資料長度指(payload加上首部的長度)。
參考:linux下tftp協議實現(伺服器端、客戶端)
下面分析一幀基於udp的tftp協議幀:
乙太網首部
0000: 00 05 5d 67 d0 b1
00 05 5d 61 58 a8
08 00
乙太網首部:源mac位址是00:05:5d:61:58:a8,目的mac位址是00:05:5d:67:d0:b1,上層協議型別0x0800表示ip。
ip首部
0000: 45
000010: 00 53
93 25
00 00
8011
25 ec
c0 a8 00 37
c0 a8
0020: 00 01
ip首部:每乙個位元組0x45包含4位版本號和4位首部長度,版本號為4,即ipv4,首部長度為5,說明ip首部不帶有選項字段。服務型別為0,沒有使用服務。
16位總長度字段(包括ip首部和ip層payload的長度)為0x0053,即83位元組,加上乙太網頭部14+4位元組校驗可知整個幀長度是101位元組
。ip報標識是0x9325,標誌欄位和片偏移字段設定為0x0000,就是df=0允許分片,mf=0此資料報沒有更多分片,沒有分片偏移。ttl是0x80,也就是128。上層協議0x11表示udp協議。ip首部校驗和為0x25ec,源主機ip是c0 a8 00 37(192.168.0.55),目的主機ip是c0 a8 0001(192.168.0.1)。
udp首部
0020: 05 d4
00 45
00 3f
ac 40
udp首部:源埠號0x05d4(1492)是客戶端的埠號,目的埠號0x0045(69)是tftp服務的well-known埠號。
udp報長度為0x003f,即63位元組
,包括udp首部和udp層payload的長度。udp首部和udp層payload的校驗和為0xac40。
tftp協議
0020: 00 01 'c' ':' '\' 'q' (4) + 2
0030: 'w' 'e' 'r' 'q' '.' 'q' 'w' 'e' 00 'n' 'e' 't' 'a' 's' 'c' 'i' (15) + 1
0040: 'i' 00 'b' 'l' 'k' 's' 'i' 'z' 'e' 00 '5' '1' '2' 00 't' 'i' (13) + 3
0050: 'm' 'e' 'o' 'u' 't' 00 '1' '0' 00 't' 's' 'i' 'z' 'e' 00 '0' (13) + 3
0060: 00 +1
----4+15+13+13 + (2+1+3+3+1) = 55
tftp(trivial file transfer protocol,簡單檔案傳輸協議)是tcp/ip協議族中的
乙個用來在客戶機與伺服器之間進行簡單檔案傳輸的協議,
提供不複雜、開銷不大的檔案傳輸服務。埠號為69。
tftp是基於文字的協議,各欄位之間用位元組0分隔,開頭的00 01表示請求讀取乙個檔案,接下來的各字段是:
c:\qwerq.qwe
netascii
blksize 512
timeout 10
tsize 0
耐心地數一下,可知道tftp的純資料供55位元組(udp payload),加上udp頭部8位元組,就是63位元組,也就是前面說的udp 頭部字段記錄的udp資料長度,再加上ip頭部20位元組,也就是83位元組,即前面說的ip頭部記錄的ip包大小,即udp payload + udp頭部 可以當作ip 層的payload,
ip層payload + ip頭部 =83位元組,加上乙太網頭部14位元組,尾部校驗4位元組,總共101位元組,即完整的一幀資料幀。
一般的網路通訊都是像tftp協議這樣,通訊的雙方分別是客戶端和伺服器,客戶端主動發起請求(上面的例子就是客戶端發起的請求幀),而伺服器被動地等待、接收和應答請求。客戶端的ip位址和埠號唯一標識了該主機上的tftp客戶端程序,伺服器的ip位址和埠號唯一標識了該主機上的tftp服務程序,由於客戶端是主動發起請求的一方,它必須知道伺服器的ip位址和tftp服務程序的埠號,所以,一些常見的網路協議有預設的伺服器端口,例如http服務預設tcp協議的80埠,ftp服務預設tcp協議的21埠,tftp服務預設udp協議的69埠(如上例所示)。在使用客戶端程式時,必須指定伺服器的主機名或ip位址,如果不明確指定埠號則採用預設埠,可以查閱ftp、tftp等程式的man page了解如何指定埠號。/etc/services中列出了所有well-known的服務埠和對應的傳輸層協議,這是由iana(internet assigned numbers authority)規定的,其中有些服務既可以用tcp也可以用udp,為了清晰,iana規定這樣的服務採用相同的tcp或udp預設埠號,而另外一些tcp和udp的相同埠號卻對應不同的服務。
很多服務有well-known的埠號,然而客戶端程式的埠號卻不必是well-known的,往往是每次執行客戶端程式時由系統自動分配乙個空閒的埠號,用完就釋放掉,稱為ephemeral的埠號。
udp協議不面向連線,也不保證傳輸的可靠性,例如:
1、傳送端的udp協議層只管把應用層傳來的資料封裝成段交給ip協議層就算完成任務了,如果因為網路故障該段無法發到對方,udp協議層也不會給應用層返回任何錯誤資訊。
2、接收端的udp協議層只管把收到的資料根據埠號交給相應的應用程式就算完成任務了,如果傳送端發來多個資料報並且在網路上經過不同的路由,到達接收端時順序已經錯亂了,udp協議層也不保證按傳送時的順序交給應用層。
3、通常接收端的udp協議層將收到的資料放在乙個固定大小的緩衝區中等待應用程式來提取和處理,如果應用程式提取和處理的速度很慢,而傳送端傳送的速度很快,就會丟失資料報,udp協議層並不報告這種錯誤。
因此,使用udp協議的應用程式必須考慮到這些可能的問題並實現適當的解決方案,例如等待應答、超時重發、為資料報編號、流量控制等。一般使用udp協議的應用程式實現都比較簡單,只是傳送一些對可靠性要求不高的訊息,而不傳送大量的資料。例如,基於udp的tftp協議一般只用於傳送小檔案(所以才叫trivial的ftp),而基於tcp的ftp協議適用於各種檔案的傳輸。
TFTP幀協議詳解
tftp,全稱是 trivial file transfer protocol 簡單檔案傳輸協議 基於 udp 的69埠實現,是最簡單的檔案傳輸網路協議,該協議只能從遠端伺服器讀取檔案或向遠端伺服器上傳檔案。雖然 tftp 不具備 ftp 的許多功能,但是實現簡單,記憶體占用很小,在uboot等小型...
python實現簡單tftp 基於udp
from threading import thread from socket import import struct def upload filename,user ip,user port num 0 f open filename,ab s up socket af inet,sock ...
基於UDP協議的socket程式設計
一 socket概述 1.socket一般被稱為 套接字 網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端就叫做socket。2.建立網路通訊連線至少需要乙個埠號 socket socket利用網路之間的通訊設施實現程序通訊,但它對通訊設施的細節不關心,只要通訊設施能夠提供足夠的...