Linux C高级编程——网络编程基础

Posted mthoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C高级编程——网络编程基础相关的知识,希望对你有一定的参考价值。

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:超文本传输协议,webserver所採用的协议

 

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首部的“port号”字段确定应该将应用层数据交给哪个用户进程。IP地址是标识网络中不同主机的地址,而port号就是同一台主机上标识不同进程的地址,IP地址和port号合起来标识网络中唯一的进程。

        注意,尽管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协议进行数据封包,可灵活地实现多种设备接入,project安装简单,在工业现场传输数据的应用中,能非常好的解决偏远无网络无电话线路地区的传输数据的难题。

同传统的数传电台想比較。更具有简便性、灵活性、易操作性,同一时候还减少了成本,无线Modem传输方案是现代化工业现场传输数据最好的选择方案。
        眼下中国移动、中国联通提供的GPRS网络、CDMA网络的传输数据带宽在40Kbps左右,且受带宽的限制,数据採集方案最好採用于主动告警、数据轮巡採集、告警主动回叫等对传输带宽占用较少的採集方式。同一时候考虑对前置机实时採集方案的支持。无线Modem传输方案仅仅能作为眼下传输方案的补充。 随着无线通讯技术的不断发展,无线传输数据带宽将不断提高,採用3G无线网络,传输数据带宽将达到2M,无线传输方案将逐渐成为监控传输组网的主要应用方案。眼下,因为GPRS和CDMA固有的特性。在各个领域中GPRS和CDMA的应用也越来越广泛。可是关于传输中使用TCP/IP协议还是UDP协议,却争论非常多。

        TCP(Transmission Control Protocol)---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和server彼此交换数据前。必须先在两方之间建立一个TCP连接,之后才干数据传输。TCP提供超时重发,丢弃反复数据。检验数据,流量控制等功能,保证数据能从一端传到还有一端。

        UDP(UserDatagram Protocol)---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它仅仅是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在数据传输报前不用在客户和server之间建立一个连接。且没有超时重发等机制。故而传输速度非常快。

这里先简单的说一下TCP与UDP的差别:
1。基于连接与无连接
2。对系统资源的要求(TCP较多,UDP少)
3。UDP程序结构较简单
4。

流模式与数据报模式
5。

TCP保证数据正确性,UDP可能丢包。TCP保证数据顺序,UDP不保证

另外结合GPRS网络的情况详细的谈一下他们的差别:
1。

TCP传输存在一定的延时。大概是1600MS(移动提供),UDP响应速度略微快一些。
2。TCP包头结构
  源port16位
  目标port 16位
  序列号 32位
  回应序号 32位
  TCP头长度4位
  reserved6位
  控制代码6位
  窗体大小16位
  偏移量16位
  校验和16位
  选项 32位(可选)
  这样我们得出了TCP包头的最小大小.就是20字节.

  UDP包头结构
  源port16位
  目的port16位
  长度 16位
  校验和 16位
(UDP的包小非常多.确实如此.由于UDP是非可靠连接.设计初衷就是尽可能快的将数据包发送出去.所以UDP协议显得非常精简.)

3。GPRS网络port资源,UDP十分紧缺。变化非常快。

而TCP採用可靠链路传输。不存在port变化的问题工业场合的应用一般都有下面特点,

1。

要求时时传输,但也有一些场合是定时传输,总的来说在整个传输过程中要求server中心端和GPRS终端设备能相互的、时时的数据传输。
TCP本身就是可靠链路传输。提供一个时时的双向的传输通道。能非常好的满足工业现场传输的要求。可是GPRS网络对TCP链路也存在一个限制:此条链路在长时间(大概20分钟左右,视详细情况而定)没有数据流量,会自己主动减少此链路的优先级直至强制断开此链路。所以在实际使用中也会採用心跳包(通常是一个字节的数据)来维持此链路。
UDP因为自身特点,以及GPRS网络UDPport资源的有限性,在一段时间没有数据流量后,porteasy改变。产生的影响就是从server中心端向GPRS终端发送数据,GPRS终端接收不到。详细的原因就是移动网关从中作了中转。须要隔一定时间给主机发UDP包来维持这个IP和port号,这样主机就能主动给GPRS发UDP包了而且我在測试中发现,这个间隔时间非常短,我在1多分钟发一次UDP包才可以维持,可是再长可能移动网关那边就要丢失这个port了,此时假设主机想主动发数据给GPRS,那肯定是不行的了,仅仅有GPRS终端设备再发一个UDP包过去,移动又一次给你分配一个中转IP和port,才可以进行双向通讯。

2。要求数据的丢包率较小。有些工业场合,比如电力、水务抄表,环保监測等等。不容许传输过程中的数据丢失或者最大限度的要求数据的可靠性。

从这一点来看,非常显然在无线传输数据过程中,TCP比UDP更能保证数据的完整性、可靠性,存在更小的丢包率。在实际測试中也是如此。以厦门桑荣科技有限公司提供的GPRS终端设备为例:TCP的在千分之9,UDP的在千分之17左右。

3。

要求减少费用。眼下有非常大部分GPRS设备的应用都是代替前期无线数传电台,除了使用范围外。其考虑的主要问题就是费用。能减少费用当然都是大家最愿意接受的。和费用直接相关的就是流量了,流量低,费用就低了。尽管TCP本身的包头要比UDP多,可是UDP在实际应用中往往须要维护双向通道,就必须要通过大量的心跳包数据来维护port资源。总的比較起来,UDP的实际流量要比TCP还要大。非常多使用者在初期的时候并不了解UDP须要大量心跳包来维持port资源这个问题,往往都觉得UDP要比TCP更节省流量,实际上这里存在着一个误区。

4。

在某些特定的应用场合。比如一些银行的时时交互系统,对响应速度要求非常高,此时传输数据频率较快,不须要大量心跳包维持UDPport资源。採用UDP就比較有利了。

5。在眼下的1:N的传输模式中,既有多个GPRS终端设备往一个server中心数据传输。此时採用UDP会比TCP要好的多,由于UDP耗用更少的系统资源。

可是在实际应用中却发现,非常多用户还是採用TCP的传输方式,建立二级中心1:A(1:N),即每个分中心相应N/A台设备,独立处理数据,再统一将数据传送到主中心。这样既能保证了传输过程中採用了TCP的传输协议。又能非常优点理了中心server的多链路的系统耗用的问题。


































以上是关于Linux C高级编程——网络编程基础的主要内容,如果未能解决你的问题,请参考以下文章

Linux C高级编程——网络编程

Linux C高级编程——文件操作之系统调用

Linux C高级编程——网络编程之以太网

c_cpp “Linux的环境高级编程”作业3

c_cpp “Linux的环境高级编程”作业2

c_cpp “Linux的环境高级编程”作业1