一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式linux系統(tǒng)中常見(jiàn)的端口分享

嵌入式開(kāi)發(fā)星球 ? 來(lái)源:嵌入式開(kāi)發(fā)愛(ài)好者 ? 作者:嵌入式開(kāi)發(fā)愛(ài)好者 ? 2024-05-11 08:49 ? 次閱讀

每當(dāng)看到有人的簡(jiǎn)歷上寫(xiě)著熟悉 tcp/ip, http 等協(xié)議時(shí), 我就忍不住問(wèn)問(wèn)他們: 你給我說(shuō)說(shuō), 端口是啥吧! 可惜, 很少有人能說(shuō)得讓人滿意... 所以這次就來(lái)談?wù)劧丝?port), 這個(gè)熟悉的陌生人.

在此過(guò)程中, 還會(huì)談?wù)勯g接層, naming service 等概念, IoC, 依賴(lài)倒置等原則以及 TCP 協(xié)議的一些重點(diǎn)知識(shí).

常見(jiàn)端口

在我們的日常開(kāi)發(fā)過(guò)程中, 特別是后端的開(kāi)發(fā)人員, 即便他沒(méi)有真正理解端口的細(xì)節(jié), 他還是會(huì)聽(tīng)過(guò)見(jiàn)過(guò)各類(lèi)的端口, 這個(gè)東西幾乎無(wú)處不在,

wKgZomY_E0iAFHsFAADdje1vCg8306.png

比如:

mysql 缺省用的 3306 端口,

redis 的 6379 端口,

tomcat默認(rèn)用的 8080 端口,

ssh 用的 22 端口,

等等...

當(dāng)然我們最關(guān)注的還是 web 相關(guān)的端口, 涉及的主要為 80 和 443 兩個(gè)端口, 下面就來(lái)重點(diǎn)說(shuō)說(shuō).

端口是必須的嗎?

在本地 web 開(kāi)發(fā)調(diào)試過(guò)程中, 我們可能都碰到過(guò)端口, 比如或許是/最著名的 8080 端口, 一般我們會(huì)這樣去訪問(wèn)本地的 web 程序:

localhost:8080

但一旦 web 程序部署到了正式的網(wǎng)站中, 端口似乎就消失了, 正式的網(wǎng)址中就不需要端口了嗎? 答案是否定的, 在這里起作用的是缺省值.

比如你訪問(wèn)我的網(wǎng)站: https://xiaogd.net, 這個(gè) url 中似乎沒(méi)有端口, 但其實(shí)是有的, 它有一個(gè)默認(rèn)值 443, 所以完整的形式實(shí)際是這樣的:

https://xiaogd.net:443.

你可以通過(guò) Chrome 的開(kāi)發(fā)人員調(diào)試工具看到這一點(diǎn):

wKgaomY_E0mAC-kMAACwyQyYVHI025.png

可以看到, ip 地址后面跟著一個(gè) 443

如果你輸入一個(gè)錯(cuò)誤的端口, 比如 80, 像這樣: https://xiaogd.net:80, 結(jié)果就是無(wú)法訪問(wèn).

但是如果你改成 http://xiaogd.net:80, 它又可以訪問(wèn)了.

注意, 因?yàn)槲曳?wù)器后臺(tái)配置了 http 自動(dòng)跳轉(zhuǎn) https 的 301 重定向, 所以最終瀏覽器會(huì)再次跳轉(zhuǎn)到 https://xiaogd.net:443.

注意勾選 'Preserve log' 以保留日志, 可以看到第一個(gè) 80 端口的請(qǐng)求會(huì)被響應(yīng)一個(gè) 301 跳轉(zhuǎn), 并指示跳轉(zhuǎn)目標(biāo), 也即是 Location 字段中的 https 請(qǐng)求, 瀏覽器接收此跳轉(zhuǎn)指示并重新發(fā)起 https 請(qǐng)求, 也即是圖中第二個(gè) xiaogd.net 的請(qǐng)求. 所以地址欄最終還是會(huì)變成 https 的, 特此說(shuō)明.

此時(shí)如果你輸入 http://xiaogd.net:443, 它又不能訪問(wèn)了...

那么原因是什么呢? 你找到規(guī)律了沒(méi)有?

注意一個(gè)是 http, 一個(gè)是 https.

協(xié)議的缺省端口

當(dāng)你沒(méi)有顯式的在 url 中輸入端口時(shí), 瀏覽器實(shí)際上會(huì)根據(jù)所用的協(xié)議來(lái)為你指定一個(gè)缺省端口:

如果是 http 協(xié)議, 就使用 80 端口

如果是 https 協(xié)議, 就使用 443 端口

如果你自己輸入端口呢? 那就用你輸入的端口, 你輸入啥就是啥, 輸錯(cuò)了, 訪問(wèn)不了那就是你的責(zé)任了, 誰(shuí)讓你瞎搞來(lái)著?

本來(lái)不用你勞神的, 你偏要脫褲子放屁, 搞不好自然就是畫(huà)蛇添足, 弄巧成拙了.

比如上面的用了 http 卻輸入了 443, 或者用了 https 卻輸入了 80, 就無(wú)法成功訪問(wèn)了.

另外, 如果你胡亂地輸入一個(gè)比如 9527, http://xiaogd.net:9527, 自然也是無(wú)法訪問(wèn)的, 原因也很簡(jiǎn)單, 因?yàn)槲业姆?wù)器上根本沒(méi)有在 9527 端口上進(jìn)行監(jiān)聽(tīng).

即便我有在 9527 端口上監(jiān)聽(tīng), 提供的也未必是 web 服務(wù), 使用的協(xié)議可能既不是 http, 也不是 https, 所以你用瀏覽器試圖去訪問(wèn)也可能會(huì)碰壁的.

當(dāng)然了, 我是完全可以在服務(wù)器上的 9527 端口上再部署一個(gè) web 服務(wù)的, 比如放一個(gè) apache 或 tomcat server 之類(lèi)的 web server 監(jiān)聽(tīng)在那個(gè)端口上, 再放通防火墻, 安全組之類(lèi)的, 也是可以訪問(wèn)的. 只是我沒(méi)有這么去做而已.

那么為啥大家都不在那些奇奇怪怪的端口上提供 web 服務(wù)呢? 原因其實(shí)也很簡(jiǎn)單, 為了方便用戶(hù), 同時(shí)也減輕了用戶(hù)的認(rèn)知負(fù)擔(dān).

其實(shí)關(guān)于用戶(hù), 你只要記住兩點(diǎn)就好了:

用戶(hù)是傻瓜

用戶(hù)是懶漢

深刻地理解了這一點(diǎn), 你才可能成為一個(gè)好的程序員(包括但不限于產(chǎn)品經(jīng)理, 設(shè)計(jì)師...)

其實(shí)呀, 何止了省略了端口呀, 你看看現(xiàn)在的地址欄, 不但 http, https 這些協(xié)議省了, 最末尾的斜杠 / 省了, 甚至連 www 都省了...

是的, 我也幫你們省了 www, 事實(shí)上你通過(guò) https://www.xiaogd.net/ 也能訪問(wèn)到, 但如果通過(guò) https://xiaogd.net/ 就能訪問(wèn)到, 又何苦去再去錄入三個(gè)達(dá)不溜呢?

必須得承認(rèn), 缺省的存在是有很大的幫助的, 這其實(shí)是進(jìn)步; 但另一方面, 這些缺省有時(shí)也會(huì)給不明就里的開(kāi)發(fā)人員帶來(lái)了一些困惑, 好像端口不是必要的, 但其實(shí)不是這樣的.

為什么需要端口?

那為什么一定要端口這個(gè)東西呢? 它到底起了什么作用, 想必很多同學(xué)想要了解, 下面就來(lái)說(shuō)說(shuō)為什么, 而一個(gè)首先需要了解的概念就是進(jìn)程間通訊(所謂的 IPC(inter-process communication)

進(jìn)程間通訊(IPC)

你在瀏覽器地址欄輸入某個(gè)網(wǎng)站的域名, 然后回車(chē), 就生成了一次請(qǐng)求, 然后服務(wù)器響應(yīng)你的請(qǐng)求, 瀏覽器再把結(jié)果渲染出來(lái), 你就能最終看到到一個(gè)網(wǎng)頁(yè).

如果你曾經(jīng) ping 過(guò)一個(gè)域名, 比如你現(xiàn)在 ping 我的域名 xiaogd.net, 你就能得到一個(gè) ip 地址, 118.89.55.54:

wKgZomY_E0mAbjkiAAAMsyfvQXg720.png

有了 ip, 瀏覽器自然就能找到我的主機(jī), 但還是有個(gè)問(wèn)題, 我的主機(jī)上運(yùn)行著好多的進(jìn)程, 好多的服務(wù), 除了最常見(jiàn)的 web 服務(wù), 我可能還有 ftp 服務(wù), mysql 服務(wù)等等不一而足.

簡(jiǎn)單地講, 如果一個(gè)請(qǐng)求只有 ip 地址這一信息, 操作系統(tǒng)將不知道把這個(gè)請(qǐng)求交給哪個(gè)進(jìn)程去處理, 如果是你來(lái)設(shè)計(jì)整個(gè)系統(tǒng), 你想象一下, 是不是這樣?

如果你僅僅是輸入域名, 經(jīng)過(guò) DNS 解析后, 只能得到一個(gè) IP 地址.

所謂的一次請(qǐng)求, 從一個(gè)比較底層的角度去看, 就是一次進(jìn)程間的通訊.

wKgaomY_E0mAVTxaAAGuyo4tj9k838.png

它可以是navicat客戶(hù)端與 mysql 數(shù)據(jù)庫(kù)服務(wù)的一次通訊, 也可以是 winScp 客戶(hù)端與 vsftpd FTP 服務(wù)的一次通訊等等.

以上面的具體為例, 可以說(shuō)就是 Chrome 瀏覽器這個(gè)本地操作系統(tǒng)上的進(jìn)程與我的服務(wù)器上的一個(gè)叫做 Nginx 的進(jìn)程間的一次通訊.

那么, 所謂的端口, 其實(shí)可以簡(jiǎn)單地視作為進(jìn)程 ID.

當(dāng)然, 它與進(jìn)程 ID 還是有不同的, 下面再分析, 或者目前你可以認(rèn)為端口就是進(jìn)程 ID 的影子.

也即是說(shuō), 如果僅有域名(ip), 是無(wú)法定位到一個(gè)進(jìn)程的, 通訊的發(fā)起方不但需要給出 ip, 還需要給出端口, 只有這樣, 服務(wù)器才能知道由哪個(gè)進(jìn)程去響應(yīng).

端口, 一個(gè)間接層

那么問(wèn)題又來(lái)了, 為什么引入端口, 而不是直接使用進(jìn)程 ID 呢? 這個(gè)原因想想也不難明白, 大概有這么幾點(diǎn)原因:

作為客戶(hù)端無(wú)法知道服務(wù)端對(duì)應(yīng)進(jìn)程的 ID

服務(wù)端對(duì)應(yīng)進(jìn)程重啟后 ID 會(huì)改變

一個(gè)網(wǎng)站的 web 進(jìn)程 ID 是這個(gè), 另一個(gè)網(wǎng)站的可能又是另一個(gè)

自然, 原因是很多的, 我也是隨便的列舉了一些, 你或許還能想到更多. 而為了解決這些個(gè)問(wèn)題, 就引入了端口這一間接層(indirection).

計(jì)算機(jī)世界里有一句名言: 任何計(jì)算機(jī)問(wèn)題均可通過(guò)增加一個(gè)間接(indirection)層來(lái)解決.(Any problem in computer science can be solved with another layer of indirection. -- David Wheeler)

這個(gè)名言其實(shí)還有后面一句: But what usually will create another problem.(但通常會(huì)帶來(lái)另一個(gè)問(wèn)題)

這里所謂另一個(gè)問(wèn)題, 比如它會(huì)使得層次結(jié)構(gòu)復(fù)雜化, 交互效率下降等等. 當(dāng)然了, 這就是架構(gòu)師們要去權(quán)衡的問(wèn)題了, 很多時(shí)候, 架構(gòu)就是關(guān)于平衡的藝術(shù). 打死都不肯引入任何的間接層, 這是一個(gè)極端; 而一上來(lái)就引入好多個(gè)間接層, 這又是另一個(gè)極端.

如果沒(méi)有這個(gè)間接層, 客戶(hù)端要與服務(wù)端通訊, 就要知道服務(wù)端對(duì)應(yīng)進(jìn)程的 ID, 也即是客戶(hù)端是依賴(lài)于服務(wù)端的:

顯然, 這種模式對(duì)于 web 這種一個(gè)服務(wù)端對(duì)應(yīng)大量客戶(hù)端訪問(wèn)的情形是極不適應(yīng)的, 你都不知道有誰(shuí)可能會(huì)來(lái)訪問(wèn)你的網(wǎng)站! 你根本無(wú)法告訴它們.

而有了端口這一間接層, 對(duì)于 web 的情形, 這種依賴(lài)被倒置了, 客戶(hù)端總是把請(qǐng)求發(fā)送到 80(或443) 端口, 這些成為標(biāo)準(zhǔn)的一部分, 并要求服務(wù)端反過(guò)來(lái)去適應(yīng), 服務(wù)端去監(jiān)聽(tīng)端口的通訊并處理, 變成了一種反向依賴(lài).

wKgaomY_E0qARw7mAAECvC5Q-FY782.png

如果一個(gè)進(jìn)程想要提供 web 服務(wù), 它啟動(dòng)之后就要去綁定(binding) web 相關(guān)的端口,

如果端口已經(jīng)被其它進(jìn)程綁定了(即所謂占用了), 就會(huì)綁定失敗; 又或者被自身前一個(gè)未完全退出的進(jìn)程占據(jù)著, 也會(huì)綁定失敗, 在開(kāi)發(fā)過(guò)程中你可能會(huì)遇到類(lèi)似的問(wèn)題, 一個(gè) web 進(jìn)程沒(méi)有關(guān)閉, 你又試圖啟動(dòng)另一個(gè), 而兩者都用了相同的端口, 就會(huì)產(chǎn)生沖突.

并在其上持續(xù)的監(jiān)聽(tīng)(listen), 同時(shí)在有請(qǐng)求到來(lái)的時(shí)候去響應(yīng)(response). 這樣一來(lái), 進(jìn)程 ID 的問(wèn)題就消解了:

這類(lèi)似于一個(gè)接口回調(diào), 瀏覽器只需要面向接口索取服務(wù), 而無(wú)需知道接口服務(wù)的具體提供者, 這些細(xì)節(jié)被端口層所封裝并隱藏起來(lái)了.

端口這一間接層的存在解耦(decouple)了客戶(hù)端與服務(wù)端之間的強(qiáng)依賴(lài), 整個(gè)體系變得很靈活.

可以把端口視作一般編程概念中的接口(interface), 而想 Nginx, apache, tomcat 等等可以認(rèn)為是這個(gè)接口的不同實(shí)現(xiàn)(Implementation).

端口與現(xiàn)實(shí)世界的一個(gè)類(lèi)比

為加深理解, 可以舉一個(gè)現(xiàn)實(shí)世界中的例子. 相信大家都有過(guò)去市民中心辦事的經(jīng)歷, 比如去辦理居住證, 護(hù)照, 社保等等業(yè)務(wù), 你通常會(huì)收到一個(gè)小紙條讓你去某個(gè)窗口辦理對(duì)應(yīng)業(yè)務(wù), 這個(gè)窗口其實(shí)就類(lèi)似于端口了:

比如 80 窗口就對(duì)應(yīng)港澳臺(tái)通行證業(yè)務(wù)

那么你要辦港澳臺(tái)通行證, 你就奔向 80 號(hào)窗口就完了. 你不要去問(wèn)門(mén)口保衛(wèi)處的王大爺, 到底是哪位同志辦理這個(gè)業(yè)務(wù).

今天可能是小明在辦理, 隔了幾天, 小明可能受傷了, 流血了, 又輪到小紅在那里辦理, 又過(guò)段時(shí)間, 小紅也出意外了, 流產(chǎn)了, 又輪到小張?jiān)谵k理, 又過(guò)段時(shí)間, 小張被發(fā)現(xiàn)在辦理業(yè)務(wù)過(guò)程中徇私舞弊, 流放了...

等等, 如果此時(shí)你的同事問(wèn)你怎么辦港澳臺(tái)通行證, 你需要知道這些個(gè)人事變動(dòng)的細(xì)節(jié)嗎? 根本不需要呀, 你只需告訴他去 80 號(hào)窗口辦理就好了...

市民中心的整個(gè)體系, 會(huì)確保有個(gè)會(huì)辦理這些業(yè)務(wù)的人員坐在那個(gè)窗口下面, 你唯一需要做的, 就是到那個(gè)窗口下請(qǐng)求服務(wù)即可.

端口與名稱(chēng)服務(wù)(naming service)

通過(guò)上面現(xiàn)實(shí)世界類(lèi)比的例子, 對(duì)于端口的機(jī)制, 相信你已經(jīng)理解得比較深入了. 廣義上講, 端口層也可以視作一個(gè) naming service(名稱(chēng)服務(wù)), 這與比如 spring cloud 中的 eureka 里的機(jī)制本質(zhì)上是一樣的, 只是這個(gè) name 就是一個(gè)抽象的數(shù)字, 比如 80. 80 就代表了一個(gè) web 服務(wù), Nginx 之類(lèi)的 web server 綁定并監(jiān)聽(tīng)就相當(dāng)于把自身提供的 web 服務(wù)注冊(cè)于其上.

DNS 域名系統(tǒng)其實(shí)也是 naming service, 你通過(guò) xiaogd.net 這個(gè)名字(name), 就能獲取到我所提供給你的網(wǎng)頁(yè)服務(wù).

類(lèi)似的還有 java 里的 JNDI 等, 把一個(gè)名字與一個(gè)服務(wù)關(guān)聯(lián)起來(lái), 比如一個(gè)名字就代表一個(gè)數(shù)據(jù)源(數(shù)據(jù)庫(kù)連接)之類(lèi)的.

端口與 IoC(控制反轉(zhuǎn))

廣義上, 端口的上述機(jī)制也是控制反轉(zhuǎn)(Ioc: Inversion of Control)思想的一種體現(xiàn), 如果客戶(hù)端需要知道服務(wù)端的進(jìn)程 ID, 實(shí)際上就被服務(wù)端控制了, 畢竟我服務(wù)端在哪個(gè) ID 上提供服務(wù), 你就得把你的請(qǐng)求發(fā)到相應(yīng)的 ID 上來(lái);

而有了端口這一中間層呢? 作為客戶(hù)端, 總是把請(qǐng)求發(fā)到對(duì)應(yīng)端口上, 并要求服務(wù)端綁定并監(jiān)聽(tīng)那些端口以及作出響應(yīng), 你服務(wù)端是反過(guò)來(lái)被我客戶(hù)端所控制, 我客戶(hù)端發(fā)到哪個(gè)端口, 你服務(wù)端就要去相應(yīng)端口上監(jiān)聽(tīng)并響應(yīng).

大家可以體會(huì)一下這種轉(zhuǎn)變. 這種設(shè)計(jì)或思想在編程領(lǐng)域其實(shí)是特別重要的, 在很多其它地方都有體現(xiàn).

因?yàn)闉g覽器總是把 web 請(qǐng)求發(fā)到了 80 或 443 端口, 這就要求一個(gè) web server 進(jìn)程去監(jiān)聽(tīng)這些端口. 比如在我的服務(wù)器上, web server 是 Nginx, 它啟動(dòng)之后就會(huì)去監(jiān)聽(tīng) 80 和 443 端口, 任何想要訪問(wèn)我的主頁(yè)的人, 并不需要知道我的 Nginx 進(jìn)程 ID 是啥, 借助于端口這一間接層, 你就能夠與我的 Nginx 進(jìn)程通訊, 并獲取你想要的東西.

事實(shí)上你可以這么認(rèn)為, 瀏覽器實(shí)際上只是在與端口通訊, 端口層再把這些請(qǐng)求委托(delegate)或代理(proxy)給相應(yīng)的 web server 去處理, 端口的角色就是一個(gè)中間人, 一個(gè)間接層.

再論缺省端口

現(xiàn)在, 我們應(yīng)該明白了, 端口是必要的了, 當(dāng)然, 對(duì)最終的用戶(hù)來(lái)說(shuō), 則不需要知道這些實(shí)現(xiàn)的細(xì)節(jié), 對(duì)于他們, 應(yīng)該遵循最小知識(shí)原則, 知道得越少越好.

如果你一定要讓用戶(hù)在輸入 url 的過(guò)程中輸入端口, 又或者要輸入個(gè) www 等等, 用戶(hù)就要給你扔過(guò)來(lái)"十萬(wàn)個(gè)為什么"了...

為什么要加個(gè) 443?

為什么不是 334, 443是啥意思?

為什么一會(huì)兒是 80, 一會(huì)兒又是 443?

為什么加個(gè) www, 啥意思?

為什么末尾還加個(gè)斜杠, 不加會(huì)死嗎?

...

惹不起, 惹不起...

還記得前面說(shuō)的, 用戶(hù)是笨蛋, 用戶(hù)是懶漢嗎?

這里又要引用一句計(jì)算機(jī)世界的名言了: 程序員和上帝打賭要開(kāi)發(fā)出更大更好連傻瓜都會(huì)用的軟件, 而上帝卻總能創(chuàng)造出更大更傻的傻瓜。目前為止,上帝贏了。

Programmers are in a race with the Universe to create bigger and better idiot-proof programs. The Universe is trying to create bigger and better idiots. So far the Universe is winning.

說(shuō)句心里話, 很多時(shí)候, 用戶(hù)能記住你的域名就阿彌陀佛了, 你就該燒高香了, 你還想用戶(hù)記住你的端口, 真的想多了...

另一方面, 說(shuō)到這里我們應(yīng)該也能明白了, 那就是理論上, web 服務(wù)實(shí)際上可以構(gòu)建在任何端口之上. 比如在本地開(kāi)發(fā)的時(shí)候, 用戶(hù)只有你自己, 那當(dāng)然你可以隨便挑一個(gè)端口, 比如 8080, 只要自己知道就好了或頂多告訴另一個(gè)與你配合的前端同事.

同理, 其它非 web 的服務(wù), 比如 ftp 服務(wù), 也不一定說(shuō)非得在 21 端口上等等; mysql 服務(wù)的端口同樣可以調(diào)整為 3306 之外的端口.

又或者說(shuō), 你想提供一個(gè)服務(wù), 但只想小范圍內(nèi)的人知道, 你可以挑一個(gè)很偏門(mén)的端口, 這樣一般人只輸一個(gè)域名就沒(méi)法訪問(wèn)到你的服務(wù)了.

比如有人想偷偷提供一些服務(wù), 放一些廣淫民群眾喜聞樂(lè)見(jiàn)的小視頻啥的...刑法警告, 后果自負(fù)!! 別說(shuō)我沒(méi)有提醒你.

端口與 TCP/UDP 協(xié)議

前面一直在說(shuō), 什么 3306 端口, 80 端口, 443 端口, 其實(shí)嚴(yán)格來(lái)說(shuō), 端口是分 TCP 端口和 UDP 端口的, 不過(guò)多數(shù)時(shí)候遇到的都是 TCP 端口, 但 TCP 80 端口和 UDP 80 端口是不同的端口.

UDP 的 80 端口, 包括 443 端口其實(shí)被保留了, 目前的 http 協(xié)議只構(gòu)建在 TCP 協(xié)議之上.

當(dāng)然, 理論上講, 在 UDP 上構(gòu)建 http 也不能說(shuō)就完全不行, 畢竟, 無(wú)論 UDP 還是 TCP 都是構(gòu)建在 IP 協(xié)議之上, 總之呢, 計(jì)算機(jī)的世界沒(méi)什么是不可能的, 而且似乎真有人在做這些嘗試, 不過(guò)這就屬于兩小母牛對(duì)屁股--比較牛逼的范疇了, 深水區(qū)了, 咱也不懂, 不多說(shuō)了.

還有一點(diǎn), 對(duì)于進(jìn)程間的端口通訊, 實(shí)際上是對(duì)稱(chēng)的, 也即是說(shuō), 服務(wù)器的響應(yīng)也是先回到一個(gè)客戶(hù)端的端口上.

如果你用 Windows 10 系統(tǒng), 可以在 任務(wù)管理器 > 性能 > 打開(kāi)資源監(jiān)視器 > 網(wǎng)絡(luò) > TCP 連接, 點(diǎn)擊下遠(yuǎn)程端口可以按照從小到大排列, 通常就可以看到 443 的相關(guān)連接了, 可以看到左邊有一欄本地端口, 一個(gè) TCP 連接總是有一個(gè)遠(yuǎn)程端口, 一個(gè)本地端口:

當(dāng)發(fā)起一個(gè) TCP 連接時(shí), 客戶(hù)端首先自己先隨機(jī)挑選一個(gè)沒(méi)有被使用的端口作為服務(wù)器響應(yīng)的接收端口, 比如 38672. 在一個(gè) TCP 的包里, 無(wú)論是握手包還是后續(xù)的數(shù)據(jù)包, 包頭部分最重要的兩個(gè)字段, 一個(gè)就是源端口(source port), 比如 38672; 另一個(gè)就是目標(biāo)端口(destination port), 比如 80, 或者 443.

可以這樣看, 服務(wù)器的響應(yīng)也是先回到源端口, 比如 38672 上, 源端口再轉(zhuǎn)給最終的進(jìn)程, 比如瀏覽器.

而對(duì)于一個(gè) IP 包, 同樣的, 包頭部分最重要的兩個(gè)字段, 一個(gè)就是源IP(source IP); 另一個(gè)就是目標(biāo) IP(destination IP).

而 TCP 包會(huì)作為 IP 包的數(shù)據(jù)包被打包到 IP 包里面, 也一個(gè) IP 包里其實(shí)包含了 IP + 端口.

IP 加端口再加上端口與進(jìn)程間的關(guān)聯(lián), 分屬兩個(gè)不同主機(jī)間的進(jìn)程就能通過(guò) TCP(UDP)/IP 協(xié)議愉快地進(jìn)行進(jìn)程間的通訊(IPC)了.

當(dāng)然了, 同一個(gè)主機(jī)間的進(jìn)程也同樣可以利用這套機(jī)制. 但同一個(gè)主機(jī)間還可以有其它選擇, 這個(gè)具體看各個(gè)操作系統(tǒng)是否提供相關(guān)機(jī)制及支持. 而 TCP/IP 屬于廣泛應(yīng)用的標(biāo)準(zhǔn)協(xié)議, 從而得到了廣泛支持.

因?yàn)槠P(guān)系, 關(guān)于這樣 TCP 協(xié)議等的細(xì)節(jié), 以及包括 Socket, 連接等概念, 以及虛擬主機(jī), 反向代理等等就不再展開(kāi)去說(shuō), 如果你感興趣, 歡迎留言, 后續(xù)會(huì)考慮再寫(xiě)一些文章去介紹.

同樣因?yàn)槠脑蛞约巴瑫r(shí)我也不是計(jì)算機(jī)網(wǎng)絡(luò)及協(xié)議方面的專(zhuān)家, 關(guān)于端口方面的, 如果有什么說(shuō)得不到位, 或不正確的地方, 歡迎留言指正, 關(guān)于端口方面的介紹就到這里.

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5125

    文章

    19438

    瀏覽量

    313051
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11420

    瀏覽量

    212315
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    1006

    瀏覽量

    32638
  • 人工智能
    +關(guān)注

    關(guān)注

    1804

    文章

    48449

    瀏覽量

    244932
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式測(cè)控系統(tǒng)中常見(jiàn)的數(shù)字濾波算法有哪些?

    嵌入式測(cè)控系統(tǒng)中常見(jiàn)的數(shù)字濾波算法有哪些?常見(jiàn)的數(shù)字濾波算法對(duì)比分析哪個(gè)好?
    發(fā)表于 04-12 06:39

    目前最常見(jiàn)的是嵌入式Linux方向

    嵌入式學(xué)習(xí)是一個(gè)循序漸進(jìn)的過(guò)程,如果是希望向嵌入式軟件方向發(fā)展的話,目前最常見(jiàn)的是嵌入式Linux方向,關(guān)注這個(gè)方向,大概分3個(gè)階段:1、
    發(fā)表于 11-08 06:29

    總結(jié)嵌入式系統(tǒng)開(kāi)發(fā)中常見(jiàn)的存儲(chǔ)器及其特點(diǎn)

    總結(jié)嵌入式系統(tǒng)開(kāi)發(fā)中常見(jiàn)的存儲(chǔ)器及其特點(diǎn)
    發(fā)表于 12-17 06:11

    嵌入式Linux系統(tǒng)開(kāi)發(fā)基礎(chǔ)

    了解嵌入式Linux系統(tǒng)Ø 從Linux內(nèi)核到文件系統(tǒng)ü嵌入式
    發(fā)表于 09-10 11:11 ?68次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>開(kāi)發(fā)基礎(chǔ)

    嵌入式Linux系統(tǒng)的移植研究

    介紹嵌入式系統(tǒng)嵌入式系統(tǒng)中的GUI , 詳細(xì)說(shuō)明三種常見(jiàn)嵌入式GUI (Microwindo
    發(fā)表于 04-24 10:43 ?23次下載

    嵌入式】構(gòu)建嵌入式Linux系統(tǒng)(uboot、內(nèi)核、文件系統(tǒng)

    嵌入式Linux系統(tǒng)知識(shí)架構(gòu)及層次嵌入式Linux系統(tǒng)構(gòu)成及啟動(dòng)略析
    發(fā)表于 10-20 18:20 ?42次下載
    【<b class='flag-5'>嵌入式</b>】構(gòu)建<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>(uboot、內(nèi)核、文件<b class='flag-5'>系統(tǒng)</b>)

    什么是嵌入式操作系統(tǒng) 常見(jiàn)嵌入式系統(tǒng)有哪些

    常見(jiàn)嵌入式系統(tǒng)Linux、uClinux、WinCE、PalmOS、Symbian、eCos、uCOS-II、VxWorks、pSOS、Nucleus、ThreadX 、Rtems
    發(fā)表于 10-21 09:36 ?27次下載
    什么是<b class='flag-5'>嵌入式</b>操作<b class='flag-5'>系統(tǒng)</b> <b class='flag-5'>常見(jiàn)</b>的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>有哪些

    嵌入式Linux開(kāi)發(fā)教程:Linux常見(jiàn)命令(上篇)

    摘要:這是對(duì)周立功編著的《嵌入式Linux開(kāi)發(fā)教程》的第7期連載。本期刊載內(nèi)容有關(guān)LinuxLinux常見(jiàn)命令中的導(dǎo)航命令、目錄命令和文件命令。下一期將連載網(wǎng)絡(luò)操作命令、安裝卸載文件系統(tǒng)
    發(fā)表于 10-21 13:36 ?11次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>開(kāi)發(fā)教程:<b class='flag-5'>Linux</b><b class='flag-5'>常見(jiàn)</b>命令(上篇)

    嵌入式Linux常用GUI系統(tǒng)

    嵌入式Linux常用GUI系統(tǒng)【整理】嵌入式Linux中常用的GUI(圖形用戶(hù)界面)
    發(fā)表于 11-01 16:31 ?4次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>常用GUI<b class='flag-5'>系統(tǒng)</b>

    嵌入式linux系統(tǒng)中常用的文件系統(tǒng)

    原文:https://blog.csdn.net/li_wen01/article/details/80090624嵌入式linux系統(tǒng)中常用的文件
    發(fā)表于 11-01 16:56 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>中常</b>用的文件<b class='flag-5'>系統(tǒng)</b>

    嵌入式linux報(bào)警,嵌入式Linux下LED報(bào)警燈驅(qū)動(dòng)設(shè)計(jì)及編程.doc

    設(shè)計(jì)及編程一.實(shí)驗(yàn)?zāi)康睦斫怛?qū)動(dòng)本質(zhì),掌握嵌入式Linux系統(tǒng)下驅(qū)動(dòng)開(kāi)發(fā)相關(guān)知識(shí),包括端口寄存器訪問(wèn)、接口函數(shù)編寫(xiě)、和文件系統(tǒng)掛接、注冊(cè)及相關(guān)
    發(fā)表于 11-01 17:21 ?6次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>linux</b>報(bào)警,<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>下LED報(bào)警燈驅(qū)動(dòng)設(shè)計(jì)及編程.doc

    嵌入式Linux(基礎(chǔ)篇)】從標(biāo)準(zhǔn)Linux嵌入式Linux + 嵌入式Linux知識(shí)架構(gòu)

    主要介紹了GNU/Linux的誕生,標(biāo)準(zhǔn)Linux是如何應(yīng)用在嵌入式系統(tǒng)中的,最后講述了嵌入式Linux
    發(fā)表于 11-02 09:51 ?34次下載
    【<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>(基礎(chǔ)篇)】從標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>到<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b> + <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>知識(shí)架構(gòu)

    嵌入式Linux專(zhuān)題(一)——嵌入式Linux系統(tǒng)構(gòu)成及啟動(dòng)流程

    本文簡(jiǎn)單的介紹了什么是嵌入式系統(tǒng),以及嵌入式Linux系統(tǒng)結(jié)構(gòu),并且簡(jiǎn)單的介紹了Linux的啟
    發(fā)表于 11-02 12:36 ?15次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>專(zhuān)題(一)——<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>構(gòu)成及啟動(dòng)流程

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)

    嵌入式網(wǎng)絡(luò)編程+嵌入式Linux系統(tǒng)一、 Linux操作系統(tǒng)安裝與使用(命令)二、
    發(fā)表于 11-02 14:51 ?23次下載
    <b class='flag-5'>嵌入式</b>網(wǎng)絡(luò)編程+<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b>

    Linux嵌入式系統(tǒng)開(kāi)發(fā),嵌入式Linux開(kāi)發(fā)教程

    嵌入式有不少組合名詞,例如嵌入式系統(tǒng),嵌入式軟件,Linux嵌入式,Android
    發(fā)表于 11-03 11:51 ?30次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>開(kāi)發(fā),<b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b>開(kāi)發(fā)教程