socket編程之基礎學習

在面試中如果你說你會網絡編程,那麼面試官肯定會問你socket編程相關的問題。比如讓你寫一個基於TCP或UDP的socket編程的C/S模型,讓你解釋socket存在於哪裏,更深入一點的還會問你accept()函數返回發生在什麼時候(TCP三次握手建立連接之後)等等。有的也會直接在筆試中出現,總之理解掌握socket編程的流程和內部的基本原理無論對於我們實際的項目開發和麪試都是很有必要的。在linux下和windows下的socket編程,其接口基本上是相同的。所以學會了其中的一種,那麼在另一平臺上的socket編程也就大同小異了。關於socket的講解在網上可以找到許多精彩的博文,它們講的通俗易懂又不失深度,我就不再贅述。

下面給出我認爲講的還可以的2篇博文的鏈接地址:

揭開Socket編程的面紗   http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx

Linux Socket編程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html

我認爲如果你不能說明白socket存在於哪裏,那麼你也就不可能對socket有和網絡的基本知識有一個很深刻的理解。在學習中我們要有這種追根溯源的精神,不僅要知道怎麼用,還要知道爲什麼這樣用,要明白底層的原理。如果我們在平時學一項技術時能做到這些,那麼在我們面試求職時面對面試官的一些問題也會顯得遊刃有餘了。好了,又廢話了!!

那麼socket究竟存在於哪裏了,請允許我使用上面給出的博文中的一些圖示


上圖清楚的顯示了TCP/IP協議族包含的4層結構(應用層,運輸船,網絡層,鏈路層)和socket在TCP/IP協議族4層結構模型中存在的位置。實際上socket就是系統提供給我們的一系列API接口。通過這些接口,我們可以調用系統核心提供給我們的網絡服務。我們不用去操心網絡底層的複雜結構,一系列相關的socket接口封裝了系統中網絡部分的複雜細節,是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。這樣我們程序員在編程時就不用去操心網絡結構下3層的具體細節和實現了,我們可以把精力更多的放到我們應用層進程的設計中,當網絡的下3層的具體細節發生變化時,只要系統提供給我們的socket接口沒有變化,我們就不需要修改先前的程序使其可以在新的網絡上正常的運行。

由此我們還可以思考一下爲什麼會有網絡體系結構的這4層結構模型呢?

首先,第一個問題,運輸層的作用是什麼?我們爲什麼要設置運輸層?

要想搞清楚這個問題,我們還需要搞清楚設置網絡層的意義

我們都知道網絡層在網絡中主要是提供物理上的連接,其核心的部件就是路由器。我們之所以能通過IP地址就可以與另一臺連接在網絡上的主機通信就是通過路由器幫助我們尋址的。我們還需注意到的一點是在網絡中對應的網絡層的數據報文其首部的源主機IP地址和目的主機IP地址是不變的,而我們的數據在網絡層是要通過不止一個路由器的。這便是ARP地址解析協議發揮作用的時刻了,在網絡層的數交付給鏈路層時,ARP地址解析協議會解析出路由器下一跳目的路由器的物理地址,正是通過這樣的過程我們才找到目的主機的。實際上IP地址只是一個邏輯上的地址,我們要把數據發送到目的主機還是依賴於唯一的物理地址。IP地址是我們爲了省去直接使用物理地址所帶來的麻煩,那麼我們使用域名則是爲了省去使用IP地址所帶來的麻煩。

我們之所以要設置一個網絡層也是出於網絡管理的方便,應爲在網絡的底層架構上不僅是有線網絡,還有無線網絡,基於衛星傳遞信息的網絡等等結構相異且異常複雜的網絡結構。而有了網絡層以後我們就不必關心網絡的異構問題,把數據在異構網絡上的傳遞交付給路由器來管理。

但是我們需要注意的是網絡曾提供的數據交付是不可靠的,它只是盡最大努力交付,並把數據報文是分組發送的,上層交付下來的數據報文可能要分成多個分組,通過不同的路由器路徑發送到目的主機,然後目的主機再把數據分組合併成完整的數據報提交給網絡的上一層進行處理。網絡層並不保證數據完整正確,因爲在數據的傳輸過程中可能出現這樣那樣的問題,數據分組也可能丟失。

既然網絡層不能提供數據的可靠交付,我們就需要一個保證數據可靠交付的新的網絡體系層次。這便是運輸層,它便是提供數據的可靠交付而設置。具體的實現上TCP(Transmission Control Protocol)即傳輸控制協議)協議通過超時重傳機制和滑動窗口來保證數據的可靠交付。而UDPUser Data Protocol,用戶數據報協議)協議

說實話不能提供可靠地交付,我們在使用基於UDP協議的套接字編程時需要在應用層上保證數據的可靠交付。

TCP的可靠交付是建立在3次握手建立連接的基礎上的,這個過程類似與我們打電話的過程。正是由於需要建立連接,所以TCP協議的開銷比UDP協議的大,但它能夠提供可靠地數據連接,因此適用於應用層協議FTP協議和HTTP協議的實現。而UDP協議不需要建立連接的過程,類似於我們發短信的過程,因此其方便靈活,開銷小,適用於IP電話,電話電視會議的應用。

關於TCP三次握手的過程也是面試中常常被問到的問題,下面的這篇博文感覺講TCP三次握手建立連接和四次握手釋放連接的過程還可以,對於爲什麼會有3次握手而不是2次握手建立連接也有詳細的論述。

推薦如下: TCP三次握手詳解及釋放連接過程     http://blog.csdn.net/oney139/article/details/8103223

扯了半天,貌似和socket編程沒有半毛錢的關係,但上面扯的那些原理性的東西纔是真真正正的精華所在。本人最笨,扯的不是很清楚,也不是很詳細,如果想要清楚深入的瞭解計算機網絡的知識還是好好的找本計算機網絡基礎的書好好的看看。其實有些大公司招聘應屆生看的不是你的項目,當然如果項目夠出彩,夠有技術含量,用人單位還是很重視的。如果你沒有好的項目經驗,那還是好好的掌握基礎知識吧!

爲了方便閱讀,下面給出    Linux Socket編程(不限Linux)http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html  這篇博文中的精彩部分:


限於自己知識水平有限,對知識的理解程度有限,文章寫的不甚詳細。寫博客不僅是對自己知識的梳理和總結,也是想要爲開放的網絡平臺奉獻更多有價值的東西,希望我的整理對你是有幫助的。讓我們共同努力提高自己。

在路上,我會一直努力的,努力的提高自己,寫出真正有價值有技術含量的文章。



發佈了41 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章