網(wǎng)絡(luò)編程程序員看網(wǎng)絡(luò)協(xié)議
網(wǎng)絡(luò)協(xié)議是指對于網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)格式的規(guī)定。對于網(wǎng)絡(luò)編程初學(xué)者來說,沒有必要深入了解TCP/IP協(xié)議簇,所以對于初學(xué)者來說去讀大部頭的《TCP/IP協(xié)議》也不是一件很合適的事情,因為深入了解TCP/IP協(xié)議是網(wǎng)絡(luò)編程提高階段,也是深入網(wǎng)絡(luò)編程底層時才需要做的事情。
對于一般的網(wǎng)絡(luò)編程來說,更多的是關(guān)心網(wǎng)絡(luò)上傳輸?shù)倪壿嫈?shù)據(jù)內(nèi)容,也就是更多的是應(yīng)用層上的網(wǎng)絡(luò)協(xié)議,所以后續(xù)的內(nèi)容均以實際應(yīng)用的數(shù)據(jù)為基礎(chǔ)來介紹網(wǎng)絡(luò)協(xié)議的概念。
那么什么是網(wǎng)絡(luò)協(xié)議呢,下面看一個簡單的例子。春節(jié)晚會上“小沈陽”和趙本山合作的小品《不差錢》中,小沈陽和趙本山之間就設(shè)計了一個協(xié)議,協(xié)議的內(nèi)容為:
如果點的菜價錢比較貴是,就說沒有。
按照該協(xié)議的規(guī)定,就有了下面的對話:
趙本山:4斤的龍蝦
小沈陽:(經(jīng)過判斷,得出價格比較高),沒有
趙本山:鮑魚
小沈陽:(經(jīng)過判斷,得出價格比較高),沒有
這就是一種雙方達成的一種協(xié)議約定,其實這種約定的實質(zhì)和網(wǎng)絡(luò)協(xié)議的實質(zhì)是一樣的。網(wǎng)絡(luò)協(xié)議的實質(zhì)也是客戶端程序和服務(wù)器端程序?qū)τ跀?shù)據(jù)的一種約定,只是由于以計算機為基礎(chǔ),所以更多的是使用數(shù)字來代表內(nèi)容,這樣就顯得比較抽象一些。
下面再舉一個簡單的例子,介紹一些基礎(chǔ)的網(wǎng)絡(luò)協(xié)議設(shè)計的知識。例如需要設(shè)計一個簡單的網(wǎng)絡(luò)程序:網(wǎng)絡(luò)計算器。也就是在客戶端輸入需要計算的數(shù)字和運算符,在服務(wù)器端實現(xiàn)計算,并將計算的結(jié)果反饋給客戶端。在這個例子中,就需要約定兩個數(shù)據(jù)格式:客戶端發(fā)送給服務(wù)器端的數(shù)據(jù)格式,以及服務(wù)器端反饋給客戶端的數(shù)據(jù)格式。
可能你覺得這個比較簡單,例如客戶端輸入的數(shù)字依次是12和432,輸入的運算符是加號,可能最容易想到的數(shù)據(jù)格式是形成字符串“12+432”,這樣格式的確比較容易閱讀,但是服務(wù)器端在進行計算時,邏輯就比較麻煩,因為需要首先拆分該字符串,然后才能進行計算,所以可用的數(shù)據(jù)格式就有了一下幾種:
“12,432,+” 格式為:第一個數(shù)字,第二個數(shù)字,運算符
“12,+,432” 格式為:第一個數(shù)字,運算符,第二個數(shù)字
其實以上兩種數(shù)據(jù)格式很接近,比較容易閱讀,在服務(wù)器端收到該數(shù)據(jù)格式以后,使用“,”為分隔符分割字符串即可。
假設(shè)對于運算符再進行一次約定,例如約定數(shù)字0代表+,1代表減,2代表乘,3代表除,整體格式遵循以上第一種格式,則上面的數(shù)字生產(chǎn)的協(xié)議數(shù)據(jù)為:
“12,432,0”
這就是一種基本的發(fā)送的協(xié)議約定了。
另外一個需要設(shè)計的協(xié)議格式就是服務(wù)器端反饋的數(shù)據(jù)格式,其實服務(wù)器端主要反饋計算結(jié)果,但是在實際接受數(shù)據(jù)時,有可能存在格式錯誤的情況,這樣就需要簡單的設(shè)計一下服務(wù)器端反饋的數(shù)據(jù)格式了。例如規(guī)定,如果發(fā)送的數(shù)據(jù)格式正確,則反饋結(jié)果,否則反饋字符串“錯誤”。這樣就有了以下的數(shù)據(jù)格式:
客戶端:“1,111,1” 服務(wù)器端:”-110”
客戶端:“123,23,0” 服務(wù)器端:“146”
客戶端:“1,2,5” 服務(wù)器端:“錯誤”
這樣就設(shè)計出了一種最最基本的網(wǎng)絡(luò)協(xié)議格式,從該示例中可以看出,網(wǎng)絡(luò)協(xié)議就是一種格式上的約定,可以根據(jù)邏輯的需要約定出各種數(shù)據(jù)格式,在進行設(shè)計時一般遵循“簡單、通用、容易解析”的原則進行。
而對于復(fù)雜的網(wǎng)絡(luò)程序來說,需要傳輸?shù)臄?shù)據(jù)種類和數(shù)據(jù)量都比較大,這樣只需要依次設(shè)計出每種情況下的數(shù)據(jù)格式即可,例如QQ程序,在該程序中需要進行傳輸?shù)木W(wǎng)絡(luò)數(shù)據(jù)種類很多,那么在設(shè)計時就可以遵循:登錄格式、注冊格式、發(fā)送消息格式等等,一一進行設(shè)計即可。所以對于復(fù)雜的網(wǎng)絡(luò)程序來說,只是增加了更多的命令格式,在實際設(shè)計時的工作量增加不是太大。
不管怎么說,在網(wǎng)絡(luò)編程中,對于同一個網(wǎng)絡(luò)程序來說,一般都會涉及到兩個網(wǎng)絡(luò)協(xié)議格式:客戶端發(fā)送數(shù)據(jù)格式和服務(wù)器端反饋數(shù)據(jù)格式,在實際設(shè)計時,需要一一對應(yīng)。這就是最基本的網(wǎng)絡(luò)協(xié)議的知識。
網(wǎng)絡(luò)協(xié)議設(shè)計完成以后,在進行網(wǎng)絡(luò)編程時,就需要根據(jù)設(shè)計好的協(xié)議格式,在程序中進行對應(yīng)的編碼了,客戶端程序和服務(wù)器端程序需要進行協(xié)議處理的代碼分別如下。
客戶端程序需要完成的處理為:
1、 客戶端發(fā)送協(xié)議格式的生成
2、 服務(wù)器端反饋數(shù)據(jù)格式的解析
服務(wù)器端程序需要完成的處理為:
1、 服務(wù)器端反饋協(xié)議格式的生成
2、 客戶端發(fā)送協(xié)議格式的解析
這里的生成是指將計算好的數(shù)據(jù),轉(zhuǎn)換成規(guī)定的數(shù)據(jù)格式,這里的解析指,從反饋的數(shù)據(jù)格式中拆分出需要的數(shù)據(jù)。在進行對應(yīng)的代碼編寫時,嚴格遵循協(xié)議約定即可。
所以,對于程序員來說,在進行網(wǎng)絡(luò)程序編寫時,需要首先根據(jù)邏輯的需要設(shè)計網(wǎng)絡(luò)協(xié)議格式,然后遵循協(xié)議格式約定進行協(xié)議生成和解析代碼的編寫,最后使用網(wǎng)絡(luò)編程技術(shù)實現(xiàn)整個網(wǎng)絡(luò)編程的功能。
由于各種網(wǎng)絡(luò)程序使用不同的協(xié)議格式,所以不同網(wǎng)絡(luò)程序的客戶端之間無法通用。
而對于常見協(xié)議的格式,例如HTTP(Hyper Text Transfer Protocol,超文本傳輸協(xié)議)、FTP(File Transfer Protocol,文件傳輸協(xié)議),SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)等等,都有通用的規(guī)定,具體可以查閱相關(guān)的RFC文檔。
網(wǎng)絡(luò)協(xié)議格式對于一種網(wǎng)絡(luò)程序來說,是該程序最核心的技術(shù)秘密,因為一旦協(xié)議格式泄漏,則任何一個人都可以根據(jù)該格式進行客戶端的編寫,這樣將影響服務(wù)器端的實現(xiàn),也容易出現(xiàn)一些其它的影響。
【編輯推薦】
























