Linux C高级编程——网络编程基础(1)
Linux高級(jí)編程——BSD socket的網(wǎng)絡(luò)編程
宗旨:技術(shù)的學(xué)習(xí)是有限的,分享的精神是無(wú)限的。
一網(wǎng)絡(luò)通信基礎(chǔ)
? ? ? ? TCP/IP協(xié)議簇基礎(chǔ):之所以稱TCP/IP是一個(gè)協(xié)議簇,是因?yàn)門CP/IP包含TCP 、IP、UDP、ICMP等多種協(xié)議。下圖是OSI模型與TCP/IP模型的對(duì)比,TCP/IP將網(wǎng)絡(luò)劃分為4層模型:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層(有些書(shū)籍將其分為5層,即網(wǎng)絡(luò)接口層由鏈路層和物理層組成)
(1)網(wǎng)絡(luò)接口層:模型的基層,負(fù)責(zé)數(shù)據(jù)幀的發(fā)送已接收(幀是獨(dú)立的網(wǎng)絡(luò)信息傳輸單元)。網(wǎng)絡(luò)接口層將幀格式的數(shù)據(jù)放到網(wǎng)絡(luò)上,或從網(wǎng)絡(luò)上把幀取下來(lái)。
(2)互聯(lián)網(wǎng)(網(wǎng)絡(luò)層):互聯(lián)協(xié)議將數(shù)據(jù)包封裝成IP數(shù)據(jù)包,并運(yùn)行必要的路由算法,有效的找到達(dá)到目的主機(jī)最優(yōu)的路徑樹(shù)。這里有四種互聯(lián)協(xié)議:
網(wǎng)際協(xié)議IP:負(fù)責(zé)在主機(jī)和網(wǎng)絡(luò)之間路徑尋址和路由數(shù)據(jù)包。目前主要為IPV4地址,IPV6已經(jīng)在教育網(wǎng)中廣泛使用。
地址解析協(xié)議ARP:獲得同一物理網(wǎng)絡(luò)中的主機(jī)硬件地址
網(wǎng)際控制消息協(xié)議ICMP:發(fā)送消息,并報(bào)告有關(guān)數(shù)據(jù)包的傳送錯(cuò)誤
互聯(lián)組管理協(xié)議IGMP:用來(lái)實(shí)現(xiàn)本地多路組播路由器報(bào)告
(3)傳輸層:傳輸協(xié)議在主機(jī)之間提供通信會(huì)話。傳輸協(xié)議的選擇根據(jù)數(shù)據(jù)傳輸方式而定
主要有以下兩種傳輸協(xié)議:
傳輸控制協(xié)議TCP:為應(yīng)用程序提供可靠的通信連接。適合于一次傳輸大批數(shù)據(jù)的情況,并適用于要求得到響應(yīng)的應(yīng)用程序。
影虎數(shù)據(jù)包協(xié)議UDP:提供了無(wú)連接通信,且不對(duì)傳送包進(jìn)行可靠性確認(rèn)。適合于一次傳送小量數(shù)據(jù)(一般小于520字節(jié)),可靠性則由應(yīng)用層來(lái)完成。
(4)應(yīng)用層:應(yīng)用程序通過(guò)這一層訪問(wèn)網(wǎng)絡(luò),主要包括常見(jiàn)的FTP,HTTP,DNS和TELNET協(xié)議
ELNET:提供遠(yuǎn)程登錄服務(wù)
FTP:提供應(yīng)用級(jí)的文件傳輸服務(wù)
SMTP:電子郵件協(xié)議
SNMP:簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議
DNS:域名解析服務(wù),將域名映像成IP地址的協(xié)議
HTTP:超文本傳輸協(xié)議,web服務(wù)器所采用的協(xié)議
?
二 IPv4協(xié)議基礎(chǔ)
? ? ? ? TCP/IP中,IP地址在邏輯上唯一的標(biāo)識(shí)了網(wǎng)絡(luò)中的一臺(tái)主機(jī),連接到公網(wǎng)上的主機(jī)地址是唯一的,一個(gè)IP地址對(duì)應(yīng)一臺(tái)主機(jī)。
? ? ? ? IP地址兩種表示形式:二進(jìn)制表示法和點(diǎn)分十進(jìn)制表示法。每個(gè)IP地址由兩部分組成:網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。TCP/IP通訊過(guò)程:
? ? ? ? 傳輸層及其以下的機(jī)制由內(nèi)核提供,應(yīng)用層由用戶進(jìn)程提供(后面將介紹如何使用socket API編寫應(yīng)用程序),應(yīng)用程序?qū)νㄓ崝?shù)據(jù)的含義進(jìn)行解釋,而傳輸層及其以下處理通訊的細(xì)節(jié),將數(shù)據(jù)從一臺(tái)計(jì)算機(jī)通過(guò)一定的路徑發(fā)送到另一臺(tái)計(jì)算機(jī)。應(yīng)用層數(shù)據(jù)通過(guò)協(xié)議棧發(fā)到網(wǎng)絡(luò)上時(shí),每層協(xié)議都要加上一個(gè)數(shù)據(jù)首部(header),稱為封裝(Encapsulation),如下圖所示TCP/IP數(shù)據(jù)包的封裝
? ? ? ? 不同的協(xié)議層對(duì)數(shù)據(jù)包有不同的稱謂,在傳輸層叫做段(segment),在網(wǎng)絡(luò)層叫做數(shù)據(jù)報(bào)(datagram),在鏈路層叫做幀(frame)。數(shù)據(jù)封裝成幀后發(fā)到傳輸介質(zhì)上,到達(dá)目的主機(jī)后每層協(xié)議再剝掉相應(yīng)的首部,最后將應(yīng)用層數(shù)據(jù)交給應(yīng)用程序處理。上圖對(duì)應(yīng)兩臺(tái)計(jì)算機(jī)在同一網(wǎng)段中的情況,如果兩臺(tái)計(jì)算機(jī)在不同的網(wǎng)段中,那么數(shù)據(jù)從一臺(tái)計(jì)算機(jī)到另一臺(tái)計(jì)算機(jī)傳輸過(guò)程中要經(jīng)過(guò)一個(gè)或多個(gè)路由器跨路由器通訊過(guò)程:
? ? ? ? 其實(shí)在鏈路層之下還有物理層,指的是電信號(hào)的傳遞方式,比如現(xiàn)在以太網(wǎng)通用的網(wǎng)線(雙絞線)、早期以太網(wǎng)采用的的同軸電纜(現(xiàn)在主要用于有線電視)、光纖等都屬于物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等。集線器(Hub)是工作在物理層的網(wǎng)絡(luò)設(shè)備,用于雙絞線的連接和信號(hào)中繼(將已衰減的信號(hào)再次放大使之傳得更遠(yuǎn))。
? ? ? ? 鏈路層有以太網(wǎng)、令牌環(huán)網(wǎng)等標(biāo)準(zhǔn),鏈路層負(fù)責(zé)網(wǎng)卡設(shè)備的驅(qū)動(dòng)、幀同步(就是說(shuō)從網(wǎng)線上檢測(cè)到什么信號(hào)算作新幀的開(kāi)始)、沖突檢測(cè)(如果檢測(cè)到?jīng)_突就自動(dòng)重發(fā))、數(shù)據(jù)差錯(cuò)校驗(yàn)等工作。交換機(jī)是工作在鏈路層的網(wǎng)絡(luò)設(shè)備,可以在不同的鏈路層網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)數(shù)據(jù)幀(比如十兆以太網(wǎng)和百兆以太網(wǎng)之間、以太網(wǎng)和令牌環(huán)網(wǎng)之間),由于不同鏈路層的幀格式不同,交換機(jī)要將進(jìn)來(lái)的數(shù)據(jù)包拆掉鏈路層首部重新封裝之后再轉(zhuǎn)發(fā)。
? ? ? ? 網(wǎng)絡(luò)層的IP協(xié)議是構(gòu)成Internet的基礎(chǔ)。Internet上的主機(jī)通過(guò)IP地址來(lái)標(biāo)識(shí),Internet上有大量路由器負(fù)責(zé)根據(jù)IP地址選擇合適的路徑轉(zhuǎn)發(fā)數(shù)據(jù)包,數(shù)據(jù)包從Internet上的源主機(jī)到目的主機(jī)往往要經(jīng)過(guò)十多個(gè)路由器。路由器是工作在第三層的網(wǎng)絡(luò)設(shè)備,同時(shí)兼有交換機(jī)的功能,可以在不同的鏈路層接口之間轉(zhuǎn)發(fā)數(shù)據(jù)包,因此路由器需要將進(jìn)來(lái)的數(shù)據(jù)包拆掉網(wǎng)絡(luò)層和鏈路層兩層首部并重新封裝。IP協(xié)議不保證傳輸?shù)目煽啃?#xff0c;數(shù)據(jù)包在傳輸過(guò)程中可能丟失,可靠性可以在上層協(xié)議或應(yīng)用程序中提供支持。
? ? ? ? 網(wǎng)絡(luò)層負(fù)責(zé)點(diǎn)到點(diǎn)(point-to-point)的傳輸(這里的“點(diǎn)”指主機(jī)或路由器),而傳輸層負(fù)責(zé)端到端(end-to-end)的傳輸(這里的“端”指源主機(jī)和目的主機(jī))。傳輸層可選擇TCP或UDP協(xié)議。TCP是一種面向連接的、可靠的協(xié)議,有點(diǎn)像打電話,雙方拿起電話互通身份之后就建立了連接,然后說(shuō)話就行了,這邊說(shuō)的話那邊保證聽(tīng)得到,并且是按說(shuō)話的順序聽(tīng)到的,說(shuō)完話掛機(jī)斷開(kāi)連接。也就是說(shuō)TCP傳輸?shù)碾p方需要首先建立連接,之后由TCP協(xié)議保證數(shù)據(jù)收發(fā)的可靠性,丟失的數(shù)據(jù)包自動(dòng)重發(fā),上層應(yīng)用程序收到的總是可靠的數(shù)據(jù)流,通訊之后關(guān)閉連接。UDP協(xié)議不面向連接,也不保證可靠性,有點(diǎn)像寄信,寫好信放到郵筒里,既不能保證信件在郵遞過(guò)程中不會(huì)丟失,也不能保證信件是按順序寄到目的地的。使用UDP協(xié)議的應(yīng)用程序需要自己完成丟包重發(fā)、消息排序等工作。
目的主機(jī)收到數(shù)據(jù)包后,如何經(jīng)過(guò)各層協(xié)議棧最后到達(dá)應(yīng)用程序呢?整個(gè)過(guò)程如下圖所示Multiplexing過(guò)程
? ? ? ? 以太網(wǎng)驅(qū)動(dòng)程序首先根據(jù)以太網(wǎng)首部中的“上層協(xié)議”字段確定該數(shù)據(jù)幀的有效載荷(payload,指除去協(xié)議首部之外實(shí)際傳輸?shù)臄?shù)據(jù))是IP、ARP還是RARP協(xié)議的數(shù)據(jù)報(bào),然后交給相應(yīng)的協(xié)議處理。假如是IP數(shù)據(jù)報(bào),IP協(xié)議再根據(jù)IP首部中的“上層協(xié)議”字段確定該數(shù)據(jù)報(bào)的有效載荷是TCP、UDP、ICMP還是IGMP,然后交給相應(yīng)的協(xié)議處理。假如是TCP段或UDP段,TCP或UDP協(xié)議再根據(jù)TCP首部或UDP首部的“端口號(hào)”字段確定應(yīng)該將應(yīng)用層數(shù)據(jù)交給哪個(gè)用戶進(jìn)程。IP地址是標(biāo)識(shí)網(wǎng)絡(luò)中不同主機(jī)的地址,而端口號(hào)就是同一臺(tái)主機(jī)上標(biāo)識(shí)不同進(jìn)程的地址,IP地址和端口號(hào)合起來(lái)標(biāo)識(shí)網(wǎng)絡(luò)中唯一的進(jìn)程。
? ? ? ? 注意,雖然IP、ARP和RARP數(shù)據(jù)報(bào)都需要以太網(wǎng)驅(qū)動(dòng)程序來(lái)封裝成幀,但是從功能上劃分,ARP和RARP屬于鏈路層,IP屬于網(wǎng)絡(luò)層。雖然ICMP、IGMP、TCP、UDP的數(shù)據(jù)都需要IP協(xié)議來(lái)封裝成數(shù)據(jù)報(bào),但是從功能上劃分,ICMP、IGMP與IP同屬于網(wǎng)絡(luò)層,TCP和UDP屬于傳輸層。本文對(duì)RARP、ICMP、IGMP協(xié)議不做進(jìn)一步介紹。
?三 TCP與UDP的區(qū)別
? ? ? ? 中國(guó)移動(dòng)、中國(guó)聯(lián)通推行的GPRS網(wǎng)絡(luò)、CDMA網(wǎng)絡(luò)已覆蓋大量的區(qū)域,通過(guò)無(wú)線網(wǎng)絡(luò)實(shí)現(xiàn)數(shù)據(jù)傳輸成為可能。無(wú)線Modem采用GPRS、CDMA模塊通過(guò)中國(guó)移動(dòng)、中國(guó)聯(lián)通的GPRS、CDMA網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)傳輸,并通TCP/IP協(xié)議進(jìn)行數(shù)據(jù)封包,可靈活地實(shí)現(xiàn)多種設(shè)備接入,工程安裝簡(jiǎn)單,在工業(yè)現(xiàn)場(chǎng)數(shù)據(jù)傳輸?shù)膽?yīng)用中,能很好的解決偏遠(yuǎn)無(wú)網(wǎng)絡(luò)無(wú)電話線路地區(qū)的數(shù)據(jù)傳輸?shù)碾y題。同傳統(tǒng)的數(shù)傳電臺(tái)想比較,更具有簡(jiǎn)便性、靈活性、易操作性,同時(shí)還降低了成本,無(wú)線Modem傳輸方案是現(xiàn)代化工業(yè)現(xiàn)場(chǎng)數(shù)據(jù)傳輸最好的選擇方案。
? ? ? ? 目前中國(guó)移動(dòng)、中國(guó)聯(lián)通提供的GPRS網(wǎng)絡(luò)、CDMA網(wǎng)絡(luò)的數(shù)據(jù)傳輸帶寬在40Kbps左右,且受帶寬的限制,數(shù)據(jù)采集方案最好采用于主動(dòng)告警、數(shù)據(jù)輪巡采集、告警主動(dòng)回叫等對(duì)傳輸帶寬占用較少的采集方式。同時(shí)考慮對(duì)前置機(jī)實(shí)時(shí)采集方案的支持,無(wú)線Modem傳輸方案只能作為目前傳輸方案的補(bǔ)充。 隨著無(wú)線通訊技術(shù)的不斷發(fā)展,無(wú)線傳輸數(shù)據(jù)帶寬將不斷提高,采用3G無(wú)線網(wǎng)絡(luò),數(shù)據(jù)傳輸帶寬將達(dá)到2M,無(wú)線傳輸方案將逐漸成為監(jiān)控傳輸組網(wǎng)的主要應(yīng)用方案。目前,由于GPRS和CDMA固有的特性,在各個(gè)領(lǐng)域中GPRS和CDMA的應(yīng)用也越來(lái)越廣泛,但是關(guān)于傳輸中使用TCP/IP協(xié)議還是UDP協(xié)議,卻爭(zhēng)論很多。
? ? ? ? TCP(Transmission Control Protocol)---傳輸控制協(xié)議,提供的是面向連接、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。
? ? ? ? UDP(UserDatagram Protocol)---用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議。UDP不提供可靠性,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接,且沒(méi)有超時(shí)重發(fā)等機(jī)制,故而傳輸速度很快。
這里先簡(jiǎn)單的說(shuō)一下TCP與UDP的區(qū)別:
1。基于連接與無(wú)連接
2。對(duì)系統(tǒng)資源的要求(TCP較多,UDP少)
3。UDP程序結(jié)構(gòu)較簡(jiǎn)單
4。流模式與數(shù)據(jù)報(bào)模式
5。TCP保證數(shù)據(jù)正確性,UDP可能丟包,TCP保證數(shù)據(jù)順序,UDP不保證
另外結(jié)合GPRS網(wǎng)絡(luò)的情況具體的談一下他們的區(qū)別:
1。TCP傳輸存在一定的延時(shí),大概是1600MS(移動(dòng)提供),UDP響應(yīng)速度稍微快一些。
2。TCP包頭結(jié)構(gòu)
源端口16位
目標(biāo)端口 16位
序列號(hào) 32位
回應(yīng)序號(hào) 32位
TCP頭長(zhǎng)度4位
reserved6位
控制代碼6位
窗口大小16位
偏移量16位
校驗(yàn)和16位
選項(xiàng) 32位(可選)
這樣我們得出了TCP包頭的最小大小.就是20字節(jié).
UDP包頭結(jié)構(gòu)
源端口16位
目的端口16位
長(zhǎng)度 16位
校驗(yàn)和 16位
(UDP的包小很多.確實(shí)如此.因?yàn)閁DP是非可靠連接.設(shè)計(jì)初衷就是盡可能快的將數(shù)據(jù)包發(fā)送出去.所以UDP協(xié)議顯得非常精簡(jiǎn).)
3。GPRS網(wǎng)絡(luò)端口資源,UDP十分緊缺,變化很快。
而TCP采用可靠鏈路傳輸,不存在端口變化的問(wèn)題工業(yè)場(chǎng)合的應(yīng)用一般都有以下特點(diǎn),
1。要求時(shí)時(shí)傳輸,但也有一些場(chǎng)合是定時(shí)傳輸,總的來(lái)說(shuō)在整個(gè)傳輸過(guò)程中要求服務(wù)器中心端和GPRS終端設(shè)備能相互的、時(shí)時(shí)的傳輸數(shù)據(jù)。
TCP本身就是可靠鏈路傳輸,提供一個(gè)時(shí)時(shí)的雙向的傳輸通道,能很好的滿足工業(yè)現(xiàn)場(chǎng)傳輸?shù)囊蟆5荊PRS網(wǎng)絡(luò)對(duì)TCP鏈路也存在一個(gè)限制:此條鏈路在長(zhǎng)時(shí)間(大概20分鐘左右,視具體情況而定)沒(méi)有數(shù)據(jù)流量,會(huì)自動(dòng)降低此鏈路的優(yōu)先級(jí)直至強(qiáng)制斷開(kāi)此鏈路。所以在實(shí)際使用中也會(huì)采用心跳包(一般是一個(gè)字節(jié)的數(shù)據(jù))來(lái)維持此鏈路。
UDP由于自身特點(diǎn),以及GPRS網(wǎng)絡(luò)UDP端口資源的有限性,在一段時(shí)間沒(méi)有數(shù)據(jù)流量后,端口容易改變,產(chǎn)生的影響就是從服務(wù)器中心端向GPRS終端發(fā)送數(shù)據(jù),GPRS終端接收不到。具體的原因就是移動(dòng)網(wǎng)關(guān)從中作了中轉(zhuǎn),需要隔一定時(shí)間給主機(jī)發(fā)UDP包來(lái)維持這個(gè)IP和端口號(hào),這樣主機(jī)就能主動(dòng)給GPRS發(fā)UDP包了并且我在測(cè)試中發(fā)現(xiàn),這個(gè)間隔時(shí)間很短,我在1多分鐘發(fā)一次UDP包才能夠維持,但是再長(zhǎng)可能移動(dòng)網(wǎng)關(guān)那邊就要丟失這個(gè)端口了,此時(shí)如果主機(jī)想主動(dòng)發(fā)數(shù)據(jù)給GPRS,那肯定是不行的了,只有GPRS終端設(shè)備再發(fā)一個(gè)UDP包過(guò)去,移動(dòng)重新給你分配一個(gè)中轉(zhuǎn)IP和端口,才能夠進(jìn)行雙向通訊。
2。要求數(shù)據(jù)的丟包率較小。有些工業(yè)場(chǎng)合,例如電力、水務(wù)抄表,環(huán)保監(jiān)測(cè)等等,不容許傳輸過(guò)程中的數(shù)據(jù)丟失或者最大限度的要求數(shù)據(jù)的可靠性。從這一點(diǎn)來(lái)看,很顯然在無(wú)線數(shù)據(jù)傳輸過(guò)程中,TCP比UDP更能保證數(shù)據(jù)的完整性、可靠性,存在更小的丟包率。在實(shí)際測(cè)試中也是如此。以廈門桑榮科技有限公司提供的GPRS終端設(shè)備為例:TCP的在千分之9,UDP的在千分之17左右。
3。要求降低費(fèi)用。目前有很大部分GPRS設(shè)備的應(yīng)用都是取代前期無(wú)線數(shù)傳電臺(tái),除了使用范圍外,其考慮的主要問(wèn)題就是費(fèi)用。能降低費(fèi)用當(dāng)然都是大家最愿意接受的。和費(fèi)用直接相關(guān)的就是流量了,流量低,費(fèi)用就低了。雖然TCP本身的包頭要比UDP多,但是UDP在實(shí)際應(yīng)用中往往需要維護(hù)雙向通道,就必須要通過(guò)大量的心跳包數(shù)據(jù)來(lái)維護(hù)端口資源。總的比較起來(lái),UDP的實(shí)際流量要比TCP還要大。很多使用者在初期的時(shí)候并不了解UDP需要大量心跳包來(lái)維持端口資源這個(gè)問(wèn)題,往往都認(rèn)為UDP要比TCP更節(jié)省流量,實(shí)際上這里存在著一個(gè)誤區(qū)。
4。在某些特定的應(yīng)用場(chǎng)合,例如一些銀行的時(shí)時(shí)交互系統(tǒng),對(duì)響應(yīng)速度要求很高,此時(shí)數(shù)據(jù)傳輸頻率較快,不需要大量心跳包維持UDP端口資源,采用UDP就比較有利了。
5。在目前的1:N的傳輸模式中,既有多個(gè)GPRS終端設(shè)備往一個(gè)服務(wù)器中心傳輸數(shù)據(jù),此時(shí)采用UDP會(huì)比TCP要好的多,因?yàn)閁DP耗用更少的系統(tǒng)資源。但是在實(shí)際應(yīng)用中卻發(fā)現(xiàn),很多用戶還是采用TCP的傳輸方式,建立二級(jí)中心1:A(1:N),即每一個(gè)分中心對(duì)應(yīng)N/A臺(tái)設(shè)備,獨(dú)立處理數(shù)據(jù),再統(tǒng)一將數(shù)據(jù)傳送到主中心。這樣既能保證了傳輸過(guò)程中采用了TCP的傳輸協(xié)議,又能很好處理了中心服務(wù)器的多鏈路的系統(tǒng)耗用的問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的Linux C高级编程——网络编程基础(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: svn如何退回软件版本_SVN版本控制工
- 下一篇: Linux中移动光标cw什么意思,Lin