《计算机网络课程设计报告--利用Socket实现双机通信.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告--利用Socket实现双机通信.docx(15页珍藏版)》请在第一文库网上搜索。
1、课程设计报告20142015学年第一学期课程名称计算机网络设计题目利用Socket实现双机通信目录设计原理。理解TCP状态图。三、设计过程。四、流程图。五、源代码和运行结果。利用JavaSock实现双机通信摘要:SOCket(套接字)是一种基于TCP/IP的编程接口。它采用客户/服务器通信机制,使客户端和服务器端通过SOCket接口在网络上实现连接和数据交换。它提供了一系列系统调用,使用户可以方便地实现TCP和UDP等多种网络协议的通信。它使用户可以在网络协议上工作而不必对该网络协议有非常深入的了解。这样编写的程序可被迅速移植到任何支持Socket的网络系统中去。本文通过主要利用JaVaSoc
2、ket来实现双机通信,采用其中的TCP面向连接方式,实现文本数据的交换。并对JaVaSOCket的实现进行简单的分析和讲解,通过本文以达到对SoCket的原理又一个较清晰的认识。关键词:套接字、SOCketSerVer类、客户机/服务器模式设计原理1.1 套接字通信套接字(Socket)是网络通信的基本单元操作,又被称作端口,通常用来实现客户方向和服务器的连接。网上的两个程序通过一个双向的通信连接实现数据的交换,在实现双向通信前链路的每一个端都建立一个SoCket,通过对SoCket的读/写操作实现网络通信功能。套接字是网络通信的一个标准。套接字分为以下三种类型:(1)流套接字这是最常用的套接
3、字类型,TCP/IP协议中的TCP协议用此类接口,它提供面向连接的(建立虚电路),无差错的、发送先后顺序一致的,包长度不限和非重复的网络信包传输。(2)数据报套接字TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。(3)原始数据包套接字提供对网络下层通信协议的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或者用于协议教隐蔽的功能。所有SoCket通信程序的基本结构都是一样的,主要有创建SoCket、打开连接到SoCket的输入流和输出流、按
4、照一定的协议对SOCket进行读写操作。关闭SOCket这四个步骤,通过这四个步骤可以完成一般的SOCket通信。1. 2JavaSockets编程概述用JaVa语言编程实现SOCket通信,其原理与使用其他语言基本相同,不同之处是:(1)java是跨平台的编程语言,所以用java编写的SoCket通信程序可以工作在所有支持TCP/IP协议和java的软硬件平台上;(2)因为JaVa是面向对象的语言,所以在编程中需要使用一些与SoCket有关的系统类,其中用于实现流Socket的类主要有:InetAddreSS类,Socket类,ServerSocket类。InetAddress类的对象用来保
5、存IP地址,Socket类的对象用来创建Socket通信的客户端,SOCket通信的服务器端则有SerVerSOCket类的对象来实现,用上述几个类就可以很方便的生成用户自己的TCP/IP通信程序。这几个类都属于Java,net包,大部分用来处理网络操作的系统类都包含在这个包中,所以用JAVA编写程序是,一般要在程序开始部分用import语句加载这个包,以便引入这些类。用JAVA语言编写Socket程序的过程就是创建和定义Socket类和ServerSocket类的子类的过程。13与Sockets有关的Java类(1) InetAddreSS类:用来保存因特网上的IP地址的类,它含有很多成员变
6、量和方法,其中比较常用的有get1oca1Host,getByName和getA1IByName,利用它们都可以创建该类的对象,获得一个JaVa程序操纵、处理的IP地址。例如下面的程序段可以根据主机名获取其IP地址:tryInetAddressremoteOP=InetAddress.getByName(uwww.hpu.edu.CI);catch(UnknownHostExceptionexcpt)System,err.print1n(uUnknownhost:+excpt);(2) Socket类:用来实现TCP/IP通信的端口套接字类,所有希望通过socket来完成与远程主机进行TCP/
7、IP连接和通信的程序,都必须创建一个SOCket类的对象。这个类对象的作用首先是根据远程主机的IP地址和端口号在本地主机创建一个与远程主机的联接;其次,在连接建立后,本地主机程序就可以使用这个类对象提供的输入/输出通道与远程主机实现通信。当一个SoCket被创建时,它所指定的连接也将同时被建立并打开,若连接成功,调用这个socket对象的有关方法就可以实现与远程主机的读写通信操作;若连接失败,则构造函数会抛出例外,表示没有成功创建对象。(3) ServerSocket类它是java用来实现TCP/IP通信服务器端程序的主要机制。当一个ServerSocket对象被创建时,程序在本机的指定端口处
8、提供服务并开始监听可能的来自客户端的服务请求。当一个客户请求连接并被接受时,服务器程序将创建一个Socket对象与远程的客户机相连,实现读写通信操作。该类的accept()方法用来等待并接受客户机的一个连接,当这个方法被调用时,服务器进程或线程将处于阻塞状态,直至它监听到有一个客户进程提出服务请求,并与之成功连接,这时方法将返回一个新创建的服务器端的SOCket对象,这个对象已经与远程客户机连接成功,并可以与客户机的SOCket实现读写操作。若服务器可同时提供的连接数超过一个,则服务器程序应该创建一个新的线程来完成与客户机的通信,而保留原有监听线程继续准备接受其它客户机的服务请求。当SerVe
9、rSOCket对象要结束它在特定端口上提供的服务时,可以调用c1ose()方法实现。二.理解TCP状态图2.1、 TCP(传输控制协议)TCP(TransmissionContro1Protoco1传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,由IETF的RFC793说明(specified)oTCP在IP报文的协议号是6o2.2、 TCP功能概述编辑当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP
10、层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠1,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。在数据正确性与合法性上,TCP用一个校验和函数来检验数据是否有错误,在发送和接收时都要计算校验和;同时可以使用md5认证对数据进行加密。在保证可靠性上,采用超时重传和捎带确认机制。在流量控制上,采用滑动窗口协议,协议中规定,对于窗口内未经确认的分组需要重传。在拥塞控制上,采用广受好评的TCP拥
11、塞控制算法(也称A1MD算法)。该算法主要包括三个主要部分:1)加性增、乘性减;2)慢启动;3)对超时事件做出反应。22.3、 TCP的首部格式图下图所示:SourcePort是源端口,16位。TCP首部DestinationPort是目的端口,16位。SequenceNumber是发送数据包中的第一个字节的序列号,32位。Acknow1edgmentNumber是确认序列号,32位。 DataOffset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。 -标志位:6位,URG表示UrgentPointer字段有意义:ACK表示Acknow1edgmentNumber字段有意义
12、PSH表示PUSh功能,RST表示复位TCP连接SYN表示SYN报文(在建立TCP连接的时候使用)F1N表示没有数据需要发送了(在关闭TCP连接的时候使用)WindOW表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。 Checksum是校验和,16位。 UrgentPointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(SeqUenCeNUmber字段的值)的偏移。2.4、 TCP连接编辑TCP连接建立TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答。TCP的三次握
13、手SYN+ACK1,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。TCP三次握手的过程如下:客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。服务器端收到SYN报文,回应一个SYN(SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Estab1ished状态。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据To2TCP连接终止建立一个连接需要三次握手,而终止一个连接要经过四次握手,
14、这是由TCP的半关闭(ha1f-c1ose)造成的。具体过程如下图所示。i*4Nt科tHd)三、,二心常。在TCP的三次握手TCP连接的终止TCF连接的终止(1)某个应用进程首先调用C1oSe,称该端执行“主动关闭(activec1ose)。该端的TCP于是发送一个F1N分节,表示数据发送完毕。(2)接收到这个FIN的对端执行“被动关闭(PaSSiVeCIOse),这个FIN由TCP确认。注意:F1N的接收也作为一个文件结束符(end-of-fi1e)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,F1N的接收意味着接收端应用进程在相应连接上再无额外数据可接收。(3
15、)一段时间后,接收到这个文件结束符的应用进程将调用c1ose关闭它的套接字。这导致它的TCP也发送一个FIN。(4)接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FINo既然每个方向都需要一个FIN和一个ACK,因此通常需要4个分节。2注思:(1)“通常”是指,某些情况下,步骤1的F1N随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。(2)在步骤2与步骤3之间,从执行被动关闭一端到执行主动关闭一端流动数据是可能的,这称为“半关闭(ha1f-c1ose)。(3)当一个Unix进程无论自愿地(调用exit或从main函数返U)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FINo无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。TCP如何提供可靠性编辑TCP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁。在一个TCP