【程序設(shè)計藝術(shù)】TCP和UDP為何可以共用同一端口

網(wǎng)絡(luò)七層協(xié)議:

其中茸俭,傳輸層:

同一臺機器的同一個端口只可以被一個進程使用,一般用于tcp安皱,或者udp调鬓。那一個進程使用同一個端口同時監(jiān)聽tcp、udp請求酌伊,是否可以呢腾窝?

答案:可以。

端口可以形象地比喻成操作系統(tǒng)上的編號唯一的文件居砖,應(yīng)用程序和網(wǎng)絡(luò)協(xié)議可以對其進行i/o操作虹脯。

但是既然唯一又為何tcp udp可以用相同的端口號呢?這樣的話悯蝉,程序在連接到端口時归形,怎么知道此時從該端口進來的數(shù)據(jù)是tcp的還是udp的呢?

是不是可以這樣理解鼻由?端口的唯一性的標(biāo)識不是端口號,而是端口號和協(xié)議名稱的組合厚棵,應(yīng)用程序和協(xié)議尋址時就是靠的這個組合蕉世?

使用netstat -an自己看看就知道了,IP數(shù)據(jù)包首部有個叫做協(xié)議的字段婆硬,指出了上層協(xié)議是TCP還是UDP還是其他P狠轻。
協(xié)議字段(報頭檢驗和前面那個),其值為6彬犯,則為TCP向楼;
其值為17,則為UDP谐区。

[root@web ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:46997               0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0     64 10.0.0.7:22                 10.0.0.253:61752            ESTABLISHED 
tcp        0      0 :::3306                     :::*                        LISTEN      
tcp        0      0 :::111                      :::*                        LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 :::40566                    :::*                        LISTEN      
udp        0      0 127.0.0.1:967               0.0.0.0:*                               
udp        0      0 0.0.0.0:34398               0.0.0.0:*                               
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               
udp        0      0 0.0.0.0:944                 0.0.0.0:*                               
udp        0      0 :::111                      :::*                                    
udp        0      0 :::944                      :::*                                    
udp        0      0 :::19764                    :::*   

操作系統(tǒng)有能力根據(jù)接受的報文的IP字段里面的協(xié)議部分判斷這個報文是什么報文湖蜕。

就是說,系統(tǒng)讀數(shù)據(jù)的時候還沒有讀到上層報文(TCP/UDP)的時候已經(jīng)知道上層是什么報文了宋列,直接交給相關(guān)的內(nèi)核進程或協(xié)議棧處理就可以了昭抒。而在同一個協(xié)議內(nèi)部端口號唯一。

TCP和UDP為何可以共用同一端口

一:何為端口盗迟?

從網(wǎng)絡(luò)層的角度來看,它是不知道端口這個概念的熙含,tcp\udp都是包裹在ip協(xié)議內(nèi)的罚缕,ip協(xié)議只需要知道ip對應(yīng)的硬件地址就可以把遠端的網(wǎng)絡(luò)包發(fā)送到目的主機上。

端口這個概念是由操作系統(tǒng)劃分的怎静。因為內(nèi)核不可能把所有網(wǎng)絡(luò)數(shù)據(jù)都發(fā)送給所有的進程邮弹,所以為了區(qū)分哪些數(shù)據(jù)該劃分給哪些進程,便在傳輸層的協(xié)議中定義了端口消约。而tcp和udp協(xié)議中的端口號占位都是16位肠鲫,所以操作系統(tǒng)能綁定的端口也就只有65535個。這也解釋了為什么linux里設(shè)置單個進程所能打開的最大文件描述符數(shù)量最好設(shè)置為65535或粮。關(guān)于文件描述符和端口又有什么關(guān)系导饲,下面會進行說明。

二:如何綁定端口氯材?

這里需要用c語言的系統(tǒng)函數(shù)去解釋:

    #include <sys/socket.h>

    int socket(int domain, int type, int protocol);

這個函數(shù)用來創(chuàng)建socket套接字描述符也就是文件描述符渣锦。
其中type參數(shù):
SOCK_STREAM —— TCP協(xié)議
SOCK_DGRAM —— UDP協(xié)議
SOCK_SEQPACKET —— ipx/spx協(xié)議
而返回的int值就是一個非負的文件描述符fd。linux內(nèi)核中維護了一份文件描述符表氢哮,如下圖袋毙,來存儲文件描述符fd。

    #include <sys/socket.h>

    int bind(int socket, const struct sockaddr *address,socklen_t address_len);

這個函數(shù)用來綁定端口冗尤,socket參數(shù)就是fd听盖,而sockaddr則是一個套接字地址結(jié)構(gòu)。
sockaddr結(jié)構(gòu)如下:

    sa_family_t    sin_family    /*描述是文件還是套接字*/
    in_port_t      sin_port      /*端口*/
    struct in_addr sin_addr      /*ip*/
    unsigned char  sin_zero[8]   /*sizeof(struct sockaddr)*/

可以看到linux是以協(xié)議裂七、ip皆看、端口來綁定端口的,所以不同協(xié)議相同的ip和端口也是可以綁定成功的背零。


Kotlin開發(fā)者社區(qū) :

http://www.reibang.com/c/498ebcfd27ad

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腰吟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徙瓶,更是在濱河造成了極大的恐慌毛雇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侦镇,死亡現(xiàn)場離奇詭異灵疮,居然都是意外死亡,警方通過查閱死者的電腦和手機虽缕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門始藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒲稳,“玉大人,你說我怎么就攤上這事伍派〗” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵诉植,是天一觀的道長祥国。 經(jīng)常有香客問我,道長晾腔,這世上最難降的妖魔是什么舌稀? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮灼擂,結(jié)果婚禮上壁查,老公的妹妹穿的比我還像新娘。我一直安慰自己剔应,他們只是感情好睡腿,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著峻贮,像睡著了一般席怪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纤控,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天挂捻,我揣著相機與錄音,去河邊找鬼船万。 笑死刻撒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耿导。 我是一名探鬼主播疫赎,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碎节!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抵卫,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤狮荔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后介粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殖氏,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年姻采,在試婚紗的時候發(fā)現(xiàn)自己被綠了雅采。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婚瓜,靈堂內(nèi)的尸體忽然破棺而出宝鼓,到底是詐尸還是另有隱情,我是刑警寧澤巴刻,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布愚铡,位于F島的核電站,受9級特大地震影響胡陪,放射性物質(zhì)發(fā)生泄漏沥寥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一柠座、第九天 我趴在偏房一處隱蔽的房頂上張望邑雅。 院中可真熱鬧,春花似錦妈经、人聲如沸淮野。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽录煤。三九已至,卻和暖如春荞胡,著一層夾襖步出監(jiān)牢的瞬間妈踊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工泪漂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廊营,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓萝勤,卻偏偏與公主長得像露筒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敌卓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361