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