计算机网络TCP和UDP下文件传输功能要点.doc

上传人:牧羊曲112 文档编号:4089821 上传时间:2023-04-03 格式:DOC 页数:20 大小:161.50KB
返回 下载 相关 举报
计算机网络TCP和UDP下文件传输功能要点.doc_第1页
第1页 / 共20页
计算机网络TCP和UDP下文件传输功能要点.doc_第2页
第2页 / 共20页
计算机网络TCP和UDP下文件传输功能要点.doc_第3页
第3页 / 共20页
计算机网络TCP和UDP下文件传输功能要点.doc_第4页
第4页 / 共20页
计算机网络TCP和UDP下文件传输功能要点.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《计算机网络TCP和UDP下文件传输功能要点.doc》由会员分享,可在线阅读,更多相关《计算机网络TCP和UDP下文件传输功能要点.doc(20页珍藏版)》请在三一办公上搜索。

1、计算机网络课程报告考核内容: 文件发送/接受程序 专 业: 空间信息与数字技术 班 级: 姓 名: 学 号: 指导老师: 日 期: 一、题目要求 文件发送/接受程序 (1)分别利用UDP和TCP协议,实现通过网络连接在不同的主机之间传输一个文件的功能。 (2)分别测试UDP和TCP协议下,文件传输的完成时延和文件大小的关系,并绘图分析。二、问题分析该过程主要是建立服务器端和客户端,实现二者之间的文件传输以及文件传输的时间计算。程序的主要难点在于TCP和UDP协议的建立,UDP是一种不可靠的网络服务,负载比较小,而TCP则是一种可靠的通信服务,负载相对而言比较大。TCP采用套接字(socket)

2、或者端口(port)来建立通信。TCP给端口到端口通信提供了错误和流量控制机制,同时TCP还负责建立连接、处理终止和中断的端对端通信控制。 通常情况下我们认为TCP相比UDP具有更大的通信负载,UDP不具备TCP的控制特性,TCP用了大约20个字节来发送一个65Kbps的数据块,这个报头占整个数据块的比重也不过3%。总得来看,这个负载是合理的,何况还令通信具有了可靠性。 2.1、TCP协议 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输

3、协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接

4、收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到

5、确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 其主要过程为在一台PC上运行服务器端,监听来自其他PC上客户端的连接。客户端运行后通过程序内的服务器端的IP地址,向服务器端发送请求,通过三次握手协议后建立连接,客户端可以将本机上的文件(输入文件名即可)传送到服务器端并记录所花费时间,而服务器端也可以向客户端传回文件,并记录花费时间。2.2、UDP协议 UDP 是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,

6、IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天UDP仍然不失为一项非常实

7、用和可行的网络传输层协议。与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。 在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会

8、对接收结果产生太大影响。虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。2.3、TCP和UDP协议的区别 TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。 UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送

9、到网络上的一种机制。即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDO也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDO的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。 TCP充分实现爱呢了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接

10、的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。二者的具体区别如下:(1) TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 (2)TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付(3) TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP

11、电话,实时视频会议等)(4) 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信(5) TCP首部开销20字节;UDP的首部开销小,只有8个字节(6) TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道三、功能设计 3.1、TCP协议 3.1.1、其服务器端和客户端直接的关系主要如下图所示 Socket() Bind() Socket() Listen()Connect() Accept()Send()/recv()Send()/recv()CloseSocket()CloseSocket() 服务器 客户端 3.1.2、主要设计结构(1) 创建套接字

12、、绑定、监听、连接、接受连接 /创建TCP协议的套接字m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (SOCKET_ERROR = m_Socket)AfxMessageBox(Create Socket Error! , 0, 0); /绑定与监听SOCKADDR_IN addrSrv;addrSrv.sin_addr.s_addr = inet_addr(sIP);addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(Port);int ret = bind(m_Sock

13、et, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR);if (ret = SOCKET_ERROR)AfxMessageBox(Bind Socket Error!, 0, 0);/连接SOCKADDR_IN ServerAddr;ServerAddr.sin_addr.s_addr = inet_addr(ServerAddr_in);ServerAddr.sin_family = AF_INET;ServerAddr.sin_port = htons(ServerPort);int Result = connect(m_Socket, (struct soc

14、kaddr*)&ServerAddr, sizeof(struct sockaddr);if (SOCKET_ERROR = Result)AfxMessageBox(Connet Failed!);/接受连接SOCKADDR_IN ClientAddr;int len = sizeof(SOCKADDR_IN);SOCKET ClientSock = accept(m_Socket, (struct sockaddr*)&ClientAddr, &len);if (SOCKET_ERROR = ClientSock)AfxMessageBox(Accept Failed!);(2) 声明宏和

15、结构体 /声明套接字缓冲区和一次发送文件数据的缓冲区大小#defineSOCKET_BUFF80000/套接字缓冲区大小#definePACK_BUFF50000/数据包缓冲区大小/声明文件I/O缓冲区和最大文件路径长度#defineFILE_NAME_MAX100/文件路径最大长度#defineFILE_IO_BUFFPACK_BUFF/文件IO缓冲区/文件信息typedefstruct_FileInforu_longulFileLen;charsFileNameFILE_NAME_MAX;_FileInfor;/数据包typedefstruct_DataPackcharcType;/D为数

16、据M为文件信息intnPackLen;charsContentPACK_BUFF;/数据包缓冲区u_longnPosition;/数据在文件中的位置intnContentLen;/数据字节数_FileInforFileInfor;/文件信息_DataPack;(3)客户端/发送线程需要的全局变量char sPathFILE_NAME_MAX; /文件地址u_long FileByteCount; /文件大小SOCKET ClientSocket; 设置套接字发送缓冲区大小/设置套接字发送缓冲区int nBuf = SOCKET_BUFF;int nBufLen = sizeof(nBuf);i

17、nt nRe = setsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, nBufLen);if (SOCKET_ERROR = nRe)AfxMessageBox(setsockopt error!);/检查缓冲区是否设置成功nRe = getsockopt(ClientSock, SOL_SOCKET, SO_SNDBUF, (char*)&nBuf, &nBufLen);if (SOCKET_BUFF != nBuf)AfxMessageBox(检查缓冲区:setsockopt error!);测量文件大小并发送文件大小和名

18、称给客户端首先使用C库函数对源文件进行测量/得到文件地址LPTSTR lpPath = m_sPath.GetBuffer(m_sPath.GetLength();/打开文件FILE *File = fopen(lpPath, rb);if (NULL = File)AfxMessageBox(打开文件失败!);/测量文件大小char BuffPACK_BUFF;u_long ulFaceReadByte;FileByteCount = 0;fseek(File, 0, SEEK_SET);while (!feof(File)ulFaceReadByte = fread(Buff, 1, 1,

19、 File);FileByteCount += ulFaceReadByte;/关闭文件int nRe = fclose(File);if (nRe)AfxMessageBox(关闭文件失败!);/打包_DataPack Pack;Pack.cType = M;Pack.nPackLen = sizeof(Pack);/取得文件名ZeroMemory(Pack.FileInfor.sFileName, FILE_NAME_MAX);GetFIieNameFromPath(lpPath, Pack.FileInfor.sFileName);Pack.FileInfor.ulFileLen = F

20、ileByteCount;/发送数据包 文件大小和名称nRe = send(m_ClientSockFd.fd_array0, (char*)&Pack, Pack.nPackLen, 0);if (SOCKET_ERROR = nRe)AfxMessageBox(Send File Size Failed!);/线程准备全局变量strcpy(sPath, m_sPath);ClientSocket = m_ClientSockFd.fd_array0;/启动线程发送文件DWORD ID;m_hSendThread = CreateThread(0, 0, SendDataThrad, 0,

21、0, &ID);发送文件数据线程DWORD _stdcall CServerDlg:SendDataThrad(LPVOID LpP)/打开文件FILE *File = fopen(sPath, rb);if (NULL = File)AfxMessageBox(SendDataThrad中打开文件失败!);return 1;/设置文件缓冲区int nBuff = FILE_IO_BUFF;if (setvbuf(File, (char*)&nBuff, _IOFBF, sizeof(nBuff)AfxMessageBox(设置文件缓冲区失败!);/读取文件数据并发送u_long ulFlag

22、Count = 0; /记录读了多少数据u_long FaceReadByte = 0; /一次实际读取的字节数char sBuffPACK_BUFF;ZeroMemory(sBuff, PACK_BUFF);fseek(File, 0, SEEK_SET);while (!feof(File)FaceReadByte = fread(sBuff, 1, PACK_BUFF, File);/打包_DataPack DataPack;DataPack.cType = D;DataPack.nPackLen = sizeof(DataPack);DataPack.nContentLen = Fac

23、eReadByte;CopyMemory(DataPack.sContent, sBuff, FaceReadByte);DataPack.nPosition = ulFlagCount;/发送int nResult = send(ClientSocket, (char*)&DataPack, DataPack.nPackLen, 0);if (SOCKET_ERROR = nResult)AfxMessageBox(SendDataThrad中发送数据失败!);elseulFlagCount += FaceReadByte; /记录发送字节数AfxMessageBox(发送结束);/关闭in

24、t nRe = fclose(File);if (nRe)AfxMessageBox(SendDataThrad中关闭文件失败!);return 0;(4) 服务器端 /接收线程用的全局变量_FileInfor FileInfor; /文件信息u_long ulWriteByte; /记录总共写入的字节char lpPathFILE_NAME_MAX; /文件路径char sFilePathAndNameFILE_NAME_MAX; /完整的文件路径设置套接字接收缓冲区大小/设置套接字接收缓冲区int nBuf = SOCKET_BUFF;int nBufLen = sizeof(nBuf);

25、SOCKET ClientSock = m_Sock.GetSocket();int nRe = setsockopt(ClientSock, SOL_SOCKET, SO_RCVBUF, (char*)&nBuf, nBufLen);if (SOCKET_ERROR = nRe)AfxMessageBox(setsockopt error!);/检查缓冲区是否设置成功nRe = getsockopt(ClientSock, SOL_SOCKET, SO_RCVBUF, (char*)&nBuf, &nBufLen);if (SOCKET_BUFF != nBuf)AfxMessageBox(

26、检查缓冲区:setsockopt error!);(接收文件信息和文件数据线程DWORD _stdcall CClientDlg:ReceiveDataPro(LPVOID LpP)CSocket_Win32 *pCSock = (CSocket_Win32*)LpP;u_long ulWriteByteCount = 0;while (1)_DataPack DataPack;ZeroMemory(&DataPack, sizeof(DataPack);if (!(*pCSock).Receive(&DataPack, sizeof(DataPack)AfxMessageBox(Receiv

27、e DataPack Failed!);/判断数据包类型if (M = DataPack.cType) /包为文件信息/接收文件信息FileInfor.ulFileLen = DataPack.FileInfor.ulFileLen; /获取文件长度strcpy(FileInfor.sFileName, DataPack.FileInfor.sFileName); /获取文件名称/得到文件目录char sFilePathFILE_NAME_MAX;ZeroMemory(sFilePath, FILE_NAME_MAX);strcpy(sFilePath, lpPath);strcat(sFil

28、ePath, FileInfor.sFileName);strcat(sFilePathAndName, sFilePath); /保存完整的文件路径/创建文件SECURITY_ATTRIBUTES attr;attr.nLength = FileInfor.ulFileLen;attr.lpSecurityDescriptor = NULL;HANDLE hRe = CreateFile(sFilePath, GENERIC_WRITE, FILE_SHARE_WRITE, &attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);if (INVALID

29、_HANDLE_VALUE = hRe)AfxMessageBox(创建文件失败!);bool bRe = :CloseHandle(hRe);/可以开始接受文件bIsStartReceive = true;else if (D = DataPack.cType) /包为文件数据/打开文件char sPathFILE_NAME_MAX;strcpy(sPath, sFilePathAndName);FILE *File = fopen(sPath, ab);if (0 = File)AfxMessageBox(打开文件失败!);/设置文件缓冲区int nBuff = FILE_IO_BUFF;

30、if (setvbuf(File, (char*)&nBuff, _IOFBF, sizeof(nBuff)AfxMessageBox(设置文件缓冲区失败!);/定位文件u_long nPosition = DataPack.nPosition;int nRe = fseek(File, nPosition, SEEK_SET);if (nRe)AfxMessageBox(SendDataThrad中定位失败!);/写文件u_long nNumberOfBytesWritten = fwrite(&DataPack.sContent, 1, DataPack.nContentLen, File

31、);if (DataPack.nContentLen != nNumberOfBytesWritten)AfxMessageBox(写文件失败!);elseulWriteByteCount += nNumberOfBytesWritten;fflush(File); /清除文件缓冲区/关闭文件nRe = fclose(File);if (nRe)AfxMessageBox(关闭文件失败!);if (ulWriteByteCount = FileInfor.ulFileLen)AfxMessageBox(接收结束);break;return 0;3.2、UDP协议 UDP和TCP的大致过程一致,

32、客户端向服务器端发送文件不需经过三次握手协议,直接根据客户端的服务器IP地址向服务器端传输文件。(1) 服务器端过程 #include stdafx.h#include #include #pragma comment(lib, ws2_32.lib) int main(int argc, char* argv)WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 2);if (WSAStartup(sockVersion, &wsaData) != 0)return 0;SOCKET serSocket = socket(AF_INET, SOCK_D

33、GRAM, IPPROTO_UDP);if (serSocket = INVALID_SOCKET)printf(socket error !);return 0;sockaddr_in serAddr;serAddr.sin_family = AF_INET;serAddr.sin_port = htons(8888);serAddr.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr) = SOCKET_ERROR)printf(bind error !);cl

34、osesocket(serSocket);return 0;sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);while (true)char recvData255;int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);if (ret 0)recvDataret = 0x00;printf(接受到一个连接:%s rn, inet_ntoa(remoteAddr.sin_addr);printf(recvData);c

35、har * sendData = 一个来自服务端的UDP数据包n;sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);closesocket(serSocket);WSACleanup();return 0; (2) 客户端过程 #include stdafx.h#include #include #pragma comment(lib, ws2_32.lib) int main(int argc, char* argv)WORD socketVersion = MAKEWORD

36、(2, 2);WSADATA wsaData;if (WSAStartup(socketVersion, &wsaData) != 0)return 0;SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = inet_addr(127.0.0.1);int len = sizeof(sin);char * sendData = 来自客户端的数据包

37、.n;sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);char recvData255;int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);if (ret 0)recvDataret = 0x00;printf(recvData);closesocket(sclient);WSACleanup();return 0;四、功能实现4.1、TCP功能实现首先打开服务器端然后在其他PC上打开客户端和客户端连接结果客户端向服

38、务器端发送文件服务器端接收文件4.2、UDP功能实现打开服务器端然后打开客户端向服务器端发送文件服务器端接收文件五、 数据分析选择5个大小不同的文件,分别用UDP和TCP进行传输测试,记录下各自时延,并绘制下图结果,总体来看,TCP比UDP所花费的时间要多。六、 总结和感受 此次课程设计主要是根据上机实习任务演化而来,只是将”一段语句“改为了“文件”,在实习过程中大多数都是利用一台主机进行数据测试,而此次需利用网络连接进行多台主机之间的文件传输。总之,利用实习过程中的套接字编程和ping程序连接的编程经验,此次课程设计就较为简洁了。报告的编写是对计算机网络知识的总结,也是我们学习成果的展现,在

39、文件传输过程,也进一步理解了TCP和UDP协议下文件传输的特性,也理解了TCP和UDP之间的关系和区别,在学习之前,一直不理解网络上联系,通过这门课程的学习,使得网络关系更加地清晰展现在我们面前。而对于UDP和TCP协议,二者都具有很多优缺点,在平时的编程过程中,要学会多种知识的综合利用,取长补短,将二者的优点结合,从而达到软件的完美以及全面。例如,日常生活中所用的QQ,就结合TCP和UDP协议二者的综合特点,消息的直接、快速,以及文件传输的安全。这些特点值得我们去认真理解和学习,学习不是一味的专一死板,要学会综合、大胆创新,这样才能让我们进步。 目录一、题目要求1二、问题分析12.1、TCP协议12.2、UDP协议22.3、TCP和UDP协议的区别3三、功能设计43.1、TCP协议43.1.1、其服务器端和客户端直接的关系主要如下图所示43.1.2、主要设计结构43.2、UDP协议11四、功能实现134.1、TCP功能实现134.2、UDP功能实现16五、 数据分析17六、 总结和感受18

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号