對TCP埠和連線數的一點思考

2021-08-31 09:39:39 字數 1114 閱讀 9878

先來看看一些約定俗成的內容。

我在面試的時候,被問到過這麼乙個問題:ipv4協議下,假如主機的資源是無限的,理論上乙個網絡卡能夠接受多少個tcp連線?這個問題一開始很容易有個*****的想法,連線數就和埠數一樣,65535。但這樣顯然是錯誤的,原因可以參考上面。

實際上這道題要文件本質是,乙個tcp連線,必定有乙個唯一區分這個鏈結的關鍵字。這顯然不是埠,而是(svr_addr, svr_port, cli_addr, cli_port, protocol)這麼乙個五元組。理論上只要這五個值不完全一樣,就不是乙個相同的連線。所以答案的數量級非常龐大。

那什麼是埠呢?我引用知乎的乙個問題: 

ip能鎖定一台物理機器,對應著一張網絡卡,外界發來的資料報網絡卡都會接收。但是問題來了,網絡卡給程式提供了介面,你監聽一下我,要是有訊息來了,我就**給你。這樣應用程式就能收到資料了。但是問題來了,程式a和程式b都需要監聽網絡卡接髮資料,網絡卡說那我把接到的資料都發給你兩,你們自己看著辦吧。好,小a小b都接受了。但是又來了cdef……,不行了,每個包都被發到了所有應用程式,每個應用程式都累得不行,最終垮了。

好,那網絡卡說我給你們加個表示吧,我們之間可以用乙個號碼來作為標識,我和小a之間就用1來標識,如果外界發給1號標識的資料我就**給你,你監聽我的時候得告訴我你監聽的時1,我就**1的資料報給你。好了其他的bcd…都自己弄乙個標識號,只要不重複就行。這樣大家都省事了。

最後涉及到安全,乙個標識號只能被乙個應用程式監聽,因為如果小a程式和小b同時監聽乙個標識號號,那就壞了,我傳的資料都被ab接到,這樣資料安全性就沒辦法保證了。

這個標識號就是埠,最初設計網路資料交換的設計者不知道是怎麼想的。這是我的理解。

其實網絡卡都是被系統層封裝了,埠和程序之間的關係也是系統封裝好的。我們只需要用socket就行,給定乙個埠號就行了。其他的事都交給作業系統去做。

也就是說,假如沒有埠這麼乙個東西,應用層的程式就只能夠直接監聽網絡卡,這樣會造成資源的浪費和很大的負荷,所以才劃分這麼多埠,並且乙個埠只能被監聽一次。

實際上,埠的資訊只有到了tcp層才會被讀取(而不是在網絡卡、或者資料鏈路層等其他地方),所以在tcp層記錄了(port, pid)這麼乙個二元組,表示某個port被pid監聽,從而讓資料段準確傳輸到正確的位置。

對idc的一點思考

先談談反面例子,我們公司的idc,主要精力花在搬機器跑機房上面了上架什麼的。還有各類瑣事,比方說裝置壞了。之前乙個比較大的問題是,機器比較分散,分散就導致我們聯絡重啟的人比較頭痛了,各個機器有不同的 流程,有些還要發郵件進行身份驗證,非常慢。各個機房的頻寬買的也不一樣,看起來也不方便。再乙個就是人員...

對易語言的一點思考。

轉眼從易公司辭職已經接近1年了。在這一年裡,我用碌碌無為來評價自己。既沒有出去找工作。也沒有做出什麼成果來。我接觸的第一門程式語言是c語言。接觸易語言的時候。我的c還停留在解決課本上的作業的水平。易語言的確很好用。可以很輕易地解決很多實際應用的問題。畢業後我選擇了到易語言公司工作。雖然家裡和女友都反...

對學術規範的一點思考

兩年前,楊振寧教授在南大頒發獎學金。當時有同學不厭其煩地提出中國人什麼時候能夠拿到諾貝爾獎的問題,記得楊老先生當時提出這樣乙個觀點,中國的學者目前都是 二 三代 以西洋科學引入中國計,例如,楊振寧之父為一代數學大家 而形成一種學術傳統,至少要三四代。到時,中國會在純邏輯上有所突破,比如數學。到現在終...