1. 程式人生 > >如何通俗地解釋一下 TCP/UDP 協議和 HTTP、FTP、SMTP 等協議之間的區別?

如何通俗地解釋一下 TCP/UDP 協議和 HTTP、FTP、SMTP 等協議之間的區別?

先來假設沒有TCP,甚至沒有IP層,只有MAC對應的資料鏈路層,HTTP等協議能跑多遠?

直接把HTTP封裝在Ethernet Frame 裡,可以嗎?當然可以,在同一個二層廣播域裡,通過MAC地址來識別對方,然後HTTP的資料通過網絡卡介面函式完成傳送和接收。

那問題來了,如何保證資料萬無一失地到達對方?讓網絡卡來保證資料的可靠傳輸嗎?網絡卡只對Ethernet 幀頭做解釋,乙太網頭14個位元組也沒有哪個欄位可以勝任這個可靠傳輸的任務,那HTTP是不是要自己實現資料傳輸得可靠機制,比如傳送一段1000位元組的資料,要等待對方給自己確認收到,然後再來發送,這樣是可以保證資料可靠傳輸。

同樣FTP,STMP,POP3,BGP都是要保證資料可靠的傳輸,那他們是不是也要自己實現這些可靠的機制呢?那是一定,也就是說只要有一個應用,要可靠傳輸,必須由 application protocol 來實現!是不是很笨啊???這所有application protocol 的可靠傳輸機制是同樣的實現,程式碼都應該類似,如果我們把這些被重用的程式碼封裝起來,即介面函式API,讓他實現資料的可靠傳輸,同時用一個識別符號來表明這是哪個application protocol,是不是可行呢?可行!!!

這就是偉大TCP/IP協議的締造者所高度抽象出來的東東:TCP!
它把可靠傳輸機制程式碼封裝成了介面函式API,即socket , 同時用TCP Port來辨別其服務的application Protocol。而application protocol 只需要對自己的協議本身和協議資料做解釋,完成端對端的會話。

第二個問題:現在 Ethernet + TCP + application protocol ,這個包能跑多遠?也就是一個廣播域那麼大的範圍了吧?yes,sir,小樣再怎麼得瑟也逃不出廣播域的圈圈。IP層就是來解決這個問題的,有了IP層可以讓Internet 成為可能,一句廣告詞:impossible is nothing! 要知道IP就是 Internet Protocol 的縮寫。

那你可能要問了, 我想要IP層,不想要TCP層,直接把資料封裝在IP層可以嗎? 太可以了!不光可以,而且好多協議也是這麼做的,OSPF,EIGRP,GRE,ESP,AH等協議都是這麼做的,如果他們想保證可靠傳輸,他們自己用程式碼來實現,這當然可以。

問題是IP只用一個位元組來表示協議號,理論上只能辨識255種上層協議,資源非常緊張,而且都被知名的大牌協議所霸佔著,比如TCP,ICMP,IGMP,包括上面提到的,哪裡輪的上你哦!為了解決這個資源緊張問題,於是就有了另外一個什麼鳥事不幹,只用來辨別application protocol 的小東西:UDP!


其實UDP除了提供一個Port來分辨application protocol , 確實沒幹點別的,但是Port 號佔用2個位元組,理論上可以分辨65535種 application protocol ,就這一條就可以讓其功德圓滿了,正是因為它不像TCP,是完全無狀態協議,所以也深得一些應用程式的青睞,因為UDP無狀態,IP也無狀態,會話所有的狀態都由application protocol 來進行控制,這也是一種選擇。

另外UDP-based 的應用可以實現可靠傳輸,比如TFTP,那就由TFTP自己來實現可靠傳輸;也可以把資料交給UDP,讓其傳送出去即可,對傳送出去的資料不需要確認,同學們會問:這是哪種應用啊?語音流量,丟了就丟了,對方聽不見大不了再說一遍。

綜上,TCP提供一種可靠傳輸機制,有狀態
;UDP提供一種更多的空間來辨別上層的協議,無狀態