当前位置:文档之家› 实验报告

实验报告

学号140411021404110714041101 TCP服务器与客户端设计院(系)名称:信息工程学院专业名称:网络工程学生姓名:李博文陆禹均陈可指导教师:潘莹哈尔滨学院2017年6月一、设计目的:1.理解客户端与服务器模型的工作原理。

2.掌握套接字的概念。

3.掌握TCP协议,基于TCP协议来设计此客户端/服务器程序。

4.通过设计面向连接的数据流传输服务程序,加深对面向连接的服务程序工作流程和基本框架的理解。

二、设计内容编写在java下的TCP服务器套接字程序,程序运行时服务器等待客户的连接,实现客户端与服务器的通信。

三、总体设计本实验的设计是基于TCP/IP协议的程序时,传输层使用TCP协议,它的最大特点是在通信之前要在客户和服务器之间先建立连接,在数据传输完成后要关闭连接,释放网络资源。

对于TCP协议,主要有以下特点:(1)TCP是面向连接的运输层协议。

应用程序在使用TCP协议之前,必须先建立TCP 连接。

在传送数据完毕后,必须释放已经建立的TCP连接。

(2)TCP提供可靠交付的服务。

通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达。

(3)TCP提供全双工通信。

TCP允许通信双方的应用进程在任何时候都能发送数据。

TCP连接的两端都设有发送缓存和接受缓存,用来临时存放双向通信的数据。

每一条TCP 连接只能有两个端点,每一条TCP连接只能是点对点的,即一对一的连接。

(4)面向字节流。

TCP中的“流”指的是流入到进程或从进程流出的字节序列。

每一条TCP连接有两个端点,这个端点就是套接字(socket),端口号拼接到IP 地址即构成了套接字,每一条TCP连接唯一地被通信两端的两个端点,即两个套接字所确定。

同一个IP地址可以有多个不同的TCP连接,而同一个端口号也可以出现在不同的TCP连接中。

TCP是面向连接的协议。

运输连接是用来传送TCP报文的。

TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的进程。

因此,运输连接就有三个阶段,即:连接建立、数据传送和连接释放。

运输连接的管理就是使运输连接的建立和释放都能正常的进行。

在TCP连接建立过程中要解决一下三个问题:(1)要使每一方能够确知对方的存在。

(2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项及服务质量等)。

(3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

TCP连接的建立采用客户服务器方式。

主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。

下图是TCP连接建立的过程。

客户A 服务器BCLOSEDSYN- SENTESTAB- LISHEDCLOSEDLISTENSYN-RCVDESTAB-LISHED 数据传送主机A运行的是TCP客户程序,而B运行TCP服务器程序。

最初两端的TCP进程都处于CLOSED状态。

A是主动打开连接,而B是被动打开连接。

B的TCP服务器进程先创建传输控制块TCB,准备接受客户进程的连接请求。

然后服务器进程就处于LISTEN状态,等待客户的连接请求。

如有,即做出响应。

A的TCP客户进程也是首先创建传输控制模块TCB,然后向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x。

SYN报文段不能携带数据,但要消耗掉一个序号。

这时,TCP客户进程进入SYN-SENT状态。

B收到连接请求报文段后,如同意建立连接,则向A发送确认。

在确认报文段中应把SYN位和ACK位都置1,确认号是ack=x+1,同时也为自己选择一个初始序号seq=y。

这个报文段也不能携带数据,但同样要消耗掉一个序号。

这时TCP服务器进程进入SYN-RCVD状态。

TCP客户进程收到B的确认后,还要向B给出确认。

确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,在这种情况下,下一个数据报文段的序号仍是seq=x+1。

这时,TCP连接已经建立,A进入ESTABLISHED状态。

当B收到A确认后,也进入ESTABLISHED 状态,这个过程就是三次握手。

数据传输结束后,通信双方都可释放连接。

现在A和B都处ESTABLISHED状态。

A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。

A把连接释放报文段首部的终止控制位FIN置1,其序号seq=u,它等于前面已传送过的数据的最后的一个字节的序号加1。

这时A进入FIN-WAIT-1状态,等待B的确认。

FIN报文段即使不携带数据,它也消耗掉一个序号。

B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1。

然后B就进入CLOSE-WAIT状态。

TCP服务器进程这时应停止高层应用进程,因而从A到B这个方向的连接就释放了,这时的TCP连接处于半关闭状态,即A已经没有数据要发送了,但B 若发送数据,A 仍要接收。

也就是说,从B 到A 这个方向的连接并为关闭,这个状态可能会持续一些时间。

A 收到来自B 的确认后,就进入FIN-WAIT-2状态,等待B 发出的连接释放报文段。

若B 已经没有要向A 发送的数据,其应用进程就通知TCP 释放连接。

这时B 发出的连接释放报文段必须使FIN=1。

假定B 的序号为w ,B 还必须重复上次已发送过的确认号ack=u+1。

这是B 就进入LAST-ACK 状态,等待A 的确认。

A 在收到B 的连接释放报文段后,必须对此发出确认。

在确认报文段中把ACK 置1,确认号ack=w+1,而自己的序号是seq=u+1。

然后进入到TIME-WAIT 状态。

要经过4分钟才能进入到CLOSED 状态,才能开始建立下一个新的连接,当A 撤销相应的传输控制块TCB 后,就结束了这次的TCP 连接。

这个过程就是TCP 连接释放过程的四次握手。

TCP 的连接释放采用四次握手机制。

任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后就进入半关闭状态。

当另一方也没有数据再发送时,则发送连接通知,对方确认后就完全关闭了TCP 连接。

如下图所示。

TCP 虽然是面向字节流的,但TCP 传送的数据单元却是报文段。

一个TCP 报文段分客户 A服务器B ESTAB-L ISHED FIN- WAIT-1 FIN- WAIT-2TIME- WAITCLOSEDESTAB-LISHEDCLOSE- WAITLAST- ACKCLOSED主动被动数据传送为首部和数据两部分,而TCP的全部功能都体现在它的首部中各字段的作用。

因此,只有弄清TCP首部各字段的作用才能掌握TCP的工作原理。

TCP报文段首部的前20个字节是固定的,后面有4n字节是根据需要而增加的选项。

因此TCP首部的最小长度是20字节。

如下图所示。

对于TCP报文段中的序号部分,它是占了4 字节,TCP是面向字节流的,在下一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始序号必须在连接建立时设置。

首部中的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。

例如,一报文段的序号字段值是301,而携带的数据共有100字节。

这就表明:本报文段的数据的第一个字节的序号是301,最后一个字节的序号是400。

显然,下一个报文段的数据序号应该从401开始。

对于确认号,是占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。

例如,B正确收到了A发送过来的一个报文段,其序号字段值是501,而数据长度是200字节,这表明B正确收到了A发送的到序号700为止的数据。

因此,B期望收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。

还有一个比较重要的部分就是校验和。

是占2个字节,校验和字段检验的范围包括首部和数据这两部分。

在计算校验和时,要在TCP报文段的前面加上12字节的伪首部。

伪首部的格式与UDP用户数据报的伪首部一样。

但应把伪首部第4个字段中的17改为6,把第5字段中的UDP长度改为TCP长度,接收方收到此报文段后,仍要加上这个伪首部来计算校验和。

TCP可靠传输的实现是已字节为单位的滑动窗口。

发送窗口是根据接收窗口设置的,但在同一时刻,发送窗口并不总是和接受窗口一样大。

这是因为通过网络传送窗口值需要经历一定的时间滞后。

发送方还可以根据网络当时的拥塞情况适当的减小自己的发送窗口值。

对不按序到达的数据是先临时存放在接受窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。

TCP要求接收方必须有累积确认的功能,这样可以减少传输开销。

接收方可以在合适的时候发送确认,也可以在自己有数据要发送时把确认信息顺便捎带上。

但是,接收方也不应该过分推迟发送确认,否则会导致发送方不必要的重传,这回浪费网络的资源。

其次,捎带确认实际上并不经常发生,因为大多数应用程序不同时在两个方向上发送数据。

四、详细设计本课程设计采用的是JAVA语言编制的,在JAVA中,客户端和服务器之间的通信编程一般是基于socket实现的。

Socket是两个实体之间进行通信的有效端点,通过socket 可以获得源IP地址和源端口、终点IP地址和终点端口,并创建一个能被多人使用的分布式应用程序,实现与服务器的双向自由通信。

本设计是一对多的socket通信,即一个服务器对应多个客户端,采用的方法是将socket对象放置在线程中,这样当每一个socket对象执行完任务后,只有包含该socket 对象的线程会终止,对其他线程没有任何影响。

服务器:服务器是用来接收客户端的各种信息的,并把信息传送回给客户端。

网络应用程序一般是以客户机/服务器的模型的方式工作的。

因特网是客户机/服务器模型的一个典型应用。

在这种工作方式中,一个服务器程序通常事先启动,并在一个熟知端口侦听对服务器的请求。

当客户机应用程序需要某种服务时,需向提供这种服务的服务器发出请求,服务器在接收到请求后,向客户机发出相应请求信息。

这样客户机应用程序和服务器程序之间便建立了通信连接 此后可以进行数据通信。

通信任务完成后需要关闭它们之间的通信连接。

客户端:开始设置一个新的socket,定义端口号为5500,连接到本机将输入数据流连接到socket上将数据输出流连接到socket上打印输入待求平方值,输入bye结束将输入数据流读入到缓存中进行一个while死循环读入用户的写入写到socket中写到socket中,清空缓存区,立即发送,从socket中读数据输入为bye?Y结束N 返回结果服务器线程:相当于服务器里面的socket的一个集合,执行一次,就运行一个socket 对象,当每一个socket对象执行完任务后,只有包含该socket对象的线程会终止,对其他线程没有任何影响。

相关主题