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