【 聲明:著作權,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
不管在Windows平台下面還是在Linux平台下面,網路編程都是少不了的。在互連網發達的今天,我們的生活基本上已經離不開網路了。我們可以用網路幹很多的事情,比如說IM聊天、FTP下載、電子銀行、網路購物、線上遊戲、電子郵件的收發等等。所以說,對於一個軟體的開發人員來說,如果說他不會進行網路程式的開發,那真是難以想象的。
在開始介紹網路編程的方法之前,我們可以回憶一下電腦網路的相關知識。目前為止,我們使用的最多網路通訊協定還是tcp/ip網路。通常來說,我們習慣上稱為tcp/ip協議棧。至於協議棧分成幾層,有兩種說法。一種是五層,一種是七層,我個人本身也比較傾向於五層的劃分方法。大家可以通過下面的圖看看協議棧是怎麼劃分的。
5、應用程式層
4、傳輸層
3、網路層
2、資料連結層
1、物理層
網路的不同層次實現網路的不同功能。物理層主要實現報文的成幀處理;資料連結層完成對報文的優先順序的管理,同時實現二層轉寄和流量控制;網路層實現路由和轉寄的功能,一方面它需要實現對報文的fragment處理,另外一方面它還需要對路由資訊進行處理和儲存;傳輸層實現報文的發送和接受,它利用計數、時序、定時器、重發等機制實現對報文的準確發送,當然這都是tcp的發送機制,而udp一般是不保證報文正確發送和接收的;應用程式層就是根據傳輸層的連接埠資訊調用不同的程式來處理傳輸的內容,連接埠8080是http報文,連接埠21是ftp報文等等。上面的邏輯稍顯複雜,朋友們可以這麼理解,
物理層關心的是如何把電氣訊號變成一段報文;資料連結層關心的是mac地址、vlan、優先順序等;網路層關心的是ip地址,下一跳ip;傳輸層關心的是連接埠資源;應用程式層關心的是報文組裝、解析、渲染、儲存、執行等等。
目前關於tcp/ip完整協議棧的代碼很多,其中我認為寫得比較好的還是linux核心/net/ipv4下面的代碼。如果朋友們對ipv6的代碼感興趣,也可以看看/net/ipv6的代碼。檔案如果朋友們對整個協議棧的代碼結構理解得不是很清楚,可以參考《linux網路分析與開發》這本書。
當然,作為應用程式層,我們的其實考慮的不用這麼複雜。對於網路程式編寫人員來講,所有網路的資源只要和一個socket關聯在一起就可以了。當然在socket可用之前,我們需要為它配置連接埠資訊和ip地址。配置完了之後,我們就可以慢慢等待報文的收發了。所以一般來說,作為伺服器連接埠的處理流程是這樣的,
a) 建立socket
b) 綁定socket到特定的ip地址
c) 對socket進行偵聽處理
d) 接受socket,表明有用戶端和伺服器串連
e) 和用戶端迴圈收發報文
f) 關閉socket
作為伺服器程式而言,它要對特定的連接埠進行綁定和偵聽處理,這樣稍顯複雜。但是如果是編寫用戶端的程式,一切的一切就變得非常簡單了,
a) 建立socket
b) 連結的伺服器端地址
c) 和伺服器端的socket收發報文
上面只是對網路編程做了一個基本的介紹,但是好多的東西還是沒有涉及到,比如說:(1) 什麼時候該使用udp,什麼時候該使用tcp?(2) 如何把多線程和網路編程聯絡在一起? (3) 如何把多進程和網路編程聯絡在一起? (4) 如何利用select函數、epoll_create機制、非阻塞函數提高socket的並發處理效率? (5) linux核心是怎麼實現tcp/ip協議的? (6) 我們自己是否也可以實現協議的處理流程等等?
關於這些內容,我們會重新開闢一個主題,逐步進行分析和模擬處理。敬請期待。