1、 导言
Linux 是一种自在的Unix类多用户,多任务的操作体系,可在运转在Intel 80386及更高层次的PC机、ARMS、MIPS和PowerPC等多种核算机渠道,已成为运用广泛、牢靠性高、功用强大的核算机操作体系,Linux 具有内核小、功率高、源代码敞开等长处,还内含了TCP/IP网络协议,很合适在服务器范畴运用,而服务器首要用途之一便是进行网络通讯,跟着核算机工作主动化处理技能的运用与推行,网络的不断遍及,传统的纸张式文件传输方法现已不再合适开展的需求,人们更等候一种快捷、高效、环保、安全的网络传输方法。
本文便是考虑到这一现状,结合依据Linux操作体系下的TCP/IP网络通讯原理,给出了一种依据TCP/IP编程完成文件传输的实例,因而,TCP/IP网络通讯研讨具有十分重要的含义。
2、 TCP/IP协议概述
TCP/IP即传输操控协议/网络协议(Transmission Control Protocol/Internet Protocol),是一个由多种协议组成的协议族,他界说了核算机经过网络相互通讯及协议族各层次之间通讯的规范,图1描绘了Linux对IP协议族的完成机制。
Linux支撑BSD的套接字和悉数的TCP/IP协议,是经过网络协议将其视为一组相连的软件层来完成的,BSD套接字(BSD Socket)由通用的套接字办理软件支撑,该软件是INET套接字层,用来办理依据IP的TCP与UDP端口到端口的互联问题,从协议分层来看,IP是网络层协议,TCP是一个牢靠的端口到端口的传输层协议,他是运用IP层进行传接报文的,一起也是面向衔接的,经过树立一条虚拟电路在不同的网路间传输报文,确保所传输报文的无丢掉性和无重复性。用户数据报文协议(User Datagram Protocol,UDP)也是运用IP层传输报文,但他是一个非面向衔接的传输层协议,运用IP层传输报文时,当意图方网际协议层收到IP报文后,有必要识别出该报文所运用的上层协议(即传输层协议),因而,在IP报头上中,设有一个”协议”域(Protocol)。经过该域的值,即可判明其上层协议类型,传输层与网络层在功用说的最大区别是前者供给进程通讯才能,而后者则不能,在进程通讯的含义上,网络通讯的终究地址不仅仅是主机地址,还包含能够描绘进程的某种标识符,为此,TCP/UDP提出了协议端口(Protocol Port)的概念,用于标识通讯的进程,例如,Web服务器进程一般运用端口80,在/etc/services文件中有这些注册了的端口地址。
关于TCP传输,传输节点间先要树立衔接,然后经过该衔接传输已排好序的报文,以确保传输的正确性,IP层中的代码用于完成网际协议,这些代码将 IP头增加到传输数据中,一起也把收到的IP报文正确的传送到TCP层或UDP层。TCP是一个面向衔接协议,而UDP则是一个非面向衔接协议,当一个 UDP报文发送出去后,Linux并不知道也不去关怀他是否成功地抵达了意图的主机,IP层之下,是支撑一切Linux网络运用的网络设备层,例如点到点协议(Point to Point Protocol,PPP)和以太网层。网络设备并非总代表物理设备,其间有一些(例如回送设备)则是朴实的软件设备,网络设备与规范的Linux设备不同,他们不是经过Mknod指令创立的,有必要是底层软件找到并进行了初始化之后,这些设备才被创立并可用。因而只有当启动了正确设置的以太网设备驱动程序的内核后,才会有/dev/eth0文件,ARP协议坐落IP层和支撑地址解析的协议层之间。
3、 网络通讯原理
一切的网络通讯就其完成技能能够分为两种,线路交流和包交流,核算机网络一般选用包交流,TCP运用了包交流通讯技能,核算机网络中所传输的数据,悉数都以包(Packet)这个单位来发送,包由”报头”和”报文”组成,结构如图2所示,在”报头”中记载有发送主机地址,接纳主机地址及与报文内容相关的信息等,在”报文”中记载有需求发送的数据,网络中的每个主机和路由器中都有一个路由寻址表,依据这个路由表,包就能够经过网络传送到相应的意图主机。
网络通讯中的一个十分重要的概念便是套接字(Socket),简略地说,套接字便是网络进程的ID,网络通讯归根到底是进程的通讯,在网络中,每个节点有一个网络地址(即IP地址),两个进程通讯时,首要要承认各自地点网络节点的网络地址,可是,网络地址只能承认进程地点的核算机,而一台核算机上或许一起有多个网络进程,还不能承认到底是其间的哪个进程,由此套接字中还要有其他的信息,那便是端口号(Port),在一台核算机中,一个端口一次只能分配给一个进程,即端口号与进程是一一对应的联系,所以,端口号和网络地址就能仅有地承认Internet中的一个网络进程。能够以为:套接字= 网络地址+端口号
体系调用一个Socket()得到一个套接字描绘符,然后就能够经过他进行网络通讯了。
套接字有许多品种,最常用的就有两种;流式套接字和数据报套接字。在Linux平别离称之为”SOCK_STREAM”和”SOCK_DGRAM)”他们别离运用不同的协议,流式套接字运用TCP协议,数据报套接字运用UDP协议,本文所运用的是流式套接字协议。
4、 网络通讯原理在文件传输程序规划中的运用
网络上的绝大多数通讯选用的都是客户机/服务器机制(Client/Server),即服务器供给服务,客户是这些服务的运用者,服务器首要创立一个Socket,然后将该Socket与本地地址/端口号绑定(Bind()),成功之后就在相应的Socket上监听(Listen()) 。当Accept()函数捕捉到一个衔接服务(Connect())恳求时,承受并生成一个新的Socket,并经过这个新的Socket与客户端通讯,客户端相同也要创立一个Socket,将该Socket与本地地址/端口号绑定,还需求指定服务器端的地址与端口号,随后向服务器端宣布 Connect(),恳求被服务器端承受后,能够经过Socket与服务器端通讯。
TCP是一种面向衔接的、牢靠的、双向的通讯数据流,说他牢靠,是因为他运用3段握手协议传输数据,并且在传输时选用”重传必定承认”机制确保数据的正确发送:接纳端收到的数据后要宣布一个必定承认,而发送端有必要要能承受到这个必定信号,不然就要将数据重发。在此原理根底之上,规划了依据Linux 操作体系下TCP/IP编程完成文件传输的实例。咱们选用客户机/服务器形式通讯时,通讯两边发送/接纳数据的作业流程如图3所示。
文件传输便是依据客户机/服务器模型而规划的,客户机和服务器之间运用TCP树立接连,因文件传输是一个交互式会话体系,客户机每次履行文件传输,都需求与服务器树立操控衔接和数据衔接,其间操控衔接担任传输操控信息、运用操控指令、客户机能够向服务器提出无限次的恳求,客户机每次提出的恳求,服务器与客户机树立一个数据衔接,进行实践的数据传输,数据传输结束后,对应的数据衔接被铲除,操控衔接仍然坚持,等候客户机宣布新的传输恳求,直到客户机吊销操控衔接,结束会话。
当进行文件传输时,首要向服务器宣布衔接恳求,服务器验证身份后,与客户端树立衔接,两边进入会话状况,这时只需客户端向服务器端宣布数据衔接恳求,树立起数据衔接后,两边就进入数据传输状况,数据传输结束后,数据衔接被吊销,如此循环反复,直到会话结束,然后完成将文件从服务器端传输至客户机端。
5、 文件传输程序规划流程
5.1 客户端的TCP运用程序流程
(1)先用Socket()创立本地套接口,给服务器端套接口地址结构赋值。
(2)用Connect()函数使本地套接口向服务器端套接口宣布树立衔接恳求,经3次握手树立TCP衔接。
(3)用Read()函数读取所要接纳的文件名以及寄存在内存里的文件内容。
(4)用Open()函数翻开客户端新树立的方针文件,假如没有树立,该函数会主动生成方针文件,等候寄存文件内容。
(5)最后用Write()函数将读取的文件内容寄存在新的方针文件中,以完成服务器端向客户端的文件传输。
(6)通讯结束,用Close()封闭套接口,中止接纳文件。
5.2 服务器端的TCP运用程序流程
(1)先用Open()函数翻开等候传输的可读文件;
(2)用Socket()创立套接口,并给套接口地址结构赋值;
(3)用Bind()函数绑定套接口;
(4)用Listen()函数在该套接口上监听恳求;
(5)用Accept()函数承受恳求,发生新的套接口及描绘字,并与客户端衔接;
(6)用Lseek()函数是为了在每次承受客户机衔接时,将用于读的源文件指针移到文件头;
(7)用Read()函数读取必定长度的源文件数据;
(8)最后用Write()函数将读取的源文件数据寄存在内存中,以便客户端读取;
(9)传输结束时,用Close()封闭一切进程,结束文件传输。
在文件传输过程中,很重要的一点是:当服务器端开端发送数据时,客户端要一起进行文件数据的接纳。假如客户端没有运转,服务器端会一向等候客户端发送恳求,当服务器源文件发送结束,则客户端也将源文件的数据彻底接纳,并生成新的方针文件,然后完成文件的网络通讯。
6、 结语
Linux操作体系在网络运用方面具有很强的开发潜力,一起Linux也是牢靠性、安全性十分高的体系,因而在依据TCP/IP网络通讯的研讨与开发中,一般选用Linux操作体系作为开发渠道。
本文是介绍依据Linux操作体系下TCP/IP网络通讯的实践运用首要用于文件的网络传输,处理了文件传输的功率问题,作为进一步完善,能够在文件传送的过程中,参加如身份验证、权限分配、文件加密等安全机制,确保一些重要文件在传送过程中不会呈现泄密的状况,该规划可广泛运用企业工作区域网中。
责任编辑;gt