当前位置: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套接口,此值常缺
[1] [2] 下一页 

(出处:http://www.sheup.com)


上一页 [1] [2]