簡介
tcp/ip協議族可以在許多網路介質上執行,如: ieee 802.3 (乙太網)和802.5(令牌環)區域網,x.25線路,衛星連線和序列線路。除了序列線路外,其它的介質上都有包格式的標準。slip,序列線路ip,實際上是乙個標準,它通常用於執行tcp/ip協議點對點連線之中。它並非internet標準。
歷史slip起始於八十年代初3com unet tcp/ip實現,它僅是乙個包協議:slip定義了一系列字元將ip包在序列線路上變成幀格式,僅此而已。它不提供定址,包型別標識,差錯控制或壓縮機制。因為此協議十分簡單,所以非常容易實現。在2023年左右,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;
p++;
}/*通知接收方傳送結束*/
send_char(end);
}/* recv_packet:接收包資料,儲存於p位置,如果接收到的資料大於len,則被截斷,函式返回接收到的位元組數*/
int recv_packet(p, len)
char *p;
int len;
default:
if(received < len)
p[received++] = c;}}
}
UDP傳輸資料報的大小
之前面試被問了,後來查了一下,但是太詳細,有時也不好。1500位元組被稱為鏈路層的mtu 最大傳輸單元 1500 20 8 1472 在普通的區域網環境下,我建議將udp的資料控制在1472位元組以下為好 還有地方說還應該有個ppp的包頭包尾的開銷 8bytes 那就為1492了 udp 包的大小就...
資料報在不同網段上的傳輸流程
對於資料報在不同網段上傳輸這一問題,lz參考一些資料,覺得用資料報源目標位址狀態的變化能更直觀的表示這一流程的進行,以下lz用乙個例子描述這一過程。pc1 r1 r2 webserver pc1 為網路a中的一台主機,webserver為網路b中的web伺服器,路由器r1 r2分別為網路a b的閘道...
網路資料報從主機A傳輸到主機B的流程
主機a需要傳送乙個資料報到主機b,在整個傳輸流程中,源和目的ip位址是保持不變的 不考慮nat 源和目的mac位址是隨著具體鏈路的變化而變化。這裡只考慮三種基本情形 a和b通過網線直連,a和b通過路由器連線,a和b通過交換機連線。真實網路中a和b的連線關係可能很複雜,但無非就是這三種基本情形的組合。...