tcp c++ bind 端口_计算机端口到底是什么?
生活随笔
收集整理的這篇文章主要介紹了
tcp c++ bind 端口_计算机端口到底是什么?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
車總,我有個問題想向您請教一下。都說端口號是操作系統進行抽象,用來定位一個進程。那么當一臺主機上有兩張網卡時,每張網卡上綁定了一個IP地址。那么如果訪問不同IP地址的同一端口,比如80,應該不會定位到同一個程序吧。那么端口號就應該是針對于每一張網卡進行的進程抽象,而不是操作系統對每一個進程的抽象吧,不知道這樣子理解有沒有什么問題?私信太多無法一一回復,請各位見諒。這個問題特別有討論的價值,分享給有興趣的同學。當計算機接收到報文時,需要將這個報文遞交(Deliver)給某個特定的進程。計算機操作系統管理進程的方法,和公安系統管理人口很類似。為了唯一地識別一個公民,每個公民都有一個獨一無二的身份證號,比如31010xxxxxxxxxxx,每個號碼都是唯一的,這個身份證號就是人口管理系統的主鍵(Master Key)。只要把任意一個合法的身份證號輸入查詢系統,返回值一定是一個,而不能是多個。如果有多個返回值,那么這個系統估計是假的!操作系統,也給每個進程分配一個獨一無二的進程號(Process ID),其中包括操作系統自身的系統進程,以及由用戶執行的用戶進程。如果報文里攜帶進程號,操作系統(TCP/IP協議棧)只要把報文轉交給該進程號對應的進程就可以了。但是遺憾的是,報文里無論是以太幀頭、IP頭、TCP頭、以及應用層并沒有攜帶進程號,那么操作系統如何能將報文準確無誤地轉交給真正的接收進程?這難不住機智而聰明的操作系統設計大師,大師給每個進程提前喊話:各位老少爺們,如果各位想與外界通信,必須使用Bind(address,port)函數,將自己的進程號與本地的IP地址、端口號綁定起來。否則,后果自負!?注釋:上文的外界,可以是同一臺計算機上的其它進程,也可以是互聯網上的任何計算機上的進程。小弟(進程)聽到老大(操作系統)發話,個個嚴格遵守規則。有一個進程A是這么做的:Bind (‘1.1.1.1’, 50007),這個系統調用消息攜帶該進程的進程號ID= 165364,發給了操作系統TCP/IP協議棧。操作系統懶洋洋地拿出一個本子記錄一下:(1.1.1.1,50007)--------165364注釋:1.1.1.1 是IP地址,50007是端口號稍后當操作系統TCP/IP協議棧接收到一個IP報文,通過提取目的IP地址(位于IP頭)、目的端口號(位于TCP頭),這兩者的組合恰好為(1.1.1.1,50007)。操作系統查詢一下小本子,立馬就得知這是進程號= 165364進程A的,然后通知該進程A前來將報文取走。進程B也想如法炮制:Bind (‘1.1.1.1’, 50007),很遺憾,操作系統拒絕了。拒絕的消息如下:“builtins.OSError: [WinError 10048] 通常每個套接字地址(協議/網絡地址/端口)只允許使用一次。”意味著(1.1.1.1, 50007)這個組合能唯一識別一個進程,這兩者的組合就是一個主鍵(Master Key)。通俗地說,在數據庫管理系統,主鍵可以唯一鎖定一條記錄。進程B(進程ID= 168323)心有不甘,發現計算機還有其它接口地址2.2.2.2,于是通過Bind (‘2.2.2.2’, 50007),這次成功了。操作系統老爺爺又顫顫巍巍掏出小本子記錄了下來:(2.2.2.2,50007)--------168323這樣當有(2.2.2.2 , 50007)組合報文到達時,操作系統可以將其轉交給進程號= 168323的進程B。問題來了,進程A與進程B是什么關系?進程A、B可以是代碼完全不同的程序,也可以是代碼相同的程序,在自己獨立的內存空間運行的不同實列(Instance)。好比你同時打開多個Word程序,這些Word程序使用相同的代碼,但是他們是多個Word實例。問題又來了,如果進程A的代碼真的是那樣編碼,如果放到其它計算機上執行,會遇到問題,因為其它計算機的IP地址可能≠1.1.1.1。為了提高代碼的健壯性、可移植性,通常會使用這樣的代碼:Bind (‘ ’, 50007)其中‘ ’表示任何IP地址。換句話說,不Care計算機的接口IP地址。這個IP地址可以是127.0.0.1,也可以是1.1.1.1, 也可以是192.168.1.1,隨便多少都行。那么這個程序可以放到任何計算機上執行。在同一臺機器上一個進程B也這樣執行:Bind (‘ ’, 50007),可以哇?不可以,因為與進程A沖突!進程B可以Bind (‘ 1.1.1.1’, 50007),可以哇?同樣不可以,依然與進程A沖突。因為1.1.1.1是所有IP地址的子集。進程B心慌了,那怎么可以呢?操作系統老爺爺不緊不慢地說,只要別再使用端口50007就可以了。進程B于是執行代碼如下:Bind (‘ ’, 50008),可以哇?恭喜你,當然可以!通常服務器代碼,都使用類似Bind (‘ ’, 50007) 方式執行,所以50007這個端口號可以唯一識別一個進程,這就是端口號可以唯一識別進程號的由來!
總結
以上是生活随笔為你收集整理的tcp c++ bind 端口_计算机端口到底是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 辽宁舰仅六年就大修?
- 下一篇: triplet loss后面不收敛_Po