如何通俗地解釋一下 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!
TCP
它把可靠傳輸機制代碼封裝成了接口函數API,即socket , 同時用TCP Port來辨別其服務的application Protocol。而application protocol 只需要對自己的協議本身和協議數據做解釋,完成端對端的會話。
第二個問題:現在 Ethernet + TCP + application protocol ,這個包能跑多遠?
也就是一個廣播域那么大的范圍了吧?小樣再怎么得瑟也逃不出廣播域的圈圈!
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
其實UDP除了提供一個Port來分辨application protocol , 確實沒干點別的,但是Port 號占用2個字節,理論上可以分辨65535種 application protocol ,就這一條就可以讓其功德圓滿了,正是因為它不像TCP,是完全無狀態協議,所以也深得一些應用程序的青睞,因為UDP無狀態,IP也無狀態,會話所有的狀態都由application protocol 來進行控制,這也是一種選擇。
另外UDP-based 的應用可以實現可靠傳輸,比如TFTP,那就由TFTP自己來實現可靠傳輸;也可以把數據交給UDP,讓其發送出去即可,對發送出去的數據不需要確認,同學們會問:這是哪種應用啊?語音流量,丟了就丟了,對方聽不見大不了再說一遍。
綜述
TCP提供一種可靠傳輸機制,有狀態。
UDP提供更多的門牌號來辨別上層的協議,無狀態。