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