前言
在我們開始學(xué)習(xí)網(wǎng)絡(luò)編程的時候,我們發(fā)現(xiàn)一些名詞出現(xiàn)的頻率極其高闲勺,比如 TCP/IP曾棕、UDP、OSI 七層網(wǎng)絡(luò)模型等菜循。這肯定不是偶然翘地,因為它們極其重要,才會被人反復(fù)提及癌幕。尤其在面試的時候衙耕,面試官喜歡把它們拿來,當(dāng)作考察面試者基礎(chǔ)功底的重要環(huán)節(jié)勺远。為了不讓文章顯得冗余橙喘,我們今天只談網(wǎng)絡(luò)中的 TCP、UDP 和端口
協(xié)議胶逢、TCP 和 UDP
在了解 TCP(Transmission Control Protocol 即傳輸控制協(xié)議) 和 UDP(User Datagram Protocol 即用戶數(shù)據(jù)包協(xié)議) 之前厅瞎,我們先要知道一個名詞,即協(xié)議初坠。它到底是什么磁奖?它其實就是一套約定成俗的規(guī)則。就像開會的時候某筐,我們達(dá)成了一些共識,先開發(fā)那個接口冠跷,項目什么時候上線等等南誊。
可以毫不夸張地說計算機(jī)網(wǎng)絡(luò)的構(gòu)建與發(fā)展,奠基石就是各種網(wǎng)絡(luò)協(xié)議蜜托。它們定義了信息通訊的方式抄囚,以及如何收發(fā)信息等,比如:
IP 協(xié)議負(fù)責(zé)將多個包交換網(wǎng)絡(luò)連接起來橄务,并管理通訊 IP 源地址和目標(biāo)地址的協(xié)議
TCP 和 UDP 協(xié)議則是位于應(yīng)用層和 IP 層之間幔托,負(fù)責(zé)它們之間信息傳輸?shù)闹匾獏f(xié)議
既然是協(xié)議,大家都必須遵守蜂挪,否則重挑,今天張三定一個協(xié)議,李四不同意棠涮,他明天再定一個協(xié)議谬哀,這就亂了套。因此严肪,不同的大廠和許多公司就聯(lián)合起來組成一個組織史煎,將這些協(xié)議統(tǒng)一規(guī)范起來谦屑。你就必須得用這些規(guī)定好的協(xié)議,否則就無法通信篇梭。這才實現(xiàn)了“地球村”的夢想氢橙。今天無論用什么設(shè)備,在世界的任何角落恬偷,用哪種國家的語言悍手,都可以很方便地使用網(wǎng)絡(luò)進(jìn)行通信
TCP 和 UDP 的特點
用一個不算嚴(yán)謹(jǐn)?shù)恼f法總結(jié) TCP 就是,女孩子如果遇到 TCP 這樣的男生喉磁,就嫁了吧谓苟。因為TCP的核心特點就是靠譜。他的特定包括协怒,面向連接涝焙、可靠、基于字節(jié)流控制的傳輸孕暇,就像一個管道一樣將應(yīng)用層和 IP 層連接起來
而與之相對應(yīng)的仑撞,UDP 就像二十多歲的浪子。他們不夠可靠妖滔,但卻充滿熱情隧哮。一切以效率為先,他們可以馬上答應(yīng)你很多事情座舍,并且愿意立馬付出實踐沮翔。你這一秒說佛珠浪漫,他不管身處何處曲秉,立馬搭飛機(jī)給你去取采蚀,下一秒說想去聽周杰倫的演唱會,他立馬給你訂票承二。當(dāng)然榆鼠,人的精力和時間都有限,所以就可能出現(xiàn)不可控的意外亥鸠,比如根本沒有足夠的錢買門票等妆够。這和UDP相仿,它提供無連接通信负蚊,但不對傳送的數(shù)據(jù)包提供可靠性保證
TCP 和 UDP 的特點總結(jié)
TCP 和 UDP 的使用場景
不同的人神妹,因性格不同,做事的方式也不一樣家妆,你不能說這樣就一定好灾螃,那樣就一定不好,對于 TCP 和 UDP 也是一樣揩徊,在不同的場景中腰鬼,他們各有各的妙用
比如在開發(fā)一個游戲的的程序是嵌赠,對于玩家登陸賬號,因為我們要確保不同的玩家能登陸到自己的賬號熄赡,這個時候就要應(yīng)用 TCP 協(xié)議姜挺。而對于控制游戲中角色的移動,我們只需根據(jù)玩家鼠標(biāo)的點擊移動角色彼硫,如果因為小概率的網(wǎng)絡(luò)問題炊豪,對于玩家來說,再次進(jìn)行角色移動操作即可拧篮,成本和風(fēng)險在可控范圍內(nèi)词渤,因此就可以使用 UDP 協(xié)議
我們從以上可以看出,如果是基礎(chǔ)服務(wù)功能串绩,則最好使用 TCP 協(xié)議缺虐,保證服務(wù)的可靠性。以確保過程中礁凡,每一個網(wǎng)絡(luò)包能夠正確抵達(dá)目的地高氮。而相較于 UDP ,程序員則需要自己去進(jìn)一步做丟包情況和字節(jié)傳輸順序的處理
可不要因此就覺得 UDP 非常難用顷牌,正相反剪芍,其實有大量的服務(wù)是基于 UDP 協(xié)議的。比如 DNS 解析服務(wù)窟蓝。每一臺電腦訪問外網(wǎng)網(wǎng)頁罪裹,都需要通過 DNS 服務(wù)解析域名,從中找到對應(yīng)的 IP 地址运挫。這個時候如果 DNS 出了問題坊谁,我們其實只需要再一次進(jìn)行 DNS 尋址查詢即可。唯一的副作用滑臊,可能就是有一丁點兒延遲罷了
另一個 UDP 的應(yīng)用就是 IP 電話, 我們常把它稱作 VoIP(Voice over IP)箍铲,它的原理可以簡化的理解為雇卷,把撥打電話從以往的電話通訊,轉(zhuǎn)移到網(wǎng)絡(luò)通訊上颠猴,類似于我們現(xiàn)在的微信通話关划。當(dāng)你和某人通話的時候,用的就是 UDP 翘瓮,想象一下贮折,其實我們這個時候需要的并不是可靠性,而是實時性资盅。如果不幸中間有一點信息損失了调榄,比如你媽說:“過年給我把對象帶回來踊赠,不然就別回來了”。由于信息損失一部分每庆,像這樣——“過年給 把對象帶 來筐带,不然 別回 了”,其實我們是可以理解一整句話的意思的缤灵。而如果用 TCP伦籍,我們可能說一句話,別人 30 秒之后才能聽到腮出,這顯然是不能忍受的
因此帖鸦,我們明白了,在日常的開發(fā)過程中胚嘲,我們應(yīng)該根據(jù)不同的應(yīng)用場景作儿,選擇對應(yīng)的 TCP 或者 UDP 作為網(wǎng)絡(luò)傳輸協(xié)議,而不能因為我們對 UDP 不熟悉慢逾,就從心理上抗拒它
端口及其特點
如果 IP 是用來定位街區(qū)的立倍,那么端口就是對應(yīng)于該街區(qū)中每一戶的門牌號。在通訊過程中侣滩,數(shù)據(jù)通過各種通訊協(xié)議最終抵達(dá)設(shè)備(如計算機(jī))后口注,這里的設(shè)備就相當(dāng)于一個街區(qū),而在設(shè)備計算機(jī)內(nèi)部有很多程序在跑君珠,數(shù)據(jù)進(jìn)來之后寝志,必須要給它一個對應(yīng)的門牌號(即端口號),程序才方便進(jìn)行后續(xù)操作
端口號屬于傳輸協(xié)議的一部分策添,因此我們可以說材部,數(shù)據(jù)通過 IP 地址發(fā)送對應(yīng)的數(shù)據(jù)到指定設(shè)備上,而通過端口號把數(shù)據(jù)發(fā)送到指定的服務(wù)或程序上
程序一般不止是監(jiān)聽指定的端口號唯竹,而且也會明確對應(yīng)的傳輸協(xié)議乐导。所以我們在進(jìn)行數(shù)據(jù)傳輸?shù)臅r候,既要指定對應(yīng)的端口號浸颓,也要指定對應(yīng)的通訊協(xié)議物臂,很多人僅僅會說:程序 A 監(jiān)聽著 33001 端口,這個是不正確的产上,至少是不完全正確的棵磷。相應(yīng)的,我們應(yīng)該這樣說:程序 A 使用 TCP 協(xié)議晋涣,監(jiān)聽 33001 端口仪媒,當(dāng)然你也可以說:程序 A 使用 UDP 協(xié)議,監(jiān)聽 33001 端口
指定傳輸協(xié)議和端口谢鹊,顯而易見的好處在于算吩,當(dāng)我們進(jìn)行端口轉(zhuǎn)發(fā)或者構(gòu)建網(wǎng)絡(luò)防火墻的時候留凭,我們可以很方便的通過協(xié)議和端口進(jìn)行隔離。以防止不可預(yù)見的意外發(fā)生赌莺。對于計算機(jī)來說冰抢,通過這種方式可以防止外網(wǎng)各種不必要的數(shù)據(jù),進(jìn)入本地局域網(wǎng)
你可能會想艘狭,這么多端口號挎扰,如果大家都用同一個,那不是也有沖突巢音。沒錯遵倦,這就需要一個專門的組織來管理它們,IANA( Internet Assigned Numbers Authority 即互聯(lián)網(wǎng)號碼分配局 )官撼,它負(fù)責(zé)管理端口注冊梧躺。大多數(shù)主流的程序,都有一個明確的已注冊端口傲绣,比如常見的 FTP 監(jiān)聽 20掠哥、 21 端口,而 HTTP 服務(wù)監(jiān)聽 80 端口等秃诵。如果有一個程序想注冊某個端口续搀,那么 IANA 會先去查一查這個端口是否已被注冊,如果已經(jīng)被注冊了菠净,它則會拒絕申請
端口號根據(jù)范圍分為三種
- Well-Known Ports(即公認(rèn)端口號)
它是一些眾人皆知著名的端口號禁舷,這些端口號固定分配給一些服務(wù),我們上面提到的 HTTP 服務(wù)毅往、 FTP服務(wù)等都屬于這一類牵咙。知名端口號的范圍是:0-1023
- Registered Ports(即注冊端口)
它是不可以動態(tài)調(diào)整的端口段,這些端口沒有明確定義服務(wù)哪些特定的對象攀唯。不同的程序可以根據(jù)自己的需要自己定義洁桌,注冊端口號的范圍是:1024-49151
- Dynamic, private or ephemeral ports(即動態(tài)、私有或臨時端口號)
顧名思義侯嘀,這些端口號是不可以注冊的另凌,這一段的端口被用作一些私人的或者定制化的服務(wù),當(dāng)然也可以用來做動態(tài)端口服務(wù)残拐,這一段的范圍是:49152–65535