如何通俗地解釋一下 TCP/UDP 協(xié)議和 HTTP、FTP、SMTP 等協(xié)議之間的區(qū)別?
先來假設(shè)沒有TCP,甚至沒有IP層,只有MAC對應(yīng)的數(shù)據(jù)鏈路層,HTTP等協(xié)議能跑多遠(yuǎn)!
直接把HTTP封裝在Ethernet Frame 里,可以嗎?
當(dāng)然可以,在同一個二層廣播域里,通過MAC地址來識別對方,然后HTTP的數(shù)據(jù)通過網(wǎng)卡接口函數(shù)完成發(fā)送和接收。
第二個問題:如何保證數(shù)據(jù)萬無一失地到達(dá)對方?
讓網(wǎng)卡來保證數(shù)據(jù)的可靠傳輸嗎?網(wǎng)卡只對Ethernet 幀頭做解釋,以太網(wǎng)頭14個字節(jié)也沒有哪個字段可以勝任這個可靠傳輸?shù)娜蝿?wù),那HTTP是不是要自己實現(xiàn)數(shù)據(jù)傳輸?shù)每煽繖C(jī)制,比如發(fā)送一段1000字節(jié)的數(shù)據(jù),要等待對方給自己確認(rèn)收到,然后再來發(fā)送,這樣是可以保證數(shù)據(jù)可靠傳輸。
同樣FTP,STMP,POP3,BGP都是要保證數(shù)據(jù)可靠的傳輸,那他們是不是也要自己實現(xiàn)這些可靠的機(jī)制呢?
必須的!
換句話說,只要有一個應(yīng)用,要可靠傳輸,必須由 application protocol 來實現(xiàn)!是不是很笨啊???這所有application protocol 的可靠傳輸機(jī)制是同樣的實現(xiàn),代碼都應(yīng)該類似,如果我們把這些被重用的代碼封裝起來,即接口函數(shù)API,讓他實現(xiàn)數(shù)據(jù)的可靠傳輸,同時用一個標(biāo)識符來表明這是哪個application protocol,是不是可行呢?
當(dāng)然可行了,快遞公司不就是這樣操作的嘛!
這就是偉大TCP/IP協(xié)議的***所高度抽象出來的流量調(diào)度員:TCP!
TCP
它把可靠傳輸機(jī)制代碼封裝成了接口函數(shù)API,即socket , 同時用TCP Port來辨別其服務(wù)的application Protocol。而application protocol 只需要對自己的協(xié)議本身和協(xié)議數(shù)據(jù)做解釋,完成端對端的會話。
第二個問題:現(xiàn)在 Ethernet + TCP + application protocol ,這個包能跑多遠(yuǎn)?
也就是一個廣播域那么大的范圍了吧?小樣再怎么得瑟也逃不出廣播域的圈圈!
IP層就是來解決這個問題的,有了IP層可以讓Internet 成為可能,一句廣告詞:impossible is nothing! 要知道IP就是 Internet Protocol 的縮寫。
你可能要問了, 我想要IP層,不想要TCP層,直接把數(shù)據(jù)封裝在IP層可以嗎?
太可以了!不光可以,而且好多協(xié)議也是這么做的,OSPF,EIGRP,GRE,ESP,AH等協(xié)議都是這么做的,如果他們想保證可靠傳輸,他們自己用代碼來實現(xiàn),這當(dāng)然可以。
問題是IP只用一個字節(jié)來表示協(xié)議號,理論上只能辨識255種上層協(xié)議,資源非常緊張,而且都被知名的大牌協(xié)議所霸占著,比如TCP,ICMP,IGMP,包括上面提到的,哪里輪的上你哦!
為了解決這個資源緊張問題,于是就有了另外一個小發(fā)明,只用來辨別application protocol 的小傀儡:UDP!
UDP
其實UDP除了提供一個Port來分辨application protocol , 確實沒干點(diǎn)別的,但是Port 號占用2個字節(jié),理論上可以分辨65535種 application protocol ,就這一條就可以讓其功德圓滿了,正是因為它不像TCP,是完全無狀態(tài)協(xié)議,所以也深得一些應(yīng)用程序的青睞,因為UDP無狀態(tài),IP也無狀態(tài),會話所有的狀態(tài)都由application protocol 來進(jìn)行控制,這也是一種選擇。
另外UDP-based 的應(yīng)用可以實現(xiàn)可靠傳輸,比如TFTP,那就由TFTP自己來實現(xiàn)可靠傳輸;也可以把數(shù)據(jù)交給UDP,讓其發(fā)送出去即可,對發(fā)送出去的數(shù)據(jù)不需要確認(rèn),同學(xué)們會問:這是哪種應(yīng)用啊?語音流量,丟了就丟了,對方聽不見大不了再說一遍。
綜述
TCP提供一種可靠傳輸機(jī)制,有狀態(tài)。
UDP提供更多的門牌號來辨別上層的協(xié)議,無狀態(tài)。