| 越來越多的嵌入式應(yīng)用增加了Internet網(wǎng)絡(luò)功能,但是,嵌入式應(yīng)用的編程人員對于上網(wǎng)和TCP/IP協(xié)議比較生疏,由于需要了解的技術(shù)內(nèi)容量很多,因此很難短時(shí)間從中找出有用的關(guān)鍵部分,本文打算對新手給以實(shí)用性的指導(dǎo)。 TCP/IP包括一系列協(xié)議 首先,應(yīng)理解我們所說的TCP/IP是統(tǒng)指一系列的協(xié)議,其中包括TCP(傳輸控制協(xié)議)、UDP(用戶數(shù)據(jù)報(bào)協(xié)議)、IP(Internet協(xié)議)還有一些更低層的連接層協(xié)議,如Ethernet(以太網(wǎng)協(xié)議)等。 用TCP協(xié)議傳輸?shù)乃^數(shù)據(jù)實(shí)際指的是數(shù)據(jù)流中的段,而用UDP協(xié)議傳輸?shù)乃^數(shù)據(jù)指的是數(shù)據(jù)包。IP則是TCP、UDP(傳輸層協(xié)議)之下的網(wǎng)絡(luò)層協(xié)議。IP所提供的是非可靠的、無連接能力的、向指定主機(jī)地址的包傳送的協(xié)議。IP包也叫數(shù)據(jù)報(bào)。數(shù)據(jù)報(bào)可能出現(xiàn)丟失、重復(fù)或次序紊亂等現(xiàn)象,所以,它是非可靠的協(xié)議。但是,IP 協(xié)議的最大好處是,IP數(shù)據(jù)報(bào)獨(dú)立于低層的網(wǎng)絡(luò)技術(shù),所以它是一種通用的數(shù)據(jù)傳送方法。 TCP和UDP都屬于IP上層的傳輸層協(xié)議。二者都使用端口號作為送往主機(jī)的解碼地址。端口號由各個(gè)具體應(yīng)用所確定,同時(shí)使用多個(gè)端口號能完成“一機(jī)多網(wǎng)”的操作。每個(gè)UDP數(shù)據(jù)包和TCP數(shù)據(jù)段中都含源端口號和目的端口號。為接收遠(yuǎn)端的輸入而等待著執(zhí)行接入操作的主機(jī)是所謂的服務(wù)器,發(fā)起接入請求的主機(jī)就是所謂的客戶機(jī)。 服務(wù)器為最常服務(wù)的應(yīng)用如FTP(文件傳輸協(xié)議)、Email和HTTP,分配了知名的端口號并對其進(jìn)行持續(xù)地監(jiān)聽。作為傳輸源的客戶機(jī)通常選擇隨機(jī)的端口號,并向已分配了知名端口號的服務(wù)器發(fā)出接入請求。客戶應(yīng)用所取的端口號應(yīng)大于1024,因1024以下的端口號是為知名應(yīng)用而預(yù)留的。 UDP為維護(hù)數(shù)據(jù)包的整體性應(yīng)盡最大可能地選用校驗(yàn)和。UDP數(shù)據(jù)包的可靠性是與IP相當(dāng)?shù)?所以,遠(yuǎn)端主機(jī)收到的數(shù)據(jù)包未能保證其正確的順序。但是由于TCP所傳數(shù)據(jù)流應(yīng)用了順序號和應(yīng)答措施,可以發(fā)現(xiàn)數(shù)據(jù)的丟失、段的失序和對傳輸錯誤的排除,所以TCP協(xié)議提供的是數(shù)據(jù)流的可靠傳輸。 相對于UDP,TCP所獲得的可靠性是以其復(fù)雜性為代價(jià)的。TCP面向接入,而UDP是無連接能力的。這意味著,UDP客戶機(jī)向指定的遠(yuǎn)端主機(jī)發(fā)送數(shù)據(jù)包時(shí),并未事先確知對方是做好了接收數(shù)據(jù)的準(zhǔn)備的。因此就會發(fā)生某一客戶機(jī)發(fā)給一個(gè)主機(jī),而此主機(jī)事先并未把此客戶機(jī)列入其目標(biāo)端口號而加以監(jiān)聽。這種情況,只要遠(yuǎn)端主機(jī)運(yùn)行的是TCP/IP堆棧,并能夠?qū)⑤斎氲腢DP數(shù)據(jù)報(bào)送到ICMP層進(jìn)行處理的話,此主機(jī)將返回一個(gè)ICMP(Internet控制信息協(xié)議)錯誤。也就是說,如果遠(yuǎn)端主機(jī)不能接收發(fā)去的UDP數(shù)據(jù)的話,客戶機(jī)還可以獲得一定的提示的;但是,這種提示是有限的,因?yàn)榭蛻魴C(jī)并不確知數(shù)據(jù)的結(jié)果。 然而也正是由于,UDP沒有保證可靠性的機(jī)制,沒有其他的關(guān)卡機(jī)制,UDP才得以實(shí)現(xiàn)全速地發(fā)送(即充分發(fā)揮物理通信設(shè)備的速度)。如果使用低速的處理器,因UDP的開銷很小,會導(dǎo)致其傳輸率比高出TCP很多;但對于高速處理器,二者的差別不會很大。又,UDP沒有點(diǎn)對點(diǎn)接入的要求,所以可以實(shí)現(xiàn)“一對多點(diǎn)”,“多對多點(diǎn)”的廣播和多點(diǎn)播發(fā)信息。作為使用UDP實(shí)行信息廣播的例子,就是在DHCP協(xié)議(動態(tài)主機(jī)控制協(xié)議)中,當(dāng)系統(tǒng)引導(dǎo)的時(shí)候,發(fā)出廣播信息,通知所有DHCP服務(wù)器向系統(tǒng)提交網(wǎng)絡(luò)配置信息。 TCP原理 TCP是面向接入的。在將數(shù)據(jù)發(fā)向遠(yuǎn)方主機(jī)之前,必須先建立TCP接入。這意味著只有在兩端都實(shí)現(xiàn)了TCP接入后,才可以進(jìn)行點(diǎn)-點(diǎn)之間的數(shù)據(jù)交換。建立TCP的點(diǎn)-點(diǎn)連接,包括“三重握手”的操作: 1、 客戶機(jī)向服務(wù)器發(fā)出同步段(SYN),請求接入。 2、 服務(wù)器向客戶機(jī)發(fā)出同步-應(yīng)答段(SYN--ACK)。一方面作為對客戶請求接入的響應(yīng),一方面要求客戶端也進(jìn)行接入。 3、 客戶機(jī)向服務(wù)器再發(fā)出應(yīng)答段(ACK)。作為對服務(wù)器所發(fā)請求接入的響應(yīng)。 同樣,包含數(shù)據(jù)的每一個(gè)TCP段也都應(yīng)該取得對端返回的應(yīng)答段(ACK),作為握手信號來保證數(shù)據(jù)被可靠地接收。應(yīng)答段本身不再需要應(yīng)答,避免應(yīng)答陷入無窮的嵌套?蛻魴C(jī)請求對端接入時(shí),要隨機(jī)地選送一個(gè)初始序號。在第二步中建立TCP接入時(shí),服務(wù)器也要選送一個(gè)自己的初始序號,并用這個(gè)號作為對客戶機(jī)送來序號的應(yīng)答號返送給客戶機(jī)。這樣,每一個(gè)TCP段中都包含一個(gè)序號,并以這個(gè)序號作為數(shù)據(jù)流的定位器,而返給客戶機(jī)的應(yīng)答號則表達(dá)所發(fā)來的數(shù)據(jù)已經(jīng)妥收。 消除傳輸中的錯誤,仰賴持續(xù)跟蹤已發(fā)出數(shù)據(jù)段的應(yīng)答是否返回。在設(shè)定的時(shí)間段內(nèi),如果未收到該段的應(yīng)答則應(yīng)重發(fā)。如果還是未收到應(yīng)答,則適當(dāng)增加間隔時(shí)間再次重發(fā)。在總的極限時(shí)間段內(nèi)一直不能等到應(yīng)答返回,則本次接入失效不能再用,并應(yīng)將出錯情況及時(shí)通知應(yīng)用程序。每次成功的接入,只要本端和對端沒有執(zhí)行過關(guān)閉操作,就一直是接通的。要想知道對端是否還處于接入狀態(tài),唯一的方法就是發(fā)數(shù)據(jù)進(jìn)行探測。關(guān)閉TCP接入共有4步: 1、 客戶機(jī)向服務(wù)器發(fā)出關(guān)閉段(FIN)。此時(shí),客戶機(jī)不能再向遠(yuǎn)方服務(wù)器發(fā)送數(shù)據(jù),但是仍可接收數(shù)據(jù)。 2、 服務(wù)器向客戶機(jī)發(fā)出關(guān)閉--應(yīng)答段。此時(shí),服務(wù)器還可以向客戶機(jī)發(fā)送數(shù)據(jù),即接入處于“半關(guān)閉”狀態(tài)。 3、 服務(wù)器向客戶機(jī)發(fā)出關(guān)閉段(FIN),關(guān)閉本側(cè)的接入。仍可接收數(shù)據(jù)。一方面作為客戶請求接入的響應(yīng),一方面要求客戶端也須接入。此時(shí),服務(wù)器不能再發(fā)送數(shù)據(jù)。 4、 客戶機(jī)為響應(yīng)服務(wù)器的關(guān)閉,向服務(wù)器發(fā)出關(guān)閉--應(yīng)答段。 至此,接入已從兩端拆除完畢?蛻魴C(jī)不可緊接著再次請求恢復(fù)剛剛關(guān)閉的接入。需要有一個(gè)叫做2MSL間歇時(shí)間,避免前后兩次接入產(chǎn)生牽連。對于娛樂網(wǎng),這個(gè)間歇時(shí)間約取2分鐘,因?yàn)榧词乖诮尤腙P(guān)閉之后,客戶系統(tǒng)仍有大量的資源可供使用,間歇2分鐘后從新接入對客戶不造成影響。然而,對于嵌入式系統(tǒng),2分鐘的間歇時(shí)間無異于萬古千年,再說,接入關(guān)閉之后可用于填補(bǔ)間歇時(shí)間的可用資源又極為有限。所以,嵌入式TCP/IP的2MSL時(shí)間應(yīng)該盡可能地減下來。 TCP通過數(shù)據(jù)窗的滑動來調(diào)整數(shù)據(jù)的傳送率。只要使用TCP,就不可能在所建立的點(diǎn)-點(diǎn)接入上實(shí)現(xiàn)數(shù)據(jù)的陣發(fā)式全速傳送,原因在于數(shù)據(jù)流中被插入了有些隨機(jī)性的應(yīng)答環(huán)節(jié),它改變著傳送率。每一個(gè)TCP段中,服務(wù)器都將其當(dāng)前可用于接收的數(shù)據(jù)容量(即TCP數(shù)據(jù)窗,不計(jì)應(yīng)答)通知對方,作為對端掌握發(fā)送的極限。這樣做的好處是,發(fā)送端是在明了接收端當(dāng)前確實(shí)處理能力的基礎(chǔ)上向網(wǎng)絡(luò)派送數(shù)據(jù),對于網(wǎng)絡(luò)的交通有效性也是有積極意義的。 現(xiàn)在看一下數(shù)據(jù)流與TCP數(shù)據(jù)窗的關(guān)系和窗是如何滑動的,見圖1。圖中按數(shù)據(jù)發(fā)送時(shí)的序號標(biāo)注數(shù)據(jù)流,圖中可以看到窗的大小和當(dāng)前窗的位置,窗外左側(cè)的1、2、3是已經(jīng)可靠發(fā)送完畢的段,窗外右側(cè)的10、11是尚未發(fā)送的段;只有窗內(nèi)才是當(dāng)前獲得發(fā)送資格和正等待著應(yīng)答的各段,設(shè)4號段等到了應(yīng)答,因發(fā)送圓滿而退出窗口,相應(yīng)地當(dāng)前窗向右滑動一段使10號成為有資格發(fā)送的段。如果各段的應(yīng)答都十分順利的話,有可能窗內(nèi)的各段都處于等待應(yīng)答狀態(tài)。所以,窗口的大小和完成應(yīng)答的快慢影響著數(shù)據(jù)傳送的速度。接收端可以酌情暫時(shí)關(guān)閉窗口,只要通知出去的接收數(shù)據(jù)容量為0字節(jié)即可。這時(shí),發(fā)送端必須停止發(fā)送,而代之以對對側(cè)窗口的探測,探其窗口的重新開放。 因?yàn)門CP發(fā)送的是數(shù)據(jù)流,所以無法區(qū)分10個(gè)128字節(jié)的段與一個(gè)10*1288字節(jié)的段。為此,需要在TCP之上附加一個(gè)協(xié)議,以便將數(shù)據(jù)流斷開,使之成為可識別的數(shù)據(jù)部分。譬如標(biāo)記出開始、終止和數(shù)據(jù)類型等等。常用的FTP、Telnet、和Email(SMTP)都是在TCP之上附加了自己的協(xié)議頭的。 究竟是UPD還是TCP? 至此可以明白,相對于UDP,TCP的可靠性是以許多復(fù)雜措施及由此而增加的開銷為代價(jià)換來的。嵌入式的設(shè)計(jì)者應(yīng)牢牢記。篣DP本身無連接能力和不可靠,但對傳輸率卻無阻礙;而TCP提供可靠的數(shù)據(jù)流,但處理的開銷較大,使傳輸率有所降低。 關(guān)于UDP的不可靠這一點(diǎn),也不可簡單化以致有所誤解,真正使用UDP時(shí),經(jīng)常是要在應(yīng)用層增加提高UDP可靠性的代碼,譬如給數(shù)據(jù)添加順序的標(biāo)記,使在應(yīng)用層上能發(fā)現(xiàn)數(shù)據(jù)的丟失和亂序,從而加以更正。嵌入式的設(shè)計(jì)者會面臨許多具體的特殊要求,如代碼不能長、或傳輸率是關(guān)鍵、或可靠性最重要等等,需要很好地加以分析和折衷。 有時(shí)選用UDP或TCP的效果有明顯的不同。對于樓宇散布各處的溫度和濕度傳感器的每秒一次地集中監(jiān)控來說,選用UDP或TCP都關(guān)系不大。對于獨(dú)立的、又不太重要的傳感器監(jiān)控,選用UDP也就夠了。而進(jìn)入數(shù)據(jù)庫的傳感器監(jiān)控結(jié)果,因其可靠性要求,則需用TCP。由于微處理器的能力有限,不采用UDP就難以上網(wǎng)的,勢必只能遷就于UDP;如會議電視和IP音響。實(shí)時(shí)播放的電視和音響傳輸率是關(guān)鍵,也得選用UDP,因?yàn)槿暨x用TCP會因可靠性要求而重新傳數(shù)據(jù),因此可能錯過了應(yīng)播出的時(shí)間反而引起混亂;再有,對于這種發(fā)與收應(yīng)嚴(yán)格保持同步、寧缺勿爛的應(yīng)用還應(yīng)在UDP上面的應(yīng)用層增加數(shù)據(jù)順序性的約束。對于數(shù)據(jù)監(jiān)控系統(tǒng),因傳輸可靠性的要求很高,照例應(yīng)采用TCP。Web和Email也照例采用的是TCP。 嵌入式應(yīng)用可以從標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議獲益很多,用最少的資源實(shí)現(xiàn)最廣泛的遠(yuǎn)方監(jiān)控,僅僅是一個(gè)方面。限于本文的目標(biāo),僅僅只能簡要地涉及與Internet有關(guān)的TCO/IP協(xié)議。 |