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