1. 程式人生 > >Linux C高階程式設計——網路程式設計基礎(1)

Linux C高階程式設計——網路程式設計基礎(1)

Linux高階程式設計——BSD socket的網路程式設計

宗旨:技術的學習是有限的,分享的精神是無限的。

網路通訊基礎

        TCP/IP協議簇基礎:之所以稱TCP/IP是一個協議簇,是因為TCP/IP包含TCP 、IP、UDP、ICMP等多種協議。下圖是OSI模型與TCP/IP模型的對比,TCP/IP將網路劃分為4層模型:應用層、傳輸層、網路層和網路介面層(有些書籍將其分為5層,即網路介面層由鏈路層和物理層組成)

(1)網路介面層:模型的基層,負責資料幀的傳送已接收(幀是獨立的網路資訊傳輸單元)。網路介面層將幀格式的資料放到網路上,或從網路上把幀取下來。

(2)網際網路(網路層):互聯協議將資料包封裝成IP資料包,並執行必要的路由演算法,有效的找到達到目的主機最優的路徑樹。這裡有四種互聯協議:

網際協議IP:負責在主機和網路之間路徑定址和路由資料包。目前主要為IPV4地址,IPV6已經在教育網中廣泛使用。

地址解析協議ARP:獲得同一物理網路中的主機硬體地址

網際控制訊息協議ICMP:傳送訊息,並報告有關資料包的傳送錯誤

互聯組管理協議IGMP:用來實現本地多路組播路由器報告

(3)傳輸層:傳輸協議在主機之間提供通訊會話。傳輸協議的選擇根據資料傳輸方式而定

主要有以下兩種傳輸協議:

傳輸控制協議TCP:為應用程式提供可靠的通訊連線。適合於一次傳輸大批資料的情況,並適用於要求得到響應的應用程式。

影虎資料包協議UDP:提供了無連線通訊,且不對傳送包進行可靠性確認。適合於一次傳送小量資料(一般小於520位元組),可靠性則由應用層來完成。

(4)應用層:應用程式通過這一層訪問網路,主要包括常見的FTP,HTTP,DNS和TELNET協議

ELNET:提供遠端登入服務

FTP:提供應用級的檔案傳輸服務

SMTP:電子郵件協議

SNMP:簡單網路管理協議

DNS:域名解析服務,將域名映像成IP地址的協議

HTTP:超文字傳輸協議,web伺服器所採用的協議

IPv4協議基礎

        TCP/IP中,IP地址在邏輯上唯一的標識了網路中的一臺主機,連線到公網上的主機地址是唯一的,一個IP地址對應一臺主機。

        IP地址兩種表示形式:二進位制表示法和點分十進位制表示法。每個IP地址由兩部分組成:網路號和主機號。TCP/IP通訊過程:

        傳輸層及其以下的機制由核心提供,應用層由使用者程序提供(後面將介紹如何使用socket API編寫應用程式),應用程式對通訊資料的含義進行解釋,而傳輸層及其以下處理通訊的細節,將資料從一臺計算機通過一定的路徑傳送到另一臺計算機。應用層資料通過協議棧發到網路上時,每層協議都要加上一個資料首部(header),稱為封裝(Encapsulation),如下圖所示TCP/IP資料包的封裝


        不同的協議層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網路層叫做資料報(datagram),在鏈路層叫做幀(frame)。資料封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層資料交給應用程式處理。上圖對應兩臺計算機在同一網段中的情況,如果兩臺計算機在不同的網段中,那麼資料從一臺計算機到另一臺計算機傳輸過程中要經過一個或多個路由器跨路由器通訊過程:

        其實在鏈路層之下還有物理層,指的是電訊號的傳遞方式,比如現在乙太網通用的網線(雙絞線)、早期乙太網採用的的同軸電纜(現在主要用於有線電視)、光纖等都屬於物理層的概念。物理層的能力決定了最大傳輸速率、傳輸距離、抗干擾性等。集線器(Hub)是工作在物理層的網路裝置,用於雙絞線的連線和訊號中繼(將已衰減的訊號再次放大使之傳得更遠)。

        鏈路層有乙太網、令牌環網等標準,鏈路層負責網絡卡裝置的驅動、幀同步(就是說從網線上檢測到什麼訊號算作新幀的開始)、衝突檢測(如果檢測到衝突就自動重發)、資料差錯校驗等工作。交換機是工作在鏈路層的網路裝置,可以在不同的鏈路層網路之間轉發資料幀(比如十兆乙太網和百兆乙太網之間、乙太網和令牌環網之間),由於不同鏈路層的幀格式不同,交換機要將進來的資料包拆掉鏈路層首部重新封裝之後再轉發。

        網路層的IP協議是構成Internet的基礎。Internet上的主機通過IP地址來標識,Internet上有大量路由器負責根據IP地址選擇合適的路徑轉發資料包,資料包從Internet上的源主機到目的主機往往要經過十多個路由器。路由器是工作在第三層的網路裝置,同時兼有交換機的功能,可以在不同的鏈路層介面之間轉發資料包,因此路由器需要將進來的資料包拆掉網路層和鏈路層兩層首部並重新封裝。IP協議不保證傳輸的可靠性,資料包在傳輸過程中可能丟失,可靠性可以在上層協議或應用程式中提供支援。

        網路層負責點到點(point-to-point)的傳輸(這裡的“點”指主機或路由器),而傳輸層負責端到端(end-to-end)的傳輸(這裡的“端”指源主機和目的主機)。傳輸層可選擇TCP或UDP協議。TCP是一種面向連線的、可靠的協議,有點像打電話,雙方拿起電話互通身份之後就建立了連線,然後說話就行了,這邊說的話那邊保證聽得到,並且是按說話的順序聽到的,說完話掛機斷開連線。也就是說TCP傳輸的雙方需要首先建立連線,之後由TCP協議保證資料收發的可靠性,丟失的資料包自動重發,上層應用程式收到的總是可靠的資料流,通訊之後關閉連線。UDP協議不面向連線,也不保證可靠性,有點像寄信,寫好信放到郵筒裡,既不能保證信件在郵遞過程中不會丟失,也不能保證信件是按順序寄到目的地的。使用UDP協議的應用程式需要自己完成丟包重發、訊息排序等工作。

目的主機收到資料包後,如何經過各層協議棧最後到達應用程式呢?整個過程如下圖所示Multiplexing過程

        乙太網驅動程式首先根據乙太網首部中的“上層協議”欄位確定該資料幀的有效載荷(payload,指除去協議首部之外實際傳輸的資料)是IP、ARP還是RARP協議的資料報,然後交給相應的協議處理。假如是IP資料報,IP協議再根據IP首部中的“上層協議”欄位確定該資料報的有效載荷是TCP、UDP、ICMP還是IGMP,然後交給相應的協議處理。假如是TCP段或UDP段,TCP或UDP協議再根據TCP首部或UDP首部的“埠號”欄位確定應該將應用層資料交給哪個使用者程序。IP地址是標識網路中不同主機的地址,而埠號就是同一臺主機上標識不同程序的地址,IP地址和埠號合起來標識網路中唯一的程序。

        注意,雖然IP、ARP和RARP資料報都需要乙太網驅動程式來封裝成幀,但是從功能上劃分,ARP和RARP屬於鏈路層,IP屬於網路層。雖然ICMP、IGMP、TCP、UDP的資料都需要IP協議來封裝成資料報,但是從功能上劃分,ICMP、IGMP與IP同屬於網路層,TCP和UDP屬於傳輸層。本文對RARP、ICMP、IGMP協議不做進一步介紹。

  TCPUDP的區別

        中國移動、中國聯通推行的GPRS網路、CDMA網路已覆蓋大量的區域,通過無線網路實現資料傳輸成為可能。無線Modem採用GPRS、CDMA模組通過中國移動、中國聯通的GPRS、CDMA網路進行資料傳輸,並通TCP/IP協議進行資料封包,可靈活地實現多種裝置接入,工程安裝簡單,在工業現場資料傳輸的應用中,能很好的解決偏遠無網路無電話線路地區的資料傳輸的難題。同傳統的數傳電臺想比較,更具有簡便性、靈活性、易操作性,同時還降低了成本,無線Modem傳輸方案是現代化工業現場資料傳輸最好的選擇方案。
        目前中國移動、中國聯通提供的GPRS網路、CDMA網路的資料傳輸頻寬在40Kbps左右,且受頻寬的限制,資料採集方案最好採用於主動告警、資料輪巡採集、告警主動回叫等對傳輸頻寬佔用較少的採集方式。同時考慮對前置機實時採集方案的支援,無線Modem傳輸方案只能作為目前傳輸方案的補充。 隨著無線通訊技術的不斷髮展,無線傳輸資料頻寬將不斷提高,採用3G無線網路,資料傳輸頻寬將達到2M,無線傳輸方案將逐漸成為監控傳輸組網的主要應用方案。目前,由於GPRS和CDMA固有的特性,在各個領域中GPRS和CDMA的應用也越來越廣泛,但是關於傳輸中使用TCP/IP協議還是UDP協議,卻爭論很多。

        TCP(Transmission Control Protocol)---傳輸控制協議,提供的是面向連線、可靠的位元組流服務。當客戶和伺服器彼此交換資料前,必須先在雙方之間建立一個TCP連線,之後才能傳輸資料。TCP提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。

        UDP(UserDatagram Protocol)---使用者資料報協議,是一個簡單的面向資料報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的資料報傳送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸資料報前不用在客戶和伺服器之間建立一個連線,且沒有超時重發等機制,故而傳輸速度很快。

這裡先簡單的說一下TCP與UDP的區別:
1。基於連線與無連線
2。對系統資源的要求(TCP較多,UDP少)
3。UDP程式結構較簡單
4。流模式與資料報模式
5。TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證

另外結合GPRS網路的情況具體的談一下他們的區別:
1。TCP傳輸存在一定的延時,大概是1600MS(移動提供),UDP響應速度稍微快一些。
2。TCP包頭結構
  源埠16位
  目標埠 16位
  序列號 32位
  迴應序號 32位
  TCP頭長度4位
  reserved6位
  控制程式碼6位
  視窗大小16位
  偏移量16位
  校驗和16位
  選項 32位(可選)
  這樣我們得出了TCP包頭的最小大小.就是20位元組.

  UDP包頭結構
  源埠16位
  目的埠16位
  長度 16位
  校驗和 16位
(UDP的包小很多.確實如此.因為UDP是非可靠連線.設計初衷就是儘可能快的將資料包傳送出去.所以UDP協議顯得非常精簡.)

3。GPRS網路埠資源,UDP十分緊缺,變化很快。

而TCP採用可靠鏈路傳輸,不存在埠變化的問題工業場合的應用一般都有以下特點,

1。要求時時傳輸,但也有一些場合是定時傳輸,總的來說在整個傳輸過程中要求伺服器中心端和GPRS終端裝置能相互的、時時的傳輸資料。
TCP本身就是可靠鏈路傳輸,提供一個時時的雙向的傳輸通道,能很好的滿足工業現場傳輸的要求。但是GPRS網路對TCP鏈路也存在一個限制:此條鏈路在長時間(大概20分鐘左右,視具體情況而定)沒有資料流量,會自動降低此鏈路的優先順序直至強制斷開此鏈路。所以在實際使用中也會採用心跳包(一般是一個位元組的資料)來維持此鏈路。
UDP由於自身特點,以及GPRS網路UDP埠資源的有限性,在一段時間沒有資料流量後,埠容易改變,產生的影響就是從伺服器中心端向GPRS終端傳送資料,GPRS終端接收不到。具體的原因就是移動閘道器從中作了中轉,需要隔一定時間給主機發UDP包來維持這個IP和埠號,這樣主機就能主動給GPRS發UDP包了並且我在測試中發現,這個間隔時間很短,我在1多分鐘發一次UDP包才能夠維持,但是再長可能移動閘道器那邊就要丟失這個埠了,此時如果主機想主動發資料給GPRS,那肯定是不行的了,只有GPRS終端裝置再發一個UDP包過去,移動重新給你分配一箇中轉IP和埠,才能夠進行雙向通訊。

2。要求資料的丟包率較小。有些工業場合,例如電力、水務抄表,環保監測等等,不容許傳輸過程中的資料丟失或者最大限度的要求資料的可靠性。從這一點來看,很顯然在無線資料傳輸過程中,TCP比UDP更能保證資料的完整性、可靠性,存在更小的丟包率。在實際測試中也是如此。以廈門桑榮科技有限公司提供的GPRS終端裝置為例:TCP的在千分之9,UDP的在千分之17左右。

3。要求降低費用。目前有很大部分GPRS裝置的應用都是取代前期無線數傳電臺,除了使用範圍外,其考慮的主要問題就是費用。能降低費用當然都是大家最願意接受的。和費用直接相關的就是流量了,流量低,費用就低了。雖然TCP本身的包頭要比UDP多,但是UDP在實際應用中往往需要維護雙向通道,就必須要通過大量的心跳包資料來維護埠資源。總的比較起來,UDP的實際流量要比TCP還要大。很多使用者在初期的時候並不瞭解UDP需要大量心跳包來維持埠資源這個問題,往往都認為UDP要比TCP更節省流量,實際上這裡存在著一個誤區。

4。在某些特定的應用場合,例如一些銀行的時時互動系統,對響應速度要求很高,此時資料傳輸頻率較快,不需要大量心跳包維持UDP埠資源,採用UDP就比較有利了。

5。在目前的1:N的傳輸模式中,既有多個GPRS終端裝置往一個伺服器中心傳輸資料,此時採用UDP會比TCP要好的多,因為UDP耗用更少的系統資源。但是在實際應用中卻發現,很多使用者還是採用TCP的傳輸方式,建立二級中心1:A(1:N),即每一個分中心對應N/A臺裝置,獨立處理資料,再統一將資料傳送到主中心。這樣既能保證了傳輸過程中採用了TCP的傳輸協議,又能很好處理了中心伺服器的多鏈路的系統耗用的問題。