我感覺現在計算機網路間通信可以通過編程手段來實現很多功能呀。

比如像email傳輸,現在的網路中真的使用SMTP協議了嗎?難道不可以通過TCP協議(socket編程),然後通過編程手段來實現郵件的發送和接受嗎。

再比如FTP協議,雖說現在確實有FTP應用,那麼百度雲或者QQ群文件共享這種也不需要FTP協議吧(如果需要的話請幫忙指出並改正)。

所以我想知道的就是,計算機網路中的協議到底都是在什麼場合下使用的。


一開始的時候是稱為「協議」,當時的環境是不同公司的產品互相不互通,最有名的就是TCP/IP誕生的起源,據說阿帕網ARPR最初誕生,就是因為當時美國海陸空三軍,分別採用的是Honeywell,DEC,IBM的電腦,當時計算機網路初期,每一家公司都是自己有網路可以互通的,但是不同公司的通信標準不同,所以就要做一個跨越公司自己的標準的通信協議,所以就有了TCP/IP協議(看中興的對話系列書裡面說的)。IP層的匯聚性和兼容性也就這裡很好的看出來。所以這也是為什麼我們稱呼網路協議這個說法 ,其實協議就是字面意思,是不同家公司,為了互通,而達成的某種妥協的標準。現在網路協議的含義更近似於標準,實際上是由很多家公司或者組織集體設立的,其他人遵從就行了。

至於這裡提的問題,在目前而言,是TCP/IP底層這張網已經統一了,所以點與點的互通性問題解決後,很多事情是可以通過socket直接思路來考慮的。而早期,實際上將近千禧年吧,之前網路底層的互通性都不是單純的TCP/IP,包含SDH,ATM,等等,各種各樣的協議都有。所以有的路由層面要搞兼容性,甚至到應用層面還要針對於底層的兼容性,或者延遲之類的參數做調節,所以不是單純的僅僅是為了實現功能。我記得一開始在推SDN的時候,Nick老師的課件裡面說給OSPF的一個示例,一個協議至少100多頁吧,裡面OSPF核心演算法就十幾頁,其餘大部分的內容實際上和兼容性的關係都不小。所以協議不是單純的功能,協議更如同其名字一樣,是一種不同標準或者不同策略的妥協,所以協議這個名字描述還是挺妥當的。

現在而言,計算機網路高速發展,所以網路協議實際上開始更偏重於本身功能,而且各種各樣解耦合了許多次,相比原來的各種兼容開銷,現在是越來越少了,所以網路效率也越來越高。


題主在生活中籤過協議嗎?

肯定簽過,因為你打開知乎的時候,它就要求你同意一個用戶服務協議。

協議,就是規範了雙方,或者多方行為的一種方式,你應該做什麼,對方應該做什麼。

計算機網路,以及所有計算機科學範圍內,幾乎所有需要約束兩方及多方行為的場景里,就會設計一個協議出來。舉例子么就很簡單,挑個最常見的,就BGP吧。

BGP協議實際上就是對一台路由器運行BGP程序去和別的路由器建立鄰居,交換路由,以及從路由中選擇最優的注入路由表這些行為,做了規範和約束,大家都得遵守,誰不遵守BGP,誰的BGP就沒辦法和別人的一起用,網路自然就無法連接起來。

每個協議都很複雜,展開來講都很長,絕不是舉舉例子就能說明白的。


我最近總是回答一些沒人回答的問題……感覺不會再愛了。一條條講題主的想法吧。

太長不看版:當你想實現某個功能,而某協議只要你按照某些步驟去做就能實現這個功能,那麼你按照這些步驟做,這個協議就這樣被你用了。

我感覺現在計算機網路間通信可以通過編程手段來實現很多功能呀。

是的,你是對的。那些協議的實現,那一堆什麼ftp客戶端啥的,都是這麼做的。你通過編程手段來實現功能,就是在實現一個自己設計的網路協議。

比如像email傳輸,現在的網路中真的使用SMTP協議了嗎?難道不可以通過TCP協議(socket編程),然後通過編程手段來實現郵件的發送和接受嗎。

是的,現在的網路真的使用了SMTP協議來發郵件。

當然可以了!但是計算機領域有句名言,叫做「不要重複造輪子」。SMTP協議幾十年前就被用來做email傳輸了,客戶端和服務端要怎麼做在RFC821文檔規定得清清楚楚,其相關的實現,庫,服務端軟體,客戶端軟體何其多也,到底SMTP哪方面不合您的意了,非要另起爐灶自己實現郵件的發送和接收?

所謂網路協議,只是計算機之間為了能夠正常通信而達成的一個個約定而已。現在我們經常用的那些網路協議,就是以前一幫專家覺得,計算機網路通信需要這麼一個功能,為了實現這個功能,我們應該發送什麼數據,接收到的數據怎麼解析,怎麼根據這些數據和周圍環境進行相應的動作,設計好了之後形成文檔,放出一份RFC到網際網路上,讓大家都討論一下。大家覺得好,有意義,可實現,整個過程能達到功能需求,大家一起用這個文檔所述的方式來實現這個功能需求,於是就成了大家都遵守的網路協議。

而你現在想通過編程手段來實現這一功能,你會怎麼做?不還是想應該發送什麼數據,接收到的數據怎麼解析,怎麼根據這些數據和周圍環境進行相應的動作嗎?那麼其實你自己就設計了一套網路協議,不過只有你自己用,只有安裝了支持你自己設計協議的軟體的計算機之間才能用你的協議來做電子郵件傳輸。用來做個計算機網路編程作業還是可以的,但是實際情況下,有一個很成熟的方案在這裡,直接拿來用,它不香嗎?

再比如FTP協議,雖說現在確實有FTP應用,那麼百度雲或者QQ群文件共享這種也不需要FTP協議吧(如果需要的話請幫忙指出並改正)。

據我了解,它們應該沒用FTP協議。為什麼不用FTP協議呢?因為文件傳輸這個需求,別的協議也能幹,比如HTTP協議。你在網頁上傳文件,就用的HTTP協議。另外,百度雲和QQ群文件之類的可能有些FTP不能滿足的需求,比如加密傳輸啊,P2P加速啊,那麼只好選擇用能滿足需求的協議了,甚至得自己做一套協議。

所以我想知道的就是,計算機網路中的協議到底都是在什麼場合下使用的。

網路協議就是為了能夠滿足某一個功能需求,制定出來的一套計算機之間進行數據交換的規則和約定。SMTP是簡單郵件傳輸協議,所以在需要滿足傳輸電子郵件需求的場景下,我們就可以用SMTP。FTP是文件傳輸協議,所以在需要滿足傳輸文件需求的場景下,我們就可以用FTP。HTTP是超文本傳輸協議,文件是一種超文本,所以我們也可以用HTTP來滿足傳輸文件的要求。

我自己通過編程手段來實現A功能的那段代碼,又稱我自己開發的能實現A功能的網路協議實現,取個名字,比如myTP,那麼myTP就可以用在需要A功能的場合。

另外,網路協議並不全是你拿什麼socket編程就能完成的。socket是TCP協議里的一個概念,因此你只能用它來設計實現一些基於TCP的應用層協議。像什麼用來讓連到網路里的計算機能夠順利地相互傳遞消息的IP協議啊,什麼讓手機能夠解析出空氣中特定電磁波信號里的網路數據的WiFi協議(IEEE 802.11)啊,socket編程就無能為力了。


計算機網路協議現實生活中,無處不在。幾乎所有網路通信都是用計算機網路協議。

現想中計算網路協議一共七層網路協議。

現實中是四層網路協議。

實驗室的第七層協議和現實的四層協議對應關係如下:

整個計算機通信過程基本如下:

網路協議是一層層加封,接受方也是一層層解封。

TCP協議是屬於傳送層,SMTP協議,FTP協議是屬於第七層應用。簡單一句話,SMTP協議,FTP協議底層就是靠TCP協議進行傳送

TCP協議是基層協議,那就有一個問題?

TCP協議是底層協議可以開發所有的東西,直接TCP協議開發不就可以了嗎?完全正確!基於TCP協議可以開發任何協議,自定義協議

那麼問題來了,你的協議你理解,他的協議他理解。

如果只是基於TCP協議開發,計算機網路發展將會非常困難!為什麼?

因為協議橫飛,各種各樣的協議,你不理解我,我不理解你,為什麼不統一規劃一下?將最常用,最需要的場景統一成一種協議? 大家一致遵守昵?結果是,所有人都注意到這個問題,他們成立一個國際標準化組織制定計算機主要通信協議。

你也可以使用TCP協議開發新的FTP協議,但是你的FTP協議卻無法流行。

原因一:大眾不認可你的協議。原因二:市場上全部都是使用原來FTP協議,替換更改成本太大。原因三:市場上面原來的FTP沒有被替換的被要性。所以你明白了,為什麼華為的5G網路協議會成為眾矢之的了吧。一旦華為的5G網路協議被廣泛應用,其它廠商即使研發出來之後,也無力或者很難跟整個市場對抗。

推翻成熟生態圈的成本比研究成本還高得多或者無法推翻(除非政治插手)。

這也是華為的5G協議一出來,立馬被國家圈為基建的重點,國家在推動這個發展,讓5G協議在實戰中快速提升。

附帶一張圖給你,常見的協議和這個協議所在的網路模型層。

記住高層協議依賴下層協議進行通信。說明了就是進一步封層了,但是底層還是依賴下一層進行通信。

這就是為什麼計算機協議每降一層,性能就能大大提高的原因。

少一層可以少計算很多東西,晶元負載就減輕很多。

計算機網路中的協議的最終目的是為了通信,所以要理解協議,可以從通信在現實生活中的實現去理解,比如說紙質書信。

假設A要寫信給B,A先在信紙上按照一定格式寫好要傳達給B的文字信息,然後裝進信封,並在信封上寫上B的地址、郵編、姓名以及A自己的地址、姓名等,封好,貼上郵票,再扔進郵筒。然後郵政人員會收取這封信件,並按照信封上收件人的信息,將信件運輸並最終投遞到收件人所在地的郵箱,這樣B就能收到這封信並讀到A寫的文字了。

在這個過程中,信件如何寫、信封需要以什麼形式包含哪些信息、信件如何投遞到收信人的郵箱等等這一系列的規定和流程,就可以看作是協議。


根據osi網路模型,應用層層協議本來就是就是在傳輸層的基礎上編程實現的。

而題主說的通過TCP協議(socket編程),通過編程手段來實現郵件的發送和接受,本質上是一樣的,只不過目前很多協議都是現成的,不用自己造輪子。

計算機網路中的協議到底都是在什麼場合下使用的? 你可以把所有的網路通信(傳輸層以上)都用socket編程來實現,什麼現成協議都不用。問題是:全部自己去實現難度大,費時多,且沒有通用性,很少有人這麼干。所以,目前能用現成的協議,就不會自己編程來實現了。


不知道你是想了解協議二字的概念么?你還是去隨便看一兩本計算機網路的科普書,再來提問比較好。


  1. email傳輸使用smtp協議了嗎?

Q:用了,你打開郵箱的設置,他會讓你列出你可選擇使用的協議,當然普通用戶完全不需要配置這個東西,如果是自研的郵箱程序,可能還可以自定義一個協議,在內部使用。

2. 難道不可以通過TCP協議(socket編程),然後通過編程手段來實現郵件的發送和接受嗎?

Q:tcp是傳輸層協議,smtp是應用層協議,smtp可以基於tcp也可以udp,都是可行,看你上層協議的需求 和 完成的職責,因此這並不衝突。

3. 百度雲或者QQ群文件共享不需要FTP協議吧?

Q:可以不走ftp協議,但要走自定義協議,比如微信/QQ都有自己的通信協議,避免被攔截數據造成安全問題。任何傳輸都需要遵循一定的規律,即便你直接走tcp傳輸,解析也要按照一定格式來,另外至少也是遵守了tcp協議的內容,根據目前主流的情況,如果自定義協議基本都是基於tcp/udp的傳輸層協議構建的,當然tcp/udp還有更下級的協議,這個內容就比較多了。

4. 計算機網路中的協議到底都是在什麼場合下使用的?

Q:前三點簡單回答應該能讓你有個概念了,現行的網路結構是分層的,每一層有每一層的職責,實現職責分離。這很好理解,畢竟如果不分級,就是茅坑裡的石頭,又臭又硬。

再者,即便規定了分層,但是每一層幹什麼呢? 乾的事情相同,用的方式是否需要相同呢?

具象化一點,假設我們要吃飯,你是點外賣還是自己做呢?吃的要不要健康一些呢?這裡情況很複雜。

同樣的計算機編程里也是一樣的情況,我要跟你通信,我們之間發數據,首先我們得有物理介質,那麼是什麼線呢?光纖?銅管?無線電?那麼我們發什麼樣的數據呢?電信號還是光信號?我發給你的信息代表什麼?比如010101在我這邊是什麼意思?在你那邊是什麼意思?你每次都是發不同的數據還是接近的數據? 數據有先後時間性嗎?

對於通信雙方這是一個必須知道的事情,否則根本無法完成通信,上述的約定就是協議三要素:語法,語義,時序。說到這裡你應該就明白,協議是幹什麼的? 協議是通信雙方的一組約定,我要做什麼,我能做什麼,我怎麼做。 接著就是什麼場合下使用? 任何超過兩個單元需要通信的都要用,只是簡單和複雜的問題。

接著解釋一下你說的tcp跟stmp,ftp的問題,tcp是傳輸層協議,在計算機網路中,數據由上層往下層傳輸,這在個問題里,stmp的pdu(協議數據單元),傳給傳輸層,包裝成tcp的pdu,再往下成幀…最終變成物理信號,所以其實並不衝突。tcp負責傳輸層的內容協議,例如 擁塞控制等,但他本身不具備smtp所需要的信息,也解析不了。而smtp本身也有規定內容,例如控制信息,附件,信件內容等,因為tcp只負責傳輸上層的數據,所以stmp的內容需要通過tcp傳輸完畢後,到目標進行內容解析。

所以很顯而易見的,應用層的協議基本都是一個應用一個協議…… 只不過http stmp ftp都是其中很典型的,所以會被拿出來說,但真正理解協議這個東西,得儘可能拋開這種很具體的東西,因為說到底你想規定一個應用層協議,今天就可以,至少在你的程序里是可行的協議。如果有幸得到認可,還可能變成通用協議。

因此別被很多書上的內容誤導,就像有些書上寫cookie的作用,上面會寫「可以完成電商網站的購物車」,這當然你不能說錯了,但是作為原理和總結性的話,這種淺層的結論明顯是不合適的,畢竟只是因為cookie可以存儲信息而已。協議也是同樣,不用具體深究某個應用層協議具體在什麼場合下使用,而是應該明白協議是究竟是什麼,這樣你就可以輕鬆反推了。

(當然應用層以下的協議還是要具體明白協議內容是什麼,怎麼用,畢竟那些已經是國際標準了。)


協議就是雙方都遵循的規則。

比如 A 要和 B 通信,告訴 B 每天的溫度和濕度,它們就可以定下一個溫濕度通信協議「我們用一個逗號來分隔溫度和濕度信息,逗號前面是溫度,逗號後面是濕度」,通信時,A 發一個 "2,3",B 就知道今天的溫度是 2,濕度是 3。

如果沒有這個協議,B 就不知道 A 發的什麼意思。


推薦閱讀:
相关文章