關於Socket的一些概念

2021-04-13 00:48:41 字數 3224 閱讀 1979

對於

tcp/ip

,我們還知道

tcp和

udp,前者可以保證資料的正確和可靠性,後者則允許資料丟失。最後,我們還知道,在建立連線前,必須知道對方的

ip位址和埠號。除此,普通的程式設計師就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程式的時候,會使用多執行緒來處理併發訪問。

我們還知道如下幾個事實:

1。乙個指定的埠號不能被多個程式共用。比如,如果

iis占用了

80埠,那麼

apache

就不能也用

80埠了。 2

。很多防火牆只允許特定目標埠的資料報通過。 3

。服務程式在

listen

某個埠並

accept

某個連線請求後,會生成乙個新的

socket

來對該請求進行處理。

於是,乙個困惑了我很久的問題就產生了。如果乙個

socket

建立後並與

80埠繫結後,是否就意味著該

socket

占用了80

埠呢?如果是這樣的,那麼當其

accept

乙個請求後,生成的新的

socket

到底使用的是什麼埠呢(我一直以為系統會預設給其分配乙個空閒的埠號)?如果是乙個空閒的埠,那一定不是

80埠了,於是以後的

tcp資料報的目標埠就不是80了

--防火牆一定會組織其通過的!實際上,我們可以看到,防火牆並沒有阻止這樣的連線,而且這是最常見的連線請求和處理方式。我的不解就是,為什麼防火牆沒有阻止這樣的連線?它是如何判定那條連線是因為

connet80

埠而生成的?是不是

tcp資料報裡有什麼特別的標誌?或者防火牆記住了什麼東西?

後來,我又仔細研讀了

tcp/ip

的協議棧的原理,對很多概念有了更深刻的認識。比如,在

tcp和

udp同屬於傳輸層,共同架設在

ip層(網路層)之上。而

ip層主要負責的是在節點之間(

end to end

)的資料報傳送,這裡的節點是一台網路裝置,比如計算機。因為

ip層只負責把資料送到節點,而不能區分上面的不同應用,所以

tcp和

udp協議在其基礎上加入了埠的資訊,埠於是標識的是乙個節點上的乙個應用。除了增加埠資訊,

upd協議基本就沒有對

ip層的資料進行任何的處理了。而

tcp協議還加入了更加複雜的傳輸控制,比如滑動的資料傳送視窗(

slice window

),以及接收確認和重發機制,以達到資料的可靠傳送。不管應用層看到的是怎樣乙個穩定的

tcp資料流,下面傳送的都是乙個個的

ip資料報,需要由

tcp協議來進行資料重組。

所以,我有理由懷疑,防火牆並沒有足夠的資訊判斷

tcp資料報的更多資訊,除了

ip位址和埠號。而且,我們也看到,所謂的埠,是為了區分不同的應用的,以在不同的

ip包來到的時候能夠正確**。

tcp/ip

只是乙個協議棧,就像作業系統的執行機制一樣,必須要具體實現,同時還要提供對外的操作介面。就像作業系統會提供標準的程式設計介面,比如

win32

程式設計介面一樣,

tcp/ip

也必須對外提供程式設計介面,這就是

socket

程式設計介面

--原來是這麼回事啊! 在

socket

程式設計介面裡,設計者提出了乙個很重要的概念,那就是

socket

。這個socket

跟檔案控制代碼很相似,實際上在

bsd系統裡就是跟檔案控制代碼一樣存放在一樣的程序控制代碼表裡。這個

socket

其實是乙個序號,表示其在控制代碼表中的位置。這一點,我們已經見過很多了,比如檔案控制代碼,視窗控制代碼等等。這些控制代碼,其實是代表了系統中的某些特定的物件,用於在各種函式中作為引數傳入,以對特定的物件進行操作

--這其實是

c語言的問題,在

c++語言裡,這個控制代碼其實就是

this

指標,實際就是物件指標啦。

現在我們知道,

socket

跟tcp/ip

並沒有必然的聯絡。

socket

程式設計介面在設計的時候,就希望也能適應其他的網路協議。所以,

socket

的出現只是可以更方便的使用

tcp/ip

協議棧而已,其對

tcp/ip

進行了抽象,形成了幾個最基本的函式介面。比如

create

,listen

,accept

,connect

,read

和write

等等。

現在我們明白,如果乙個程式建立了乙個

socket

,並讓其監聽

80埠,其實是向

tcp/ip

協議棧宣告了其對

80埠的占有。以後,所有目標是

80埠的

tcp資料報都會**給該程式(這裡的程式,因為使用的是

socket

程式設計介面,所以首先由

socket

層來處理)。所謂

accept

函式,其實抽象的是

tcp的連線建立過程。

accept

函式返回的新

socket

其實指代的是本次建立的連線,而乙個連線是包括兩部分資訊的,乙個是源

ip和源埠,另乙個是宿

ip和宿埠。所以,

accept

可以產生多個不同的

socket

,而這些

socket

裡包含的宿

ip和宿埠是不變的,變化的只是源

ip和源埠。這樣的話,這些

socket

宿埠就可以都是

80,而

socket

層還是能根據源

/宿對來準確地分辨出

ip包和

socket

的歸屬關係,從而完成對

tcp/ip

協議的操作封裝!而同時,放火牆的對

ip包的處理規則也是清晰明了,不存在前面設想的種種複雜的情形。 明白

socket

只是對tcp/ip

協議棧操作的抽象,而不是簡單的對映關係,這很重要!

關於KVM一些概念

kvm kernel virtual machine核心虛擬機器 是乙個linux核心模組,可以用modprobe去載入kvm模組。載入模組後,才能進一步通過其他工具建立虛擬機器。但僅有kvm模組是不行的,因為使用者無法直接控制核心模組去作事情,所以還要有乙個使用者空間的工具才行。這個使用者空間的工...

關於uboot一些概念

u boot的環境變數值得注意的有兩個 bootcmd和bootargs。bootcm bootargs bootargs是環境變數中的重中之重,甚至可以說整個環境變數都是圍繞著bootargs來設定的。bootargs的種類非常非常的多,我們平常只是使用了幾種而已.bootargs非常的靈活,核心...

關於QT的一些概念

之前學過qt,只是簡單的學學,開始時在windows下練習的,最後是在天嵌s3c2440裡跑的,不過天嵌給的軟體是qtopia 當時沒理這有什麼區別,反正在師兄的幫助下,成功的將qt4.7安裝到ubantu上並且成功執行到arm板上了,現在重新看看qt,發現有必要了解一下這些概念,到時再發一些關於q...