串列線路上傳輸資料報的非標準協議:SLIP

來源:互聯網
上載者:User
簡介

TCP/IP協議族可以在許多網路介質上運行,如: IEEE 802.3 (乙太網路)和802.5(令牌環)區域網路,X.25線路,衛星串連和串列線路。除了串列線路外,其它的介質上都有包格式的標準。SLIP,串列線路IP,實際上是一個標準,它通常用於運行TCP/IP協議點對點連接之中。它並非Internet標準。

曆史

SLIP起始於八十年代初3COM UNET TCP/IP實現,它僅是一個包協議:SLIP定義了一系列字元將IP包在串列線路上變成框架格式,僅此而已。它不提供定址,包類型標識,差錯控制或壓縮機制。因為此協議十分簡單,所以非常容易實現。在1984年左右,Rick Adams為Berkeley Unix和Sun Microsystems工作站實現了SLIP並推廣到世界。它很快被用於在主機和路由器之間的串列線路串連。SLIP通常用於專線串連,有時也用於拔號串連,其速度經常在1200bps和19.2Kbps之間。對於主機和路由器之間的串連是十分有用的。

實用性

SLIP在大部分基於Berkeley UNIX的系統上可用,在Berkeley 4.3BSD 中也包括SLIP。SLIP在Ultrix,Sun UNIX和大部分由Berkeley演變而來的UNIX上可用。一些終端集中器和IBM PC也支援它。

協議

SLIP協議定義兩個特殊字元:END和ESC。END是八進位300(十進位192),ESC是八進位(十進位219),這與ASCII碼中的ESC字元不衝突;為了討論的方便,這裡所說的ESC均是SLIP的ESC字元。若要發送一個包,SLIP主機只需要以包的形式發送資料即可。如果資料與END字元相同,則發送ESC和八進位的334(十進位220)代替。如果和ESC相同,則以ESC和八進位335(十進位221)代替。當包資料發送結束,則發送一個END字元。Phil Karn提出一個改進的演算法,可以在包頭和飽包尾都使用END。這將消除由於線路雜訊帶來的錯誤。在一般情況下,接收方只用觀察兩個END,這將產生錯誤的IP包。如果SLIP實現不放棄0長度包,那IP實現會這樣做的。如果因為雜訊,此包將被拋棄,而不影響下面的包。因為沒有標準的SLIP說明,因此沒有真正定義的最大SLIP包大小。我們最好接受由Berkeley UNIX SLIP drivers定義的大小:1006位元組,包括IP和傳輸協議頭(不包括幀字元。因此,新的SLIP實現應該準備接收1006位元組的資料報,而且不應該發送大於1006位元組的資料報。

不足之處

有一些使用者希望SLIP提供但它沒有提供的功能,公平地說,SLIP僅僅是很久前,問題並不那麼重要時設計的普通協議。下面是顯而易見的SLIP的不足之處:

定址功能:
SLIP串連的雙方都出於路由的目的需要知道對方的IP地址。並且,當使用SLIP作為主機拔號到路由器的目的時,定址機制會是動態,路由器需要通知拔號主機主機的IP地址。而現在,SLIP卻沒有提供通過SLIP串連傳送地址資訊的機制。

類型標識:
SLIP沒有類型域,因此,在SLIP串連上僅能運行一種協議,所有在配置了TCP/IP和DECnet的主機之間不可能使用SLIP。而SLIP是串列線路IP,如果以串列線路串連多協議的電腦,這些電腦應該具有以一種以上協議通訊的能力。

差錯檢測與校正:
線路雜訊可能使包在傳送過程中損壞,因為線路速率比較低,因此,重新發送的代價是昂貴的。在SLIP層,差錯控制並不是必須的,因為IP應用程式可以檢測到損壞的包(IP頭和UDP,TCP校正碼是足夠的),但是一些應用程式如NFS通常忽略錯誤而單純依靠網路介質來檢測損壞的包。因為重新傳送的代價很大,因此SLIP提供差錯檢測與校正是更有效方法。

壓縮:
因為拔號線路速率比較慢,包的壓縮將大大提高包的輸送量。通常,在單獨一個TCP串連的包序列中的IP和TCP頭中幾乎沒有多少變化,所以普通的壓縮演算法就可以僅發送改變的包頭部分而不是整個包頭。已經在這方面做了一些工作,上面的問題中的全部或一部分正在研究之中。

SLIP驅動程式

下面的C語言函數可以發送並接收SLIP包。他們依靠兩個函數完成功能:send_char()和recv_char(),它們分別在串列線路上發送和接收一個位元組。

 

   /* SLIP特殊字元 */
   #define END             0300    /*標明包結束*/
   #define ESC             0333    /*標明位元組填充*/
   #define ESC_END         0334    /*ESC ESC_END用於包中資料和和END相同時的轉意字元*/
   #define ESC_ESC         0335    /*ESC ESC_ESC用於包中資料和和ESC相同時的轉意字元*/

   /* SEND_PACKET:發送長度為LEN的的包,起始位置在P*/
   void send_packet(p, len)
           char *p;
           int len; {
     /*發送一個END字元*/
        send_char(END);
     /*發送包內的資料*/
           while(len--) {
                   switch(*p) {
                   /*如果需要轉意,則進行相應的處理*/
                   case END:
                           send_char(ESC);
                           send_char(ESC_END);
                           break;
                   case ESC:
                           send_char(ESC);
                           send_char(ESC_ESC);
                           break;
                   /*如果不需要轉意,則直接發送*/
                   default:
                           send_char(*p);
                           }
                   p++;
                   }
           /*通知接收方發送結束*/
           send_char(END);
           }

   /* RECV_PACKET:接收包資料,儲存於P位置,如果接收到的資料大於LEN,則被截斷,函數返回接收到的位元組數*/
   int recv_packet(p, len)
           char *p;
           int len; {
           char c;
           int received = 0;
           while(1) {
                   /*接收字元*/
                   c = recv_char();
                   switch(c) {
                   /*如果接收到END,包資料結束,如果包內沒有資料,直接拋棄*/
                   case END:
                           if(received)
                                   return received;
                           else
                                   break;

                   /*下面的代碼用於處理轉意字元*/
                   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;
                           }
                   }
           }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.