1. 程式人生 > >socket是什麽?協議棧操作的抽象

socket是什麽?協議棧操作的抽象

不同 而已 運行機制 c語言 和源 其他 返回 這就是 nec

http://www.cnblogs.com/airtcp/p/5230161.html

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協議棧操作的抽象,而不是簡單的映射關系,這很重要!

socket是什麽?協議棧操作的抽象