1. 程式人生 > >圖解TCP/IP

圖解TCP/IP

面向 ip協議 通過 con 編程 套接字 傳輸數據 -1 客戶端和服務器

協議

協議就是計算機與計算機之間通過網絡實現通信事先達成的一種“約定”。這種“約定”使那些由不同廠商的設備、不同的CPU以及不同的操作系統組成的計算機之間,只要遵循相同的協議就能夠實現通信。反之,如果使用的協議不同,就無法通信。

技術分享

  分組交換是將大數據分割為一個個叫做包(Packet)的較小單位進行傳輸的方法。這裏所說的包,就如同我們平常在郵局裏見到的郵包。分組交換就是將大數據分裝為一個個這樣的郵包交給對方。

技術分享

  2.3 協議分層與OSI參考模型

  協議分層就如同計算機軟件中的模塊化開發,OSI參考模型的建議是比較理想化的。

技術分享

  OSI參考模型中每個層的作用:

技術分享

  7層通信實例:假設主機A的用戶A要給主機B的用戶B發送一封電子郵件:

技術分享

  發送方從第7層、第6層到第1層由上至下按照順序傳輸數據,而接收端則從第1層、第2層到第7層由下至上向每個上一級分層傳輸數據。每個分層上,在處理由上一層傳過來的數據時可以附上當前分層的協議所必須的“首部”信息。然後接收端對收到的數據進行數據“首部”與“內容”的分離,再轉發給上一分層,並最終將發送端的數據恢復為原裝。

三、TCP/IP基礎知識

 3.1 TCP/IP標準化

  (1)具體含義

  很多人都會認為TCP/IP是指TCP與IP兩種協議,實際生活中有時也確實就是指這兩種協議。然後,很多情況下,它只是利用IP進行通信時所必須使用到的協議群的統稱。

技術分享

  (2)標準化

  由於TCP/IP盡早地制定了可行性較強的協議,提出了應對技術快速革新的協議,並及時進行後期改良的方案,因此打敗了OSI模型,成為了事實上的標準。

  3.2 TCP/IP協議分層模型

技術分享

  上圖列出了TCP/IP與OSI分層之間的大概關系,不難看出,TCP/IP與OSI在分層模塊上稍有區別。OSI參考模型註重“通信協議必要的功能是什麽”,而TCP/IP則更強調“在計算機上實現協議應該開發哪種程序”。

  現在再來看看主機A向主機B發送一封電子郵件,在TCP/IP模型下的處理過程:

技術分享

  分組數據包經過以太網的數據鏈路時的大致流程如下圖所示:

技術分享

socket套接字 API 講解:

基於 TCP 的套接字編程的所有客戶端和服務器端都是從調用socket 開始,它返回一個套接字描述符。客戶端隨後調用connect 函數,服務器端則調用 bind、listen 和accept 函數。套接字通常使用標準的close 函數關閉,但是也可以使用 shutdown 函數關閉套接字。下面針對套接字編程實現過程中所調用的函數進程分析。以下是基於 TCP 套接字編程的流程圖:

技術分享

三次握手

技術分享

socket 函數

套接字是通信端點的抽象,實現端對端之間的通信。與應用程序要使用文件描述符訪問文件一樣,訪問套接字需要套接字描述符。任何套接字編程都必須調用socket 函數獲得套接字描述符,這樣才能對套接字進行操作。

connect 函數

在處理面向連接的網絡服務時,例如 TCP ,交換數據之前必須在請求的進程套接字和提供服務的進程套接字之間建立連接。TCP 客戶端可以調用函數connect 來建立與 TCP 服務器端的一個連接。

TCP 客戶端在調用函數 connect 前不必非得調用 bind 函數,因為內核會確定源 IP 地址,並選擇一個臨時端口作為源端口號。若 TCP 套接字調用connect 函數將建立 TCP 連接(執行三次握手),而且僅在連接建立成功或出錯時才返回

bind 函數

調用函數 socket 創建套接字描述符時,該套接字描述符是存儲在它的協議族空間中,沒有具體的地址,要使它與一個地址相關聯,可以調用函數bind 使其與地址綁定。客戶端的套接字關聯的地址一般可由系統默認分配,因此不需要指定具體的地址。若要為服務器端套接字綁定地址,可以通過調用函數 bind 將套接字綁定到一個地址。

對於 TCP 協議,調用 bind 函數可以指定一個端口號,或指定一個 IP 地址,也可以兩者都指定,還可以都不指定。若 TCP 客戶端或服務器端不調用bind 函數綁定一個端口號,當調用connect 或 listen 函數時,內核會為相應的套接字選擇一個臨時端口號。一般 TCP 客戶端使用內核為其選擇一個臨時的端口號,而服務器端通過調用bind 函數將端口號與相應的套接字綁定。

listen 函數

在編寫服務器程序時需要使用監聽函數 listen 。服務器進程不知道要與誰連接,因此,它不會主動地要求與某個進程連接,只是一直監聽是否有其他客戶進程與之連接,然後響應該連接請求,並對它做出處理,一個服務進程可以同時處理多個客戶進程的連接。

accept 函數

accept 函數由 TCP 服務器調用,用於從已完成連接隊列隊頭返回下一個已完成連接。如果已完成連接隊列為空,那麽進程被投入睡眠。該函數的返回值是一個新的套接字描述符,返回值是表示已連接的套接字描述符,而第一個參數是服務器監聽套接字描述符。

close 和 shutdown 函數

當要關閉套接字時,可使用 close 和 shutdown 函數

參考:

http://www.cnblogs.com/edisonchou/p/5987827.html 《圖解TCP/IP》讀書筆記

http://network.51cto.com/art/201412/459619_all.htm 基於TCP套接字

圖解TCP/IP