歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux下的廣播程序制作

  TCP/IP網絡的主要原理   在一個IP(Internet Protocol)網絡中,每一台計算機都有一個32位的IP地址。每台計算機的IP地址都是唯一的。WWW是一個范圍十分大,並且不斷增長的IP網絡,所以網絡上的每台計算機都必須有一個唯一的IP地址。IP地址是用.分隔開的4個十進制數,例如16.42.0.9。實際上IP地址可以分為兩部分:一部分是網絡地址,另一部分是主機地址,例如,在16.42.0.9中,16.42是網絡地址,0.9則為主機地址。而主機地址又可以分為子網地址和主機地址。計算機的IP地址很不容易記憶,如果使用一個名字就可以方便得多。如果使用名字,則必須有某一種機制將名字轉化為IP地址。這些名字可以靜態地保存在/etc/hosts文件中,或者Linux系統請求域名服務器(DNS服務器)來轉換名字。如果使用DNS服務器的話,本地的主機則必須知道一個或者多個DNS服務器的IP地址,這些信息保存在/etc/resolv.conf文件中。   當你和其他計算機相連時,系統要使用IP地址和其他計算機交換數據。數據保存在IP數據包中。每一個IP數據包都有一個IP數據頭,其中包括源地址和目的地址,一個數據校驗和以及其他一些有關的信息。IP數據包的大小隨傳輸介質的不同而不同,例如,以太網的數據包要大於PPP的數據包。目的地址的主機在接收數據包後,必須再將數據裝配起來,然後傳送給接收的應用程序。   連接在同一個IP子網上的主機之間可以直接傳送IP數據包,而在不同子網之間的主機卻要使用網關。網關用來在不同的子網之間傳送數據包。   IP協議是一個傳輸層的協議,其他的協議可以利用IP協議來傳輸數據。TCP(Transmission Control Protocol)協議是一個可靠的點到點之間的協議,它使用IP協議來傳送和接收自己的數據包。TCP協議是基於連接的協議。需要通信的兩個應用程序之間將建立起一條虛擬的連接線路,即使其中要經過很多子網、網關和路由器。TCP協議保證在兩個應用程序之間可靠地傳送和接收數據,並且可以保證沒有丟失的或者重復的數據包。當TCP協議使用IP協議傳送它自己的數據包時,IP數據包中的數據就是TCP數據包本身。相互通信的主機中的IP協議層負責傳送和接收IP數據包。每一個IP數據頭中都包括一個字節的協議標識符。當TCP協議請求IP協議層傳送一個IP數據包時,IP數據頭中的協議標識符指明其中的數據包是一個TCP數據包。接收端的IP層則可以使用此協議標識符來決定將接收到的數據包傳送到那一層,在這裡是TCP協議層。   當應用程序使用TCP/IP通信時,它們不僅要指明目標計算機的IP地址,也要指明應用程序使用的端口地址。端口地址可以唯一地表示一個應用程序,標准的網絡應用程序使用標准的端口地址,例如,web服務器使用端口80。你可以在/etc/services中查看已經登記的端口地址。   IP 協議層也可以使用不同的物理介質來傳送IP數據包到其他的IP地址主機。這些介質可以自己添加協議頭。例如以太網協議層、PPP協議層或者SLIP協議層。以太網可以同時連接很多個主機,每一個主機上都有一個以太網的地址。這個地址是唯一的,並且保存在以太網卡中。所以在以太網上傳輸IP數據包時,必須將IP數據包中的IP地址轉換成主機的以太網卡中的物理地址。Linux系統使用地址解決協議( ARP)來把IP地址翻譯成主機以太網卡中的物理地址。希望把IP地址翻譯成硬件地址的主機使用廣播地址向網絡中的所有節點發送一個包括IP地址的ARP請求數據包。擁有此IP地址的目的計算機接收到請求以後,返回一個包括其物理地址的ARP應答。ARP協議不僅僅限於以太網,它還可以用於其他的物理介質,例如FDDI等。那些不能使用ARP的網絡設備可以標記出來,這樣Linux系統就不會試圖使用ARP。系統中也有一個反向的翻譯協議,叫做RARP,用來將主機的物理地址翻譯成IP地址。網關可以使用此協議來代表遠程網絡中的IP地址回應ARP請求。     BSD 套接口   BSD 套接口是最早的網絡通信的實現,它由一個只處理BSD 套接口的管理軟件支持。其下面是INET套接口層,它管理TCP協議和UDP協議的通信末端。UDP(User Datagram Protocol)是無連接的協議,而TCP則是一個可靠的端到端協議。當網絡中傳送一個UDP數據包時,Linux系統不知道也不關心這些UDP數據包是否安全地到達目的節點。TCP數據包是編號的,同時TCP傳輸的兩端都要確認數據包的正確性。IP協議層是用來實現網間協議的,其中的代碼要為上一層數據准備IP數據頭,並且要決定如何把接收到的IP數據包傳送到TCP協議層或者UDP協議層。在IP協議層的下方是支持整個Linux 網絡系統的網絡設備,例如PPP和以太網。網絡設備並不完全等同於物理設備,因為一些網絡設備,例如回饋設備是完全由軟件實現的。和其他那些使用mknod命令創建的Linux系統的標准設備不同,網絡設備只有在軟件檢測到和初始化這些設備時才在系統中出現。當你構建系統內核時,即使系統中有相應的以太網設備驅動程序,你也只能看到/dev/eth0。ARP協議在IP協議層和支持ARP翻譯地址的協議之間。   ================================   網絡應用程序   用戶層   --------------------------------   BSD 核心層   套接口層      LNET   套接口層      /  \   TCP UDP      IP      PPP SLIP Ethernet ---> ARP   ================================   BSD是UNIX系統中通用的網絡接口,它不僅支持各種不同的網絡類型,而且也是一種內部進程之間的通信機制。兩個通信進程都用一個套接口來描述通信鏈路的兩端。套接口可以認為是一種特殊的管道,但和管道不同的是,套接口對於可以容納的數據的大小沒有限制。Linux支持多種類型的套接口,也叫做套接口尋址族,這是因為每種類型的套接口都有自己的尋址方法。   Linux的BSD 套接口支持下面的幾種套接口類型:     1. 流式(stream)   這些套接口提供了可靠的雙向順序數據流連接。它們可以保證數據傳輸中的完整性、正確性和單一性。INET尋址族中的TCP協議支持這種類型的套接口。   數據流套接口是可靠的雙向連接的通信數據流。如果你在套接口中以“ 1, 2”的順序放入兩個數據,它們在另一端也會以“1, 2”的順序到達。它們也可以被認為是無錯誤的傳輸。   經常使用的telnet應用程序就是使用數據流套接口的一個例子。使用HTTP的WWW浏覽器也使用數據流套接口來讀取網頁。事實上,如果你使用telnet 登錄到一個WWW站點的8 0端口,然後鍵入“GET 網頁名”,你將可以得到這個Html頁。數據流套接口使用TCP得到這種高質量的數據傳輸。數據報套接口使用UDP,所以數據報的順序是沒有保障的。數據報是按一種應答的方式進行數據傳輸的。     2. 數據報(Datagram)   這種類型的套接口也可以像流式套接口一樣提供雙向的數據傳輸,但它們不能保證傳輸的數據一定能夠到達目的節點。即使數據能夠到達,也無法保證數據以正確的順序到達以及數據的單一性、正確性。U D P協議支持這種類型的套接口。     3. 原始(Raw)   這種類型的套接口允許進程直接存取下層的協議。     4. 可靠遞送消息(Reliable Delivered Messages)   這種套接口和數據報套接口一樣,只能保證數據的到達。     5. 順序數據包(Sequenced Packets)   這種套接口和流式套接口相同,除了數據包的大小是固定的。     6. 數據包(Packet)   這不是標准的BSD 套接口類型,而是Linux 中的一種擴展。它允許進程直接存取設備層的數據包。     基本套接口選項     SO_KEEPALIVE   檢測對方主機是否崩潰,避免(服務器)永遠阻塞於TCP連接的輸入。 設置該選項後,如果2小時內在此套接口的任一方向都沒有數據交換,TCP就自動給對方 發一個保持存活探測分節(keepalive probe)。這是一個對方必須響應的TCP分節.它會導致以下三種情況:   對方接收一切正常:以期望的ACK響應。2小時後,TCP將發出另一個探測分節。   對方已崩潰且已重新啟動:以RST響應。套接口的待處理錯誤被置為ECONNRESET,套接 口本身則被關閉。 對方無任何響應:源自berkeley的TCP發送另外8個探測分節,相隔75秒一個,試圖得到 一個響應。在發出第一個探測分節11分鐘15秒後若仍無響應就放棄。套接口的待處理錯 誤被置為ETIMEOUT,套接口本身則被關閉。如ICMP錯誤是“host unreachable(主機不 可達)”,說明對方主機並沒有崩潰,但是不可達,這種情況下待處理錯誤被置為EHOSTUNREACH。     SO_RCVBUF和SO_SNDBUF   每個套接口都有一個發送緩沖區和一個接收緩沖區。 接收緩沖區被TCP和UDP用來將接收到的數據一直保存到由應用進程來讀。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收緩沖區不可能溢出,因為對方不允許發出超過所通告窗口大小的數據。 這就是TCP的流量控制,如果對方無視窗口大小而發出了超過宙口大小的數據,則接 收方TCP將丟棄它。 UDP:當接收到的數據報裝不進套接口接收緩沖區時,此數據報就被丟棄。UDP是沒有 流量控制的;快的發送者可以很容易地就淹沒慢的接收者,導致接收方的UDP丟棄數據報。     SO_LINGER   指定函數CLOSE對面相連接的協議如何操作——當由數據殘留在套接口發送緩沖區時的處理 LINGER結構   strUCt linger { int l_onoff; // 0=off, nonzero=on int l_linger; //linger time in seconds };     SO_RCVLOWAT 和SO_SNDLOWAT   每個套接口都有一個接收低潮限度和一個發送低潮限度。它們是函數select使用的, 接收低潮限度是讓select返回“可讀”而在套接口接收緩沖區中必須有的數據總量。 ——對於一個TCP或UDP套接口,此值缺省為1。發送低潮限度是讓select返回“可寫” 而在套接口發送緩沖區中必須有的可用空間。對於TCP套接口,此值常缺




Copyright © Linux教程網 All Rights Reserved