一、TFTP簡介
1.定義
TFTP(Trival File Transfer Protocal,簡單文件傳輸協(xié)議)該協(xié)議在熟知端口69上使用UDP服務(wù)。TFTP協(xié)議常用于無盤工作站或路由器從別的主機(jī)上獲取引導(dǎo)配置文件,由于TFTP報文比較小,能夠迅速復(fù)制這些文件。
2.優(yōu)點(diǎn)
(1).TFTP協(xié)議代碼所占用的內(nèi)存小,其對應(yīng)的軟件也很小,所以能個很容易地放入到無盤工作站的ROM中。(2).TFTP支持ASCII碼或二進(jìn)制傳送。
二、TFTP傳輸過程描述
以TFTP客戶向TFTP服務(wù)器發(fā)送讀請求為例,說明整個過程。
1.服務(wù)器使用熟知端口號69被動打開連接;
2.客戶主動打開連接,它使用臨時端口作為源端口而熟知端口69作為目的端口,向服務(wù)器進(jìn)程發(fā)送RRQ報文;
3.服務(wù)器主動打開連接,它使用新的臨時端口作為源端口,而使用收到的來自客戶的臨時端口作為目的端口,向TFTP客戶進(jìn)程發(fā)送DATA報文(2B操作碼,2B數(shù)據(jù)塊的塊號K,512B數(shù)據(jù));
4.客戶收到服務(wù)器的報文后,發(fā)送4B的ACK(2B的操作碼和2B的數(shù)據(jù)塊號)給TFTP服務(wù)器,告訴它之前發(fā)送給客戶的數(shù)據(jù)報已經(jīng)收到;
5.重復(fù)步驟3-4,直到所有請求的數(shù)據(jù)發(fā)送完畢。
三、功能總結(jié)
(1).從上面的過程可以看出,TFTP是一種類似于停止等待協(xié)議(不是真正的停止等待協(xié)議,在停止等待協(xié)議中,接收方發(fā)送的ack表示期望收到的下一個分組,而在TFTP的ACK報文中,ack的塊號表示的是本次成功收到的數(shù)據(jù)塊,而不是下一個期望的下一個數(shù)據(jù)塊)。TFTP服務(wù)器只有收到客戶端的確認(rèn)報文ACK后才會向客戶端接著發(fā)送新的數(shù)據(jù)。
(2).服務(wù)器向客戶端發(fā)送數(shù)據(jù)的過程中,每次都是發(fā)送512B的數(shù)據(jù),如果客戶進(jìn)程收到某個DATA報文中數(shù)據(jù)部分的長度小于512B,說明這是收到的最后一個報文;如果待發(fā)送的數(shù)據(jù)的總長度正好是512的整數(shù)倍,這就意味著最后一個數(shù)據(jù)報的長度正好為512B,此時服務(wù)器進(jìn)程會再次發(fā)送一個包含0字節(jié)數(shù)據(jù)的DATA報文(顯然,該報文的總長度為4B=2B操作碼+2B塊號+0B數(shù)據(jù));
(3).TFTP協(xié)議中,用于讀文件的連接和用于寫文件的連接的建立方式不同:建立讀連接的時候,客戶首先向服務(wù)器發(fā)送RRQ讀報文,服務(wù)器收到該報文后,直接發(fā)回給該客戶DATA報文,并且包含第一個數(shù)據(jù)塊(塊號為1)。而建立寫連接的時候,客戶首先先服務(wù)器發(fā)送WRQ寫報文,服務(wù)器收到該報文后,則發(fā)回給客戶ACK報文,使用的塊號為0;當(dāng)然上面兩種情況如果遇到請求報文出錯時,均會發(fā)回ERROR報文作為響應(yīng)。
四、TFTP五種報文(重點(diǎn))
TFTP五種報文分別是:RRQ,WRQ,DATA,ACK和ERROR。

RRQ/WRQ報文:
模式字段中,包含兩種字符串中的一種,"netascii"表示ASCII文件,"octet"表示二進(jìn)制文件;對于RRQ,客戶向TFTP服務(wù)器發(fā)送讀請求后,服務(wù)器返回一個塊編號為1的DATA報文;而對于WRQ,客戶向TFTP服務(wù)器發(fā)送寫請求后,服務(wù)器返回的是塊編號為1的ACK報文。總之,不管是RRQ還是WRQ,接收DATA數(shù)據(jù)的一方(讀者)發(fā)送ACK確認(rèn),而發(fā)送DATA數(shù)據(jù)(寫者)的只負(fù)責(zé)發(fā)送數(shù)據(jù)。
DATA報文:
由客戶或服務(wù)器使用(由寫者發(fā)送),用于傳送數(shù)據(jù)塊。所有的塊都用數(shù)字順序編碼,從1開始。在所有的DATA報文中,這個塊必須準(zhǔn)確地等于512B,但最后一個塊可以小于或等于512B。當(dāng)發(fā)送的DATA報文中數(shù)據(jù)部分的長度小于512B后,表示DATA報文發(fā)送完畢,所以小于數(shù)據(jù)部分512B的DATA數(shù)據(jù)報可以作為文件結(jié)束的標(biāo)志。特殊的情況是,當(dāng)文件中的數(shù)據(jù)正好是512B的整數(shù)倍時,那么發(fā)送端必須再發(fā)送一個具有數(shù)據(jù)部分為0B的額外的DATA數(shù)據(jù)塊以表示傳輸?shù)慕Y(jié)束。數(shù)據(jù)可以采用ASCII碼或二進(jìn)制組來傳送。
ACK報文:
塊號表示它所收到的塊號(不是下一個期待的塊號哈,這與TCP中的ACK序號不同)。特殊情況是,當(dāng)客戶向服務(wù)器發(fā)送一個WRQ請求后,服務(wù)器返回給客戶的是一個塊號為0的ACK報文,表示服務(wù)器已經(jīng)準(zhǔn)備好了接收來自客戶的數(shù)據(jù)報。
EEROR報文:
ERROR報文既可以有客戶發(fā)送,也可以由服務(wù)器發(fā)送,當(dāng)一條連接(如讀連接或?qū)戇B接)不能建立或在數(shù)據(jù)傳輸中出現(xiàn)問題時使用。差錯碼定義了差錯的類型,差錯信息是一個可變字節(jié),包含原文中的差錯數(shù)據(jù)。
注意:
從上面的報文格式中可以看出,TFTP報文沒有差錯檢驗和字段,所以接收端檢驗數(shù)據(jù)是否出現(xiàn)差錯的唯一方法是通過分組該TFTP數(shù)據(jù)報的UDP首部中的檢驗和字段。
五、流量控制
TFTP流量控制采用的是停止等待協(xié)議。TFTP使用DATA報文發(fā)送數(shù)據(jù)塊,并等待ACK報文的確認(rèn)。若在超時之前發(fā)送端就收到了確認(rèn),它就發(fā)送下一個塊。這樣,實現(xiàn)流量控制的方法是在發(fā)送下一個數(shù)據(jù)塊之前,必須要保證收到了上一個數(shù)據(jù)塊的ACK報文。
客戶從服務(wù)器讀文件:當(dāng)客戶打算向服務(wù)器讀文件時,先發(fā)送RRQ報文,若無問題,服務(wù)器就直接發(fā)送塊號為1的DATA報文(即第一個數(shù)據(jù)塊就直接發(fā)送過去了)。
客戶向服務(wù)器寫文件(就是存儲文件):當(dāng)客戶打算寫文件時,先發(fā)送WRQ報文,若無問題,服務(wù)器就響應(yīng)塊號為0的ACK報文(不是DATA報文,因為此時服務(wù)器是數(shù)據(jù)接收方,只能發(fā)送ACK,同時注意第一個ACK的塊編號是0,這樣就可以通知客戶,我同意了你的寫請求)??蛻粼谑盏皆摯_認(rèn)后,就是用塊號為1發(fā)送第一個數(shù)據(jù)塊給服務(wù)器。
六、差錯控制
TFTP的差錯機(jī)制與其他協(xié)議不同,它是對稱的,因為TFTP協(xié)議在發(fā)送端和接收端都使用了計時器。也就是說,客戶和服務(wù)器兩端,一方使用了DATA報文計時器(發(fā)送端),另一方使用ACK報文計時器(接收端)。若發(fā)送端丟失了數(shù)據(jù)報文,在計時器到期時發(fā)送端就重傳該數(shù)據(jù)報文;若接收端丟失了ACK報文,在超時時接收端就重傳該ACK報文。
差錯控制常用于這四種情況:報文受損、報文丟失、確認(rèn)丟失和報文重復(fù)。
報文受損:
當(dāng)數(shù)據(jù)塊出現(xiàn)差錯(通過差錯檢驗,得靠UDP首部)時,接收端能夠檢測出來并丟棄該報文。發(fā)送端等待確認(rèn),超時后就重傳該數(shù)據(jù)報。
報文丟失:
若數(shù)據(jù)報丟失了,它就用于不能到達(dá)接收方,而確認(rèn)頁不會發(fā)出。發(fā)送端在超時之后,就會重傳該數(shù)據(jù)報。
確認(rèn)丟失:確認(rèn)丟失了,則可能發(fā)生兩種情況:一是接收端的計時器比發(fā)送端的計時器先到期,則接收方重傳確認(rèn);若發(fā)送端的計時器先期,則發(fā)送端重傳該數(shù)據(jù)。
報文重復(fù):
接收端通過塊編號可以檢測出數(shù)據(jù)塊的丟失。若數(shù)據(jù)塊重復(fù)了,接收端就簡單地將其丟棄。
sorcerer's apprentice bug
Sorcerer's apprentice buy可以翻譯為“魔法師學(xué)徒的錯誤"(或魔術(shù)新手綜合征),這個名稱來自一個動畫人物,這個人不經(jīng)心地對一個拖把施加魔法,結(jié)果這個拖把連續(xù)地復(fù)制它自己。若分組的ACK報文沒有丟失而是延遲了,則會發(fā)送這種錯誤。
數(shù)據(jù)分組發(fā)生這種錯誤的原因分析:
發(fā)送端發(fā)送一個分組出去后,會啟動該分組的DATA計時器;接收方收到該分組后就會發(fā)送一個ACK數(shù)據(jù)報,并啟動一個ACK計時器。發(fā)送端收到該ACK報文之前,它會按照一定的時間間隔(由發(fā)送端的計時器決定)重發(fā)該數(shù)據(jù)塊,直到收到該數(shù)據(jù)塊的ACK報文為止。現(xiàn)在假設(shè)出現(xiàn)這么一種情況,發(fā)送端將DATA分組發(fā)送出去后,接收方收到該數(shù)據(jù)并發(fā)回一個ACK數(shù)據(jù)報,但是ACK在路上走著,并沒有丟失(只是走得很慢)。當(dāng)發(fā)送端的DATA計時器到期了都還沒有收到ACK分組時,發(fā)送端就會認(rèn)為DATA數(shù)據(jù)包已經(jīng)丟失了,就會重發(fā)該數(shù)據(jù)報。發(fā)出去沒過多久卻收到了之前那個數(shù)據(jù)報的ACK分組。這回發(fā)送端才發(fā)送下一個數(shù)據(jù)報,這樣導(dǎo)致的結(jié)果就是每一個成功發(fā)送的DATA都要發(fā)送兩次,而每一個成功的ACK也要發(fā)回兩次。這一現(xiàn)象就稱為“魔術(shù)新手綜合癥”。
七、TFTP協(xié)議與DHCP協(xié)議
TFTP協(xié)議常與DHCP協(xié)議協(xié)同工作。TFTP協(xié)議和DHCP協(xié)議共同工作來加載一些無盤機(jī)(如無盤系統(tǒng),網(wǎng)橋,路由器等,注意:現(xiàn)在的某些路由器可能有硬盤了,但是以前的沒有)的配置文件來進(jìn)行一些初始化工作。當(dāng)無盤機(jī)加點(diǎn)后,加了點(diǎn)的無盤機(jī)(通過在系統(tǒng)的ROM中固化TFTP軟件和DHCP軟件,這樣加電后就可以運(yùn)行這些軟件)調(diào)用DHCP客戶進(jìn)程從遠(yuǎn)端服務(wù)器的DHCP服務(wù)器進(jìn)程獲取配置文件(如IP地址和引導(dǎo)文件的絕對路徑名),然后無盤機(jī)再啟動TFTP客戶進(jìn)程,根據(jù)前面獲取的引導(dǎo)文件的絕對路徑名去在相應(yīng)的TFTP服務(wù)器中去讀取該引導(dǎo)文件的內(nèi)容。
八、參考資料
以下資料度娘都有資料:
[1] 《TCP/IP詳解 卷1:協(xié)議》
[2] 《TCP/IP協(xié)議族 第4版》
[3] 《計算機(jī)網(wǎng)絡(luò) 第5版》
AndTFTP軟件 :http://www.wandoujia.com/apps/com.xiaoboalex.andtftp