tftp(TFTP協定)

tftp

TFTP協定一般指本詞條

TFTP(Trivial File Transfer Protocol,簡單檔案傳輸協定)是TCP/IP協定族中的一個用來在客戶機與伺服器之間進行簡單檔案傳輸的協定,提供不複雜、開銷不大的檔案傳輸服務連線埠號為69。

基本介紹

  • 中文名:簡單檔案傳送協定
  • 外文名:Trivial File Transfer Protocol
  • 使用的數據報:UDP數據報
  • 簡稱:TFTP
  • 作用:規範簡單檔案傳輸
目的,概況,特點,初始連線,相關套用,正常終止,早終結,其它相關,相關協定,內部命令,

目的

TFTP是一個傳輸檔案的簡單協定,它基於UDP協定而實現,但是我們也不能確定有些TFTP協定是基於其它傳輸協定完成的。此協定設計的時候是進行小檔案傳輸的。因此它不具備通常的FTP的許多功能,它只能從檔案伺服器上獲得或寫入檔案,不能列出目錄,不進行認證,它傳輸8位數據。傳輸中有三種模式:netascii,這是8位的ASCII碼形式,另一種是octet,這是8位源數據類型;最後一種mail已經不再支持,它將返回的數據直接返回給用戶而不是保存為檔案。

概況

任何傳輸起自一個讀取或寫入檔案的請求,這個請求也是連線請求。如果伺服器批准此請求,則伺服器打開連線,數據以定長512位元組傳輸。每個數據包包括一塊數據,伺服器發出下一個數據包以前必須得到客戶對上一個數據包的確認。如果一個數據包的大小小於512位元組,則表示傳輸結束。如果數據包在傳輸過程中丟失,發出方會在逾時後重新傳輸最後一個未被確認的數據包。通信的雙方都是數據的發出者與接收者,一方傳輸數據接收應答,另一方發出應答接收數據。大部分的錯誤會導致連線中斷,錯誤由一個錯誤的數據包引起。這個包不會被確認,也不會被重新傳送,因此另一方無法接收到。如果錯誤包丟失,則使用逾時機制。錯誤主要是由下面三種情況引起的:不能滿足請求,收到的數據包內容錯誤,而這種錯誤不能由延時或重發解釋,對需要資源的訪問丟失(如硬碟滿)。TFTP只在一種情況下不中斷連線,這種情況是源連線埠不正確,在這種情況下,指示錯誤的包會被傳送到源機。這個協定限制很多,這些都是為了實現起來比較方便而進行的。

特點

因為TFTP使用UDP,而UDP使用IP,IP可以還使用其它本地通信方法。因此一個TFTP包中會有以下幾段:本地媒介頭,IP頭,數據報頭,TFTP頭,剩下的就是TFTP數據了。TFTP在IP頭中不指定任何數據,但是它使用UDP中的源和目標連線埠以及包長度域。由TFTP使用的包標記(TID)在這裡被用做連線埠,因此TID必須介於0到65,535之間。對它的初始化我們在後面討論。TFTP頭中包括兩個位元組操作碼,這個碼指出了包的類型,下面我們看看大體上的TFTP包格式,相關的內容我們在後面的章節中進行討論。
---------------------------------------------------
| Local Medium | Internet | Datagram | TFTP |
---------------------------------------------------
圖3-1: 包頭次序
TFTP不具備通常的FTP的許多功能,它只能從檔案伺服器上獲得或寫入檔案,沒有列出目錄的功能,也不能對用戶進行身份鑑別,它傳輸8位數據。
但是TFTP也有著它自身的兩個優點。
  1. TFTP可用於UDP環境;比如當需要將程式或者檔案同時向許多機器下載時就往往需要使用到TFTP協定。
  2. TFTP代碼所占的記憶體較小,這對於較小的計算機或者某些特殊用途的設備來說是很重要的,這些設備不需要硬碟,只需要固化了TFTP、UDP和IP的小容量唯讀存儲器即可。當電源接通後,設備執行唯讀存儲器中的代碼,在網路上廣播一個TFTP請求。網路上的TFTP伺服器就傳送回響,其中包括可執行二進制程式。設備收到此檔案後將其放入記憶體,然後開始運行程式。這種方式增加了靈活性,也減少了開銷。

初始連線

初始連線時候需要發出WRQ(請求寫入遠程系統)或RRQ(請求讀取遠程系統),收到一個確定應答,一個確定可以寫出的包或應該讀取的第一塊數據。通常確認包包括要確認的包的包號,每個數據包都與一個塊號相對應,塊號從1開始而且是連續的。因此對於寫入請求的確定是一個比較特殊的情況,因此它的包的包號是0。如果收到的包是一個錯誤的包,則這個請求被拒絕。創建連線時,通信雙方隨機選擇一個TID,因為是隨機選擇的,因此兩次選擇同一個ID的可能性就很小了。每個包包括兩個TID,傳送者ID和接收者ID。這些ID用於在UDP通信時選擇連線埠,請求主機選擇ID的方法上面已經說過了,在第一次請求的時候它會將請求發到TID 69,也就是伺服器的69連線埠上。應答時,伺服器使用一個選擇好的TID作為源TID,並用上一個包中的TID作為目的ID進行傳送。這兩個被選擇的ID在隨後的通信中會被一直使用。下例是一個寫入的例子,其中WRQ,ACK和DATA代表寫入請求,確認和數據。

相關套用

1.主機A向主機B發出WRQ,其中連線埠為69
2. B機向A機發出ACK,塊號為0,包括B和A的TID
此時連線建立,第一個數據包序列號1從主機開始發出。以後兩台主機要保證以開始時確定的TID進行通信。如果源ID與原來確定的ID不一樣,這個包會被認識為傳送到了錯誤的地址而被拋棄。錯誤的包是被傳送到正確連線埠的,但是包本身有錯誤。構想傳送方發出一個請求,這個請求在網路的那個設備中被複製成兩個包,接收方先後接收到兩個包。接收方會認為為這是兩個獨立的請求,會返回兩個應答。當這兩個應答其中之一被接收到時,連線已經建立。第二個應答再到達時,這個包會被拋棄,而不會因為接收到第二個應答包而導致第一個建立的連線失敗。
5. TFTP包
TFTP支持五種類型的包,我們在以上已經說明這五種類型的包:
opcode operation
1.Read request (RRQ)
2.Write request (WRQ)
3.Data (DATA)
4.Acknowledgment (ACK)
5.Error (ERROR)
包頭中包括了這個包所指定的操作碼
2.bytes string 1 byte string 1 byte
| Opcode | Filename | 0 | Mode | 0
Figure 5-1: RRQ/WRQ包
RRQ和WRQ包(代碼分別為1和2)的格式如上所示。檔案名稱是NETASCII碼字元,以0結束。而MODE域包括了字元串"netascii","octet"或"mail",名稱不分大小寫。接收到NETASCII格式數據的主機必須將數據轉換為本地格式。OCTET模式用於傳輸檔案,這種檔案在源機上以8位格式存儲。假設每個機器都存在一個8位的格式,這樣的假設是最一般的。比如DEC-20,這是一種36位機,我們可以假設它是4個8位外加另外4位而構成。如果機器收到OCTET格式檔案,返回時必須與原來檔案完全一樣。在使用MAIL模式時,用戶可以在FILE處使用接收人地址,這個地址可以是用戶名或用戶名@主機的形式,如果是後一種形式,允許主機使用電子郵件傳輸此檔案。如果使用MAIL類型,包必須以WRQ開始,否則它與NETASCII完全一樣。我們的討論建立在傳送方和接收方都在相同模式的情況下,但是雙方可以以不同的模式進行傳輸。例如一個機器可以是一台存儲伺服器,這樣一台伺服器需要將NETASCII格式轉換為自己的格式。另外,我們可以構想DEC-20這種機器,它使用36位字長,用戶這邊可以使用特殊的機制一次讀取36位,而伺服器卻可以仍然使用8位格式。在這兩種情況下,我們看到了兩台機器使用不同格式的情況。可以在兩台主機間定義其它的傳輸方式,但是定義要小心,因為這種傳輸方式不為人知,而且也沒有權威機構為其指定名稱或定義它的模式。
2.bytes 2 bytes n byte
| Opcode | Block # | Data |
Figure 5-2: DATA包
數據在數據包中傳輸,其格式如上圖所示。數據包的OP碼為3,它還包括有一個數據塊號和數據。數據塊號域從1開始編碼,每個數據塊加1,這樣接收方可以確定這個包是新數據還是已經接收過的數據。數據域從0位元組到512位元組。如果數據域是512位元組則它不是最後一個包,如果小於512位元組則表示這個包是最後一個包。除了ACK和用於中斷的包外,其它的包均得到確認。發出新的數據包等於確認上次的包。WRQ和DATA包由ACK或ERROR數據包確認,而RRQ數據包由DATA或ERROR數據包確認。下圖即是一個ACK包,操作碼為4。其中的包號為要確認的數據包的包號。
2.bytes 2 bytes
---------------------
| Opcode | Block # |
---------------------
Figure 5-3: ACK包
WRQ數據包被ACK數據包確認,WRQ數據包的包號為0。
2.bytes 2 bytes string 1 byte
| Opcode | ErrorCode | ErrMsg | 0 |
Figure 5-4: ERROR包
一個ERROR包,它的操作碼是5,它的格式如上所示。此包可以被其它任何類型的包確認。錯誤碼指定錯誤的類型。錯誤的值和錯誤的意義在附錄中。錯誤信息是供程式設計師使用的。

正常終止

傳輸的結束由DATA數據標記,其包括0-511個字元。這個包可以被其它數據包確認。接收方在發出對最後數據包的確認後可以下線,當然,適當的等待是比較好的,如果最後的確定包丟失可以再次傳輸。如果發出確認後仍然收到最後數據包,可以確定最後的確認丟失。傳送最後一個DATA包的主機必須等待對此包的確認或逾時。如果回響是ACK,傳輸完成。如果傳送方逾時並不準備重新傳送並且接收方有問題或網路有問題時,傳送也正常結束。當然實現時也可以是非正常結束,但無論如何連線都將被關閉。

早終結

如果請求不能被滿足,或者在傳輸中發生錯誤,需要傳送ERROR包。這僅是一種傳輸友好的方式,這種包不會被確認也不會被重新傳輸,因此這種包可能永遠不會被接收到。因此需要用逾時來偵測錯誤。

其它相關

I. 附錄
包頭的次序
2.bytes
----------------------------------------------------------
| Local Medium | Internet | Datagram | TFTP Opcode |
----------------------------------------------------------
TFTP格式
Type Op # 沒有包頭的格式
2.bytes string 1 byte string 1 byte
-----------------------------------------------
RRQ/ | 01/02 | Filename | 0 | Mode | 0 |
WRQ -----------------------------------------------
2.bytes 2 bytes n bytes
---------------------------------
DATA | 03 | Block # | Data |
---------------------------------
2.bytes 2 bytes
-------------------
ACK | 04 | Block # |
--------------------
2.bytes 2 bytes string 1 byte
----------------------------------------
ERROR | 05 | ErrorCode | ErrMsg | 0 |
----------------------------------------
讀檔案的初始連線
1.主機A發RRQ到A,包括源=A的ID和目的=69
2.主機B傳送DATA,其中包號=1,這個包被傳送到A,源=B的ID,目的=A的ID
錯誤碼
Value Meaning
0 未定義,請參閱錯誤信息(如果提示這種信息的話)
1.檔案未找到
2.訪問非法
3.磁碟滿或超過分配的配額
4.非法的TFTP操作
5.未知的傳輸ID
6.檔案已經存在
7.沒有類似的用戶
Internet用戶數據報頭
(TFTP不一定非要在UDP上實現。)
Format
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length | Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
域的值
Source Port 由傳輸發起方選擇
Dest. Port 由目的地選擇(如果是RRQ或WRQ,其值為69)
Length 包括UDP包頭的包長度
Checksum 校驗碼,如果是0,則未使用校驗
注意:TFTP將傳輸標記TID傳送給UDP作為源和目的連線埠
安全問題
因為TFTP沒有安全控制機制,因此安全問題應該多加考慮。通常TFTP允許下載數據而不允許上傳數據。

相關協定

TFTP協定的優勢
儘管與FTP相比TFTP的功能要弱得多,但是TFTP具有兩個優點:
1)TFTP能夠用於那些有UDP而無TCP的環境;
2)TFTP代碼所占的記憶體要比FTP小。
儘管這兩個優點對於普通計算機來說並不重要,但是對於那些不具備磁碟來存儲系統軟體的自舉硬體設備來說TFTP特別有用。
TFTP協定與FTP協定的相同點
TFTP協定的作用和我們經常使用的FTP大致相同,都是用於檔案傳輸,可以實現網路中兩台計算機之間的檔案上傳與下載。可以將TFTP協定看作是FTP協定的簡化版本。
TFTP協定與FTP協定的不同點
1)TFTP協定不需要驗證客戶端的許可權,FTP需要進行客戶端驗證;
2)TFTP協定一般多用於區域網路以及遠程UNIX計算機中,而常見的FTP協定則多用於網際網路中;
3)FTP客戶與伺服器間的通信使用TCP,而TFTP客戶與伺服器間的通信使用的是UDP;
4)TFTP只支持檔案傳輸。也就是說,TFTP不支持互動,而且沒有一個龐大的命令集。最為重要的是,TFTP不允許用戶列出目錄內容或者與伺服器協商來決定哪些是可得到的檔案。

內部命令

FTP命令是Internet用戶使用最頻繁的命令之一,不論是在DOS還是UNIX作業系統下使用FTP,都會遇到大量的FTP內部命令。熟悉並靈活套用FTP的內部命令,可以大大方便使用者,並收到事半功倍之效。
FTP的命令行格式為:ftp-v-d-i-n-g[主機名],其中
-v顯示遠程伺服器的所有回響信息;
-n限制ftp的自動登錄,即不使用;
.netrc檔案;
-d使用調試方式;
-g取消全局檔案名稱。
ftp使用的內部命令如下(中括弧表示可選項):
1.![cmd[args>:在本地機中執行互動shell,exit回到ftp環境,如:!ls*
.zip.
2.$macro-ame[args]:執行宏定義macro-name.
3.account[password]:提供登錄遠程系統成功後訪問系統資源所需的補充口令。
4.appendlocal-file[remote-file]:將本地檔案追加到遠程系統主機,若未指定遠程系統檔案名稱,則使用本地檔案名稱。
5.ascii:使用ascii類型傳輸方式。
6.bell:每個命令執行完畢後計算機響鈴一次。
7.bin:使用二進制檔案傳輸方式。
8.bye:退出ftp會話過程。
9.case:在使用mget時,將遠程主機檔案名稱中的大寫轉為小寫字母。
10.cdremote-dir:進入遠程主機目錄。
11.cdup:進入遠程主機目錄的父目錄。
12.chmodmodefile-name:將遠程主機檔案file-name的存取方式設定為mo
de,如:chmod777a.out。
13.close:中斷與遠程伺服器的ftp會話(與open對應)。
14. cr:使用asscii方式傳輸檔案時,將回車換行轉換為回行。
15.deleteremote-file:刪除遠程主機檔案。
16.debug[debug-value]:設定調試方式,顯示傳送至遠程主機的每條命令,如:debup3,若設為0,表示取消debug。
17.dir[remote-dir][local-file]:顯示遠程主機目錄,並將結果存入本地檔案local-file。
18.disconnection:同close。
19.formformat:將檔案傳輸方式設定為format,預設為file方式。
20.getremote-file[local-file]:將遠程主機的檔案remote-file傳至本地硬碟的local-file。
21.glob:設定mdelete,mget,mput的檔案名稱擴展,預設時不擴展檔案名稱,同命令行的-g參數。
22.hash:每傳輸1024位元組,顯示一個hash符號(#)。
23.help[cmd]:顯示ftp內部命令cmd的幫助信息,如:helpget。
24.idle[seconds]:將遠程伺服器的休眠計時器設為[seconds]秒。
25.image:設定二進制傳輸方式(同binary)。
26.lcd[dir]:將本地工作目錄切換至dir。
27. ls[remote-dir][local-file]:顯示遠程目錄remote-dir,並存入本地檔案local-file。
28.macdefmacro-name:定義一個宏,遇到macdef下的空行時,宏定義結束。
29.mdelete[remote-file]:刪除遠程主機檔案。
30.mdirremote-fileslocal-file:與dir類似,但可指定多個遠程檔案,如:mdir*.o.*.zipoutfile。
31.mgetremote-files:傳輸多個遠程檔案。
32.mkdirdir-name:在遠程主機中建一目錄。
33.mlsremote-filelocal-file:同nlist,但可指定多個檔案名稱。
34.mode[modename]:將檔案傳輸方式設定為modename,預設為stream方式。
35.modtimefile-name:顯示遠程主機檔案的最後修改時間。
36.mputlocal-file:將多個檔案傳輸至遠程主機
37.newerfile-name:如果遠程機中file-name的修改時間比本地硬碟同名
檔案的時間更近,則重傳該檔案。
38.nlist[remote-dir][local-file]:顯示遠程主機目錄的檔案清單,並存入本地硬碟的local-file。
39.nmap[inpatternoutpattern]:設定檔案名稱映射機制,使得檔案傳輸時,檔案中的某些字元相互轉換,如:nmap$1.$2.$3[$1,$2].[$2,$3],則傳輸檔案a1.a2.a3時,檔案名稱變為a1,a2。該命令特別適用於遠程主機為非UNIX機的情況。
40.ntrans[inchars[outchars>:設定檔案名稱字元的翻譯機制,如ntrans 1R,則檔案名稱LLL將變為RRR。
41.openhost[port]:建立指定ftp伺服器連線,可指定連線連線埠。
42.passive:進入被動傳輸方式。
43.prompt:設定多個檔案傳輸時的互動提示。
44.proxyftp-cmd:在次要控制連線中,執行一條ftp命令,該命令允許連線兩個ftp伺服器,以在兩個伺服器間傳輸檔案。第一條ftp命令必須為open,以首先建立兩個伺服器間的連線。
45.putlocal-file[remote-file]:將本地檔案local-file傳送至遠程主機。
46.pwd:顯示遠程主機的當前工作目錄。
47.quit:同bye,退出ftp會話。
48.quotearg1,arg2…:將參數逐字發至遠程ftp伺服器,如:quotesyst.
49.recvremote-file[local-file]:同get。
50.regetremote-file[local-file]:類似於get,但若local-file存在,則從上次傳輸中斷處續傳。
51.rhelp[cmd-name]:請求獲得遠程主機的幫助。
52.rstatus[file-name]:若未指定檔案名稱,則顯示遠程主機的狀態,否則顯示檔案狀態。
53.rename[from][to]:更改遠程主機檔案名稱。
54.reset:清除回答佇列。
55.restartmarker:從指定的標誌marker處,重新開始get或put,如:restart130。
56.rmdirdir-name:刪除遠程主機目錄。
57.runique:設定檔案名稱唯一性存儲,若檔案存在,則在原檔案後加後綴..1,.2等。
58.sendlocal-file[remote-file]:同put。
59.sendport:設定PORT命令的使用。
60.sitearg1,arg2…:將參數作為SITE命令逐字傳送至遠程ftp主機
61.sizefile-name:顯示遠程主機檔案大小,如:siteidle7200。
62.status:顯示當前ftp狀態。
63.struct[struct-name]:將檔案傳輸結構設定為struct-name,預設時使用stream結構。
64.sunique:將遠程主機檔案名稱存儲設定為唯一(與runique對應)。
65.system:顯示遠程主機作業系統類型。
66.tenex:將檔案傳輸類型設定為TENEX機的所需的類型。
67.tick:設定傳輸時的位元組計數器。
68.trace:設定包跟蹤。
69.type[type-name]:設定檔案傳輸類型為type-name,預設為ascii,如:typebinary,設定二進制傳輸方式。
70.umask[newmask]:將遠程伺服器的預設umask設定為newmask,如:umask3。
71.useruser-name[password][account]:向遠程主機表明自己的身份,需要口令時,必須輸入口令。
72.verbose:同命令行的-v參數,即設定詳盡報告方式,ftp伺服器的所有回響都將顯示給用戶,預設為on.

相關詞條

熱門詞條

聯絡我們