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協議不做進一步介紹。
?三 TCP與UDP的區別
? ? ? ? 中國移動、中國聯通推行的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的傳輸協議,又能很好處理了中心服務器的多鏈路的系統耗用的問題。
總結
以上是生活随笔為你收集整理的Linux C高级编程——网络编程基础(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn如何退回软件版本_SVN版本控制工
- 下一篇: Linux中移动光标cw什么意思,Lin