串行线路上传输数据报的非标准协议:SLIP
簡(jiǎn)介
TCP/IP協(xié)議族可以在許多網(wǎng)絡(luò)介質(zhì)上運(yùn)行,如: IEEE 802.3 (以太網(wǎng))和802.5(令牌環(huán))局域網(wǎng),X.25線路,衛(wèi)星連接和串行線路。除了串行線路外,其它的介質(zhì)上都有包格式的標(biāo)準(zhǔn)。SLIP,串行線路IP,實(shí)際上是一個(gè)標(biāo)準(zhǔn),它通常用于運(yùn)行TCP/IP協(xié)議點(diǎn)對(duì)點(diǎn)連接之中。它并非Internet標(biāo)準(zhǔn)。
歷史
SLIP起始于八十年代初3COM UNET TCP/IP實(shí)現(xiàn),它僅是一個(gè)包協(xié)議:SLIP定義了一系列字符將IP包在串行線路上變成幀格式,僅此而已。它不提供尋址,包類型標(biāo)識(shí),差錯(cuò)控制或壓縮機(jī)制。因?yàn)榇藚f(xié)議十分簡(jiǎn)單,所以非常容易實(shí)現(xiàn)。在1984年左右,Rick Adams為Berkeley Unix和Sun Microsystems工作站實(shí)現(xiàn)了SLIP并推廣到世界。它很快被用于在主機(jī)和路由器之間的串行線路連接。SLIP通常用于專線連接,有時(shí)也用于拔號(hào)連接,其速度經(jīng)常在1200bps和19.2Kbps之間。對(duì)于主機(jī)和路由器之間的連接是十分有用的。
實(shí)用性
SLIP在大部分基于Berkeley UNIX的系統(tǒng)上可用,在Berkeley 4.3BSD 中也包括SLIP。SLIP在Ultrix,Sun UNIX和大部分由Berkeley演變而來(lái)的UNIX上可用。一些終端集中器和IBM PC也支持它。
協(xié)議
SLIP協(xié)議定義兩個(gè)特殊字符:END和ESC。END是八進(jìn)制300(十進(jìn)制192),ESC是八進(jìn)制(十進(jìn)制219),這與ASCII碼中的ESC字符不沖突;為了討論的方便,這里所說(shuō)的ESC均是SLIP的ESC字符。若要發(fā)送一個(gè)包,SLIP主機(jī)只需要以包的形式發(fā)送數(shù)據(jù)即可。如果數(shù)據(jù)與END字符相同,則發(fā)送ESC和八進(jìn)制的334(十進(jìn)制220)代替。如果和ESC相同,則以ESC和八進(jìn)制335(十進(jìn)制221)代替。當(dāng)包數(shù)據(jù)發(fā)送結(jié)束,則發(fā)送一個(gè)END字符。Phil Karn提出一個(gè)改進(jìn)的算法,可以在包頭和飽包尾都使用END。這將消除由于線路噪聲帶來(lái)的錯(cuò)誤。在一般情況下,接收方只用觀察兩個(gè)END,這將產(chǎn)生錯(cuò)誤的IP包。如果SLIP實(shí)現(xiàn)不放棄0長(zhǎng)度包,那IP實(shí)現(xiàn)會(huì)這樣做的。如果因?yàn)樵肼?#xff0c;此包將被拋棄,而不影響下面的包。因?yàn)闆]有標(biāo)準(zhǔn)的SLIP說(shuō)明,因此沒有真正定義的最大SLIP包大小。我們最好接受由Berkeley UNIX SLIP drivers定義的大小:1006字節(jié),包括IP和傳輸協(xié)議頭(不包括幀字符。因此,新的SLIP實(shí)現(xiàn)應(yīng)該準(zhǔn)備接收1006字節(jié)的數(shù)據(jù)報(bào),而且不應(yīng)該發(fā)送大于1006字節(jié)的數(shù)據(jù)報(bào)。
不足之處
有一些用戶希望SLIP提供但它沒有提供的功能,公平地說(shuō),SLIP僅僅是很久前,問題并不那么重要時(shí)設(shè)計(jì)的普通協(xié)議。下面是顯而易見的SLIP的不足之處:
- 尋址功能:
SLIP連接的雙方都出于路由的目的需要知道對(duì)方的IP地址。并且,當(dāng)使用SLIP作為主機(jī)拔號(hào)到路由器的目的時(shí),尋址機(jī)制會(huì)是動(dòng)態(tài)的,路由器需要通知拔號(hào)主機(jī)主機(jī)的IP地址。而現(xiàn)在,SLIP卻沒有提供通過SLIP連接傳送地址信息的機(jī)制。
- 類型標(biāo)識(shí):
SLIP沒有類型域,因此,在SLIP連接上僅能運(yùn)行一種協(xié)議,所有在配置了TCP/IP和DECnet的主機(jī)之間不可能使用SLIP。而SLIP是串行線路IP,如果以串行線路連接多協(xié)議的計(jì)算機(jī),這些計(jì)算機(jī)應(yīng)該具有以一種以上協(xié)議通信的能力。
- 差錯(cuò)檢測(cè)與校正:
線路噪聲可能使包在傳送過程中損壞,因?yàn)榫€路速率比較低,因此,重新發(fā)送的代價(jià)是昂貴的。在SLIP層,差錯(cuò)控制并不是必須的,因?yàn)镮P應(yīng)用程序可以檢測(cè)到損壞的包(IP頭和UDP,TCP校驗(yàn)碼是足夠的),但是一些應(yīng)用程序如NFS通常忽略錯(cuò)誤而單純依靠網(wǎng)絡(luò)介質(zhì)來(lái)檢測(cè)損壞的包。因?yàn)橹匦聜魉偷拇鷥r(jià)很大,因此SLIP提供差錯(cuò)檢測(cè)與校正是更有效的方法。
- 壓縮:
因?yàn)榘翁?hào)線路速率比較慢,包的壓縮將大大提高包的吞吐量。通常,在單獨(dú)一個(gè)TCP連接的包序列中的IP和TCP頭中幾乎沒有多少變化,所以普通的壓縮算法就可以僅發(fā)送改變的包頭部分而不是整個(gè)包頭。已經(jīng)在這方面做了一些工作,上面的問題中的全部或一部分正在研究之中。
SLIP驅(qū)動(dòng)程序
下面的C語(yǔ)言函數(shù)可以發(fā)送并接收SLIP包。他們依靠?jī)蓚€(gè)函數(shù)完成功能:send_char()和recv_char(),它們分別在串行線路上發(fā)送和接收一個(gè)字節(jié)。
/* SLIP特殊字符 */ #define END 0300 /*標(biāo)明包結(jié)束*/ #define ESC 0333 /*標(biāo)明字節(jié)填充*/ #define ESC_END 0334 /*ESC ESC_END用于包中數(shù)據(jù)和和END相同時(shí)的轉(zhuǎn)意字符*/ #define ESC_ESC 0335 /*ESC ESC_ESC用于包中數(shù)據(jù)和和ESC相同時(shí)的轉(zhuǎn)意字符*/ /* SEND_PACKET:發(fā)送長(zhǎng)度為L(zhǎng)EN的的包,起始位置在P*/ void send_packet(p, len) char *p; int len; { /*發(fā)送一個(gè)END字符*/ send_char(END); /*發(fā)送包內(nèi)的數(shù)據(jù)*/ while(len--) { switch(*p) { /*如果需要轉(zhuǎn)意,則進(jìn)行相應(yīng)的處理*/ case END: send_char(ESC); send_char(ESC_END); break; case ESC: send_char(ESC); send_char(ESC_ESC); break; /*如果不需要轉(zhuǎn)意,則直接發(fā)送*/ default: send_char(*p); } p++; } /*通知接收方發(fā)送結(jié)束*/ send_char(END); } /* RECV_PACKET:接收包數(shù)據(jù),存儲(chǔ)于P位置,如果接收到的數(shù)據(jù)大于LEN,則被截?cái)?#xff0c;函數(shù)返回接收到的字節(jié)數(shù)*/ int recv_packet(p, len) char *p; int len; { char c; int received = 0; while(1) { /*接收字符*/ c = recv_char(); switch(c) { /*如果接收到END,包數(shù)據(jù)結(jié)束,如果包內(nèi)沒有數(shù)據(jù),直接拋棄*/ case END: if(received) return received; else break; /*下面的代碼用于處理轉(zhuǎn)意字符*/ case ESC: c = recv_char(); switch(c) { case ESC_END: c = END; break; case ESC_ESC: c = ESC; break; } default: if(received < len) p[received++] = c; } } }
轉(zhuǎn)載于:https://www.cnblogs.com/starspace/archive/2009/02/03/1383099.html
總結(jié)
以上是生活随笔為你收集整理的串行线路上传输数据报的非标准协议:SLIP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day2-T1
- 下一篇: windbg 分析pchunter导致的