Tcp和Udp通信Linux系统开发实验分析报告
- 格式:docx
- 大小:1.92 MB
- 文档页数:25
TCP和UDP客户端及服务器端实验报告一、原理1.基于TCP协议的服务器端程序流程:1)创建套接字(socket)2)绑定套接字(bind)3)将套接字设为监听,准备接收客户请求(listen)4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)5)用返回的套接字与客户端进行通信(send/recv)6)返回,等待另一客户请求7)关闭套接字2.基于TCP协议的客户端程序流程1)创建套接字(socket)2)向服务器发出连接请求(connect)3)和服务器端进行通信(send/recv)4)关闭套接字在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。
3.基于UDP的服务器端编写1)创建套接字(socket)2)绑定(bind)3)等待接收数据(recvfrom)4)关闭套接字4.基于UDP的客户端编写1)创建套接字(socket)2)向服务器发送数据(sendto)3)关闭套接字在所有的套接字编程中第一步都是加载套接字库(WSAStartup)对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。
TCP代码实现:首先要建两个工程,不妨设为tcpsrv和tcpclient,分别为客户端和服务器端tcpsrv.cpp//TCP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(){SOCKET serversoc;SOCKET clientsoc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((serversoc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if(bind(serversoc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Bind fail!\n");return -1;}//start listen, maximum length of the queue of pending connections is 1printf("Start listen...\n");if(listen(serversoc, 1) != 0){printf("Listen fail!\n");return -1;}len = sizeof(SOCKADDR_IN);//waiting for connectingif((clientsoc = accept(serversoc, (SOCKADDR *)&clientaddr, &len))<=0) {printf("Accept fail!\n");return -1;}printf("Connected\n");while(1){//waiting for data receiveif(recv(clientsoc, buf, BUFLEN, 0) <= 0){//some error occurprintf("Close connection\n");closesocket(clientsoc);break;}printf("%s\n",buf);}WSACleanup(); //clean up Ws2_32.dllreturn 0;}相应的客户端程序,tcpclient.cpp//TCP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(){SOCKET soc;SOCKADDR_IN serveraddr;SOCKADDR_IN clientaddr;unsigned char buf[1024];WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a processif((soc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <= 0)//create a tcp socket {printf("Create socket fail!\n");return -1;}serveraddr.sin_family = AF_INET;serveraddr.sin_port = htons(9102);serveraddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//connect to serverprintf("Try to connect...\n");if(connect(soc, (SOCKADDR *)&serveraddr, sizeof(serveraddr)) != 0){printf("Connect fail!\n");return -1;}printf("Connected\n");while(1){scanf("%s", buf);//send to serverif(send(soc, buf, strlen(buf)+1, 0)<=0){printf("Error!\n");}}WSACleanup(); //clean up Ws2_32.dllreturn 0;}UDP服务器端://UDP server//listen port 9102//receive string and display it//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;char buf[BUFLEN];int len;WSADATA wsa;WSAStartup(MAKEWORD(1,1),&wsa);//initial Ws2_32.dll by a process memset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_port = htons(9102);addr.sin_addr.s_addr = htonl(INADDR_ANY);if(bind(soc,(struct sockaddr *)&addr,sizeof(struct sockaddr))!=0){printf("Bind fail!\n");return -1;}len = sizeof(addr);printf("start listen...\n");while(1) {recvfrom(soc, buf, BUFLEN, 0,(struct sockaddr*)&addr, &len);printf("%s\n",buf);}WSACleanup(); //关闭return 0;}客户端://UDP client//client send string to server//Visual C++ 6.0#include <stdio.h>#include <winsock2.h>#pragma comment(lib,"ws2_32.lib")#define BUFLEN 1024int main(void){SOCKET soc;SOCKADDR_IN addr;unsigned char buf[BUFLEN];WSADATA wsa;WSAStartup(MAKEWORD(2,2),&wsa);//initial Ws2_32.dll by a processmemset(&addr, 0, sizeof(addr));if((soc = socket(AF_INET,SOCK_DGRAM,0)) <= 0){printf("Create socket fail!\n");return -1;}addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr("127.0.0.1");addr.sin_port = htons(9102);bind(soc,(struct sockaddr *)&addr,sizeof(addr));while(1) {scanf("%s", buf);sendto(soc, buf, strlen(buf)+1, 0, (struct sockaddr *)&addr, sizeof(addr));}WSACleanup();//clean up Ws2_32.dllreturn 0;}。
《计算机网络》课程综合实验报告之TCP/UDP服务器端和客户端程序设计院系:信息工程学院专业:电子信息工程姓名:荆林风学号:20142410232一、实验目的学习和掌握Linux环境下的TCP和UDP通信服务器和客户端的基本编程方法和运行机制,掌握TCP/UDP报文段的通信过程。
二、实验平台win10操作系统下VMware Workstation工作环境下linux虚拟机,ubuntu操作系统三、实验内容1..编写Linux下TCP/UDP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址、端口号,并向客户端发送字符串。
2.编写Linux下TCP/UDP客户端套接字程序,结合实验一的服务器端程序,实现以下功能:1客户根据用户提供的IP地址连接到相应的服务器;2服务器等待客户的连接,一旦连接成功,则显示客户的IP 地址、端口号,并向客户端发送字符串;3客户接收服务器发送的信息并显示。
四、实验原理使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如图1.1所示。
1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。
-----------------------------------------------------------------#include<sys/socket.h>int socket(int family,int type,int protocol);返回:非负描述字---成功-1---失败-----------------------------------------------------------------第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。
实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013年 5 月30日目录实验目的和内容ﻩ错误!未定义书签。
实验目的ﻩ错误!未定义书签。
实验内容ﻩ错误!未定义书签。
实验环境ﻩ错误!未定义书签。
程序的逻辑框图ﻩ错误!未定义书签。
UDP通信程序的逻辑框图:ﻩ错误!未定义书签。
TCP通信程序的逻辑框图:ﻩ错误!未定义书签。
程序源代码(数据结构的描述、核心算法)ﻩ错误!未定义书签。
1.TCP通信程序源代码............................................. 错误!未定义书签。
2.TCP通信程序数据结构的描述ﻩ73.TCP通信程序的核心算法ﻩ错误!未定义书签。
4.UDP通信程序源代码.................................................. 错误!未定义书签。
5.UDP通信程序数据结构的描述.................................. 错误!未定义书签。
6.UDP通信程序的核心算法.......................................... 错误!未定义书签。
实验数据、结果分析.................................................................... 错误!未定义书签。
TCP通信程序实验结果分析ﻩ错误!未定义书签。
UDP通信程序实验结果分析......................................... 错误!未定义书签。
总结................................................................................................ 错误!未定义书签。
实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。
实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013 年 5 月30 日目录实验目的和内容 (1)实验目的 (1)实验内容 (1)实验环境 (2)程序的逻辑框图 (2)UDP通信程序的逻辑框图: (2)TCP通信程序的逻辑框图: (3)程序源代码(数据结构的描述、核心算法) (4)1.TCP通信程序源代码 (4)2.TCP通信程序数据结构的描述 (7)3.TCP通信程序的核心算法 (7)4.UDP通信程序源代码 (8)5.UDP通信程序数据结构的描述 (11)6.UDP通信程序的核心算法 (12)实验数据、结果分析 (13)TCP通信程序实验结果分析 (13)UDP通信程序实验结果分析 (14)总结 (16)实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。
实验内容1.实现控制台模式下,在单机上基于UDP的聊天程序;2.实现控制台模式下,在单机上基于TCP的聊天程序;3.上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。
实验环境在win7系统下,visual studio 2008环境下的win32平台下程序的逻辑框图UDP通信程序的逻辑框图:Server端:Client端:TCP通信程序的逻辑框图:Server端:程序源代码(数据结构的描述、核心算法)1.TCP通信程序源代码Client端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){char rbuf[256];char szText[256];InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//判断socket是否创建成功if(sListen == INVALID_SOCKET){printf("Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in sin;sin.sin_family = AF_INET; //IP协议sin.sin_port = htons(4567); //端口号sin.sin_addr.S_un.S_addr = INADDR_ANY; //接收任何IP的连接//绑定函数,将socket 与IP地址和端口绑定在一块if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("Failed bind() \n");return 0;}//开始监听,第二个参数表示最大连接数if(listen(sListen, 2) == SOCKET_ERROR){printf("Failed listen() \n");return 0;}//定义一个新的变量sockaddr_in remoteAddr;int nAddrLen = sizeof(remoteAddr);//用于存储连接客户端的socketSOCKET sClient;//accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP 和端口号存在remoteAddr中sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);printf("接收到一个连接%s \r\n", inet_ntoa(remoteAddr.sin_addr));while(TRUE){if(sClient == INVALID_SOCKET){printf("Failed accept()");continue;}printf("send:");scanf("%s",szText);//发送函数,往sClient这个socket中发送szTextsend(sClient, szText, strlen(szText), 0);//recv为阻塞函数,等待sClient中传来数据int nRecv = recv(sClient, rbuf, 256, 0);if(nRecv>0){rbuf[nRecv] = '\0';printf("receive:%s\n", rbuf);}}closesocket(sClient);closesocket(sListen);WSACleanup();return 0;}Server端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer = 2, BYTE majorVer = 2){WSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer, majorVer);if(WSAStartup(sockVersion, &wsaData) != 0)exit(0);return 1;}int main(){InitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf(" Failed socket() \n");return 0;}//用于存储IP地址和端口号的变量sockaddr_in servAddr;servAddr.sin_family = AF_INET;servAddr.sin_port = htons(4567); //要连接的端口号servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//要连接的IP地址//连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到if(connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){printf(" Failed connect() \n");return 0;}char buff[256];char szText[256];while(true){//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数int nRecv = recv(s, buff, 256, 0);if(nRecv > 0){buff[nRecv] = '\0';printf("receive:%s\n", buff);}printf("send:");scanf("%s",szText);//发送函数,往s这个socket中发送szText这个字符串send(s, szText, strlen(szText), 0);}closesocket(s);WSACleanup();return 0;}2.TCP通信程序数据结构的描述(1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_in remoteAddr;和servAddr(2)用于存储连接客户端的socket:SOCKET sClient;和用于存储连接服务器的socket:SOCKET s3.TCP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度, 之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect( ) 和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用:send( )和recv( ) (或read( )和write( ))来发送和接收数据;最后,待数据传送结束后,双方调用closesocket() 关闭套接口。
计算机科学与技术系实验(项目)报告一、基本信息二、目的与要求目的:通过实验掌握Linux环境下基于TCP套接字编程的基本步骤和方法。
要求:1.掌握网络编程的基本框架;2.了解客户端、服务器的基本概念;3.掌握TCP套接字编程的基本流程及程序的调试方法。
三、完成实验(项目)过程和效果内容:1.程序结构设计;2.程序数据设计;3.程序基本流程;4.编码、调试及运行。
server代码:client代码:步骤:1.程序结构设计1)服务器端结构先启动,进行socket、bind、listen、accept、一系列准备工作,然后如果没有建立连接,则服务器处于阻塞状态,等待客户端连接。
2)客户端结构。
客户端启动后,首先向服务器端发起建立连接的请求,得到同意后,连接建立成功,客户端和服务器端开始进行数据通信,客户机完成通信工程后释放链接,关闭套接字。
2.程序数据设计1)服务器端相关数据:监听套接字描述符、连接套接字描述符int sockfd,client_fd;服务器端地址struct sockaddr_in my_addr客户端地址struct sockaddr_in remote_addr2)客户端相关数据套接字描述符int sockfd;服务器端地址结构struct sockaddr_in serv_addr;保存接收到的数据char buf[MAXDATASIZE];接收的数据字符int recvbytes;3.程序基本流程图。
四、知识应用以及经验总结1.编写UDP通信程序?基于UDP协议进行通信不同于TCP,UDP套接字通讯方式是一种面向无连接的通信工程,通信双方不必建立连接即三次握手。
指定IP即可通信,但不可靠。
2.监听套接字和连接套接字的区别?监听套接字,用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。
当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
实验四TCP/UDP协议分析【实验目的】1、理解与掌握TCP协议2、UDP协议通信机制【预习要求】1、复习课堂上所学习的TCP协议、UDP协议方面基本知识。
【工具软件】协议解码工具:wireshark(或sniffer pro)【实验原理】(一)TCP说明:(1)每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。
这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接。
(2)序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。
(3)当建立一个新连接时,SYN标志变1。
序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节的序号为这个ISN加1,因为SYN标志使用了一个序号。
(4)既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。
因此,确认序号应当时上次已成功收到数据字节序号加1。
只有ACK标志为1时确认序号字段才有效。
(5)发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP 首部的一部分。
因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
(6)TCP为应用层提供全双工的服务。
因此,连接的每一端必须保持每个方向上的传输数据序号。
(7)TCP可以表述为一个没有选择确认或否认的华东窗口协议。
因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节。
当前还无法对数据流中选定的部分进行确认。
(8)首部长度需要设置,因为任选字段的长度是可变的。
TCP首部最多60个字节。
(9)6个标志位中的多个可同时设置为1◆URG-紧急指针有效◆ACK-确认序号有效◆PSH-接收方应尽快将这个报文段交给应用层◆RST-重建连接◆SYN-同步序号用来发起一个连接◆FIN-发送端完成发送任务(10)TCP的流量控制由连接的每一端通过声明的窗口大小来提供。
任务一:用Wireshark观察TCP连接的建立、使用和释放过程思考作业:a)浏览器进程的IP地址和端口号是什么?IP地址:192.168.209.44 端口号:3003b)服务器端进程的IP地址和端口号是什么?IP地址:128.119.245.12 端口号:80c)如何识别连接建立时的SYN报文,它的sequence序号值是多少?该TCP报文是从哪台主机发送出去的?通过查看图标中的中间绿色行,点显示SYN的箭头,可以识别。
Sequence序列号:0该TCP报文是从IP地址为192.168.209.44的主机发送出去d)如何识别SYN的确认报文,即SYN ACK,它是有哪台主机发送的?它的seqence序号值是什么?对SYN报文的确认号值是什么?确认后有什么样的含义?通过查看图标中的中间绿色行,点显示SYN ACK的箭头,可以识别。
它是从IP地址为128.119.245.12的主机发送的它的seqence序列号为0对SYN报文的确认号码为:1含义:1.表示已经受到报文2.表示愿意接受的下一个报文的序号e)观察前3个数据帧,它们是与TCP连接建立相关的数据,分析这些数据在TCP首部中的特点?确认TCP连接过程中协商的参数有哪些?TCP连接过程中的协商的参数有:源端口、目标端口、序号(Seq) 确认号(ACK)前提:观察TCP报文的可靠通信机制。
从第4个TCP报文开始(连接建立后的第一个),连续观察5个TCP报文的内容。
回答以下问题:a)每个TCP报文的长度值是多大?它们的最大值是多少?是否有确定依据?每个TCP报文的长度为617、0、1408、1408、1408。
他们的最大值为1408。
有确定依据。
b)每个TCP报文的序号值是什么?是否是连续变化?TCP报文的序号值:1 、618、1、2026、3434是连续变化的呈现不断增长的趋势c)每个TCP报文的确认号是什么?它的作用是什么?TCP报文的确认号:1、1、618、1、1它的作用:确认号表示愿意接受的下一个报文的序号,并表示成功接受该报文d)每个TCP报文首部中的Windows size是什么含义? 它的作用是什么?Windows size 是窗口大小的意思作用:TCP报文的流量控制由连接的每一端通过声明的窗口大小来提供e)连续的5个TCP报文是否有重传的现象?在此次跟踪中有重传的报文段。
TCP_UDP通信过程学习及实验报告[五篇]第一篇:TCP_UDP通信过程学习及实验报告1.当两台计算机分别和中继器、二层交换机、三层交换、路由器相连时,请分别画出计算机与交换设备五层参考模型;计算机A应用层计算机B应用层传输层传输层网络层网络层数据链路层数据链路层中继器物理层物理层物理层计算机A应用层计算机B应用层传输层传输层网络层二层交换机数据链路层网络层数据链路层数据链路层物理层物理层物理层计算机A应用层计算机B应用层传输层三层交换机网络层传输层网络层网络层数据链路层数据链路层数据链路层物理层物理层物理层计算机A应用层计算机B应用层传输层路由器网络层传输层网络层网络层数据链路层数据链路层数据链路层物理层物理层物理层2.学习SOCKET编程,写出TCP、UDP通信流程;将实例程序两个同学一组,实现两台计算机之间通信。
并写出学习报告;(a)TCP通信流程准备阶段:服务器程序首先进行初始化操作:(1)调用socket创建一个套接字(2)函数bind将这个套接字与服务器公认地址绑定在一起(3)函数listen将这个套接字转换成倾听套接字(listening socket)(4)调用函数accept来接受客户机的请求。
客户机程序初始化操作:(1)客户机调用函数socket创建一个套接字(2)调用函数connect 来与服务器建立连接。
连接建立之后,客户机与服务器通过读(read())、写(write())套接字来进行通信。
如下图:服务器端SocketTCP通信流程客户端bindSocketListenconnectwritesendsendwritecloseclose(b)UDP通信流程准备阶段:服务器程序首先进行初始化操作:(1)调用socket创建一个套接字(2)函数bind将这个套接字与服务器公认地址绑定在一起客户机程序初始化操作:(1)客户机调用函数socket创建一个套接字客户机与服务器通过读(sendto())、写(recvfrom())套接字来进行通信。
一、实验目的1. 深入理解TCP 原理,掌握连接状态控制、可靠传输等重要机制;2. 为应用层提供网络编程接口,即socket 接口。
二、实验要求1. 理解TCP 的主要原理,针对客户端角色的、“停-等”模式的TCP,设计接收和发送流程。
2. 编程实现TCP 段的接收流程,重点是段接收的有限状态机3. 编程实现TCP 段的发送流程,完成TCP 段的封装处理。
4. 编程实现客户端Socket 接口函数三、编程实现1. 停-等协议的实现停-等协议主要体现在stud_tcp_send()函数和stud_tcp_recv()和函数中。
实现的主要思路是:a) 调用stud_tcp_send()发送一个数据包时,直到收到ack 包并把ack 交给stud_tcp_input()处理才退出b) 调用stud_tcp_recv()接收一个数据包成功后,紧接着发送一个相应的ack 包才退出上述两个设计保证了发送和接收窗口大小为12. 接收流程的有限状态机首先检查校验和与序号是否正确, 惟独当这两者都无误之后 才进入状态机部份。
状态机基于 switch 结构实现, 根据当前 TCB 的状态分情形讨 论状态的变化。
处理流程如下3. 发送时的封装和有限状态机a) 查看当前的 TCB 是否为空,为空则创建当前的 TCBb) 封装数据拷贝数据设置源端口和目的端口设置包序列和 ack 序号设置包头长度设置 flag设置 windowsize 和 urgentPointerc) 改变状态i . ii . iii . iv . v .vi .d) 变换字节序将字节序从本地序变成网络序4. 各接口函数的实现a) stud_tcp_socket()b) stud_tcp_connect()c) stud_tcp_send()d) stud_tcp_recv()e) stud_tcp_close()5. 校验和的计算与IP 包的校验类似,但是要求对伪首部进行校验伪首部由以下部份组成:a) 32 位IP 源地址b) 32 位IP 目的地址c) 8 位填充位(全0)d) 8 位协议号e) 16 位TCP 头部长度四、实验遇到的问题1. 校验和的计算问题难点在于理解伪首部的结构和作用。
《计算机网络》实验报告题目实验4 TCP/UDP协议分析实验成绩学院名称信息学院专业班级计科12-2班学生姓名冯婷学号 ************指导教师张维玉二○一五年 6月 1 日一、实验目的● 理解TCP协议包格式和工作原理,如TCP建链拆链的三次握手机制和捎带应答机制等;● 理解UDP协议包格式;二、实验内容● ftp 应用系统通信过程中TCP协议分析;● net send应用系统通信过程中UDP 协议分析。
三、实验原理、方法和手段(1)UDP报文格式UDP(3)TCP连接建立三次握手过程四、实验条件(1)报文捕获工具Wireshark协议分析软件;(2)应用协议环境每个学生机的PC机(安装Windows xp 操作系统)处于同一个LAN,远程登录Ftp服务器(ftp://210.44.144.89 、用户名/密码均为:student )。
(3)学员分组一人一组。
连接建立三次握手机制Host AHost BSYN=1, Seq_no = xSYN=1, Seq_no = y, ACK=1, Ack_no = x+1Seq_no = x+1, ACK=1, Ack_no = y+1五、实验步骤(1)TCP协议分析● 主机A(IP地址为A.A.A.A)与主机B(IP地址为B.B.B.B)属于同一个子网内的两台计算机;● 在主机A上启动报文捕获工具,指定源IP地址为主机A的地址,目的IP地址为主机B的地址,分析开关为TCP协议;● 从主机A上向远程FTP服务器发起FTP连接并登录(建议在命令行状态下链接FTP服务器),并将A机的一个文件传输到FTP服务器上,然后退出ftp,捕获通信过程中的TCP数据包,记录并分析各字段的含义,重点理解TCP协议连接建立与拆除的握手过程,并与TCP数据包格式进行比较;表3:FTP 通信过程中的TCP包格式(2)UDP 协议分析● 主机A(IP地址为A.A.A.A)与主机B(IP地址为B.B.B.B)属于同一个子网内的两台计算机;● 在主机A上启动报文捕获工具,指定源IP地址为主机A的地址,目的IP地址为主机B的地址,分析开关为UDP协议;● 在主机A的DOS仿真环境下,运行net send 命令向主机B发送一个UDP消息(格式:net send 主机名消息内容),捕获UDP数据包,记录并分析各字段的含义,并与UDP数据包格式进行比较;(注意:必须启动Messenger信使服务,方法:点击“控制面板-性能和维护-管理工具-服务”,找到Messenger并启动它)● 在主机A的DOS仿真环境下,运行net send 命令向本机所在工作组中所有主机发送一个UDP消息(格式:net send * 消息内容),捕获UDP数据包,记录并分析各字段的含义,并与UDP数据包格式进行比较;表4:UDP报文格式(1)ICMP 报文格式(2)IP 报文格式六.思考题在两次TCP协议通信过程中,发送序列号是连续的吗,为什么在每次通信时发送序列号不从0开始编号呢?初始序列号都是随机数开始的,因为如果都是从0开始,那么就很容易进行伪造,方便黑客进行攻击。
udp实验结果及分析实验报告课程名称课程名称《数据库技术》学生姓名某某某学号某某某某某某某某专业班级电子信息工程指导教师成绩2015年6月8日实验名称: 基于UDP的文件传输1.实验目的熟练掌握Socket编程;分析UDP与TCP的异同。
2.实验设备和条件硬件环境:PC机操作系统:Windows或者Linux语言环境: VisualC++,VS,GCC,Java均可3.实验要求参考TCP文件传输demo,基于UDP实现end.mp3文件的传输,并测试接收到的文件与发送的文件是否一致。
请各位同学于第15周星期三或星期四上课时将纸质版(双面打印)上交!4.实验内容:测试数据与实验结果(可以抓图粘贴)(1)发送端代码。
#include"tdafx.h"#include<Winock2.h>#include <stdio.h>#defineMAX_LENGTH1024int _tmain(int argc,_TCHAR*argv[]){WORDwVerionRequeted;WSADATA wsaData;wVerionRequeted= MAKEWORD(2, 2);if(WSAStartup(wVersionRequested, &waData)!=0)//初始化w2_32.dll动态库{printf("WSAStartup()failed!\n");//Winock初始化错误exit(-1);}if (waData.wVerion!=wVerionRequeted){printf("TheverionofWinockinotuited!\n");//Win ock版本不匹配WSACleanup();//结束对ws2_32.dll的调用exit(-2);}//说明w2_32.dll正确加载printf("Loadw2_32.dll succesfully!\n");//创建套接字SOCKETervock;printf("CreateSocket...\n");ervock=ocket(AF_INET,SOCK_DGRAM,0);//数据报套接字int servport=5555;intiSockErr =0;//定义服务器地址结构ockaddr_inudpaddr;intlen=izeof(udpaddr);memet(&udpaddr,0,izeof(udpaddr));udpaddr.in_family=AF_INET;udpaddr.in_port=hton(ervport);//将一个点分十进制IP地址字符串转换成32位数字表示的IP地址udpaddr.in_addr._addr= inet_addr("172.16.4.94");////INADDR_ANY//读取mp3文件FILE某fp =NULL;errno_terr;err=fopen_s(&fp,"七里香.mp3","rb");if(fp==NULL){printf("Open!\n");getchar();e某it(-5);}charbuffer[MA某_LENGTH]="\0";char某bufptr= buffer;inti=0;while (!feof(fp)){intiByteRead=fread(bufptr, 1,MA某_LENGTH,fp);intiRet=endto(ervock,buffer,izeof(buffer),0,(tructockaddr某)&udpaddr,len);if(iRet!=SOCKET_ERROR){iRet=recvfrom(servock, buffer,izeof(buffer),0,(tructockaddr某)&udpaddr, &len);}ele{printf("end!\n");break;}if(iRet==SOCKET_ERROR){//cloeocket(cliock);printf("send!\n");}eleif(iRet==0){printf("endmp3!\n");break;}if(iByteRead==0){printf("sendmp3!\n");break;}//printf("%d", &len);printf("send packet%d lenth:%d\n",i++, iByteRea d);Sleep(10);}endto(ervsock,"",0,0,(truct ockaddr*)&udpaddr, len);hutdown(ervsock,2);closeocket(ervock);WSACleanup();getchar();return 0;}(2)接收端代码。
TCP/UDP 通信实验报告学号:姓名:实验二:TCP/UDP通信实验报告一、实验目的熟练掌握UDP、TCP Client/Server 模式的通信原理。
二、实验内容传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议。
面向连接是指一次正常的TCP 传输需要通过在TCP 客户端和TCP 服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。
可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。
TCP 通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
要通过TCP 传输数据,必须在两端主机之间建立连接。
举例说明,TCP 客户端需要和TCP 服务端建立连接,过程如图12-1 所示。
图12-1 TCP 客户端与服务端连接过程①、第一步中,客户端向服务端提出连接请求。
这时TCP SYN 标志置位。
客户端告诉服务端序列号区域合法,需要检查。
客户端在TCP 报头的序列号区中插入自己的ISN。
服务端收到该TCP 分段后,在②、第二步以自己的ISN 回应(SYN 标志置位),同时确认收到客户端的第一个TCP 分段(ACK 标志置位)。
③、在第三步中,客户端确认收到服务端的ISN(ACK 标志置位)。
到此为止建立完整的TCP 连接,开始全双工模式的数据传输过程。
根据以上内容编写一个TCP Client/Server 模式的通信程序。
事实上网络程序是由两个部分组成的--客户端和服务器端。
它们的建立步骤如下:服务器端:socket-->bind-->listen-->accept客户端:socket-->connect。
三、实验步骤实验按下述步骤进行:(1)编写UDP、TCP Client/Server模式的通信程序;(2)调试并运行自己编写的实现程序;(3)了解TCP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在实验报告中写出原因分析;(4)保留编写的实现程序在你的用户目录下,以备辅导教师检查。
【主要】目录:1、UDP包捕获与分析: (1)数据分析: (3)2、TCP包捕获与分析: (3)3.总结TCP的连接建立、数据传输及连接撤消过程。
(6)实验四:UDP及TCP协议分析与验证一、实验目的1.学会使用Wireshark或其他抓包工具进行特定包抓取,并对包进行必要分析。
2.分析验证UDP协议首部信息。
3.分析验证TCP协议首部信息。
4.分析验证TCP连接建立与释放过程。
5.分析验证TCP协议的数据传输过程。
二、预计实验学时2学时三、实验步骤1、UDP包捕获与分析:打开Wireshark,进行必要设置(非混杂模式以避免干扰,仅UDP包,达到设定的抓包数量后自动停止等),随机抓取两个UDP包,分析出该包的源端口、目的端口,该包是客户发给服务器方的还是相反等信息。
●<查看本地的IP 地址〉●UDP 首部---●随机抓取两个UDP包●分别提取出包的UDP首部以下为mac地址●源和目的端口:16位分析出该包的源端口、目的端口、●UDP数据包长度为47●该包是服务器发向本机---如图的红圈住的。
●第二个包的分析同理可得:数据分析:◆目的端口源端口1038、1689◆长度1448◆检验和00x043a◆此为172.16.13.204 发广播的udp包2、TCP包捕获与分析:1)打开浏览器到空白页。
2)打开Wireshark,进行必要设置(非混杂模式以避免干扰,仅TCP 80端口包),打开一个网页,等到捕获了打开该网页的所有数据包后,停止捕获。
◆这里我是打开http:// 浏览器3)对前10个包的序号seq及确认序号ack进行跟踪分析,看看他们是否与所学知识的变化情况一致。
如下图:●前面三个包的-------- 序号136-140 是三次握手的发包的建立连接。
●后面的包就是发送请求,获取数据包。
直至由服务器发送http包200 表示成功。
最后释放TCP连接。
●数据包的确认及返回●后面都数据的发送,客户端接收并确认直至接收完。
实验九 Linux网络编程(4课时)实验目的:了解嵌入式网络开发环境的组成,掌握嵌入式网络程序设计实验原理:linux 网络编程是通过socket(套接字)接口实现,socket是一种文件描述符,socket 起源于UNIX,在Unix一切皆文件的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个socket"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
socket 类型常见的socket有3种类型如下。
(1)流式socket(SOCK_STREAM )流式套接字提供可靠的、面向连接的通信流;它使用TCP 协议,从而保证了数据传输的正确性和顺序性。
(2)数据报socket(SOCK_DGRAM )数据报套接字定义了一种无连接的服,数据通过相互独立的报文进行传输,是无序的,并且不保证是可靠、无差错的。
它使用数据报协议UDP。
(3)原始socket(SOCK_RAW)原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用较为不便,主要用于一些协议的开发。
网络编程主要函数:1.socket:创建一个socketint socket(int family, int type, int protocol);//family指定协议族;type参数指定socket的类型:SOCK_STREAM、SOCK_DGRAM、SOCK_RAW;protocol通常赋值"0", socket()调用返回一个整型socket描述符。
2.bind:用于绑定IP地址和端口号到socketint bind(int sockfd, struct sockaddr *my_addr, int addrlen);//sockfd是一个socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的针; addrlen常被设置为sizeof(struct sockaddr),bind()函数在成功被调用时返回0;遇到错误时返回"-1"并将errno置为相应的错误号。
一.实验目的1、熟悉基于socket的网络编程接口2、掌握流式套接字的创建方法3、掌握为套接字绑定IP地址、端口的方法4、加深理解UDP通信双方的交互模式5、掌握recvfrom函数用法6、掌握sendto函数用法二.实验环境1、头歌基于Linux的虚拟机桌面系统2、网络报文分析工具:wireshark3、编码工具:Vscode(推荐)或 Vim4、C编译器:gcc5、查询Linux C函数用法:man 2 函数名三.相关原理或知识点1.UDP协议的主要特点(1)无连接通信(2)不保证可靠性(3)实时性高于TCP(4)报文不分段,可以是大报文(有上限),面向报文通信2.Socket(套接字)编程接口Unix/Linux、Windows等操作系统,为程序员提供了一种基于socket(套接字)的间接访问系统TCP/IP协议栈进行通信的编程接口,目前大多数通信应用程序的编程都直接或间接地使用了该接口。
在Windows系统环境这个接口称之为Winsock API接口。
3、Socket(套接字)编程接口Unix/Linux、Windows等操作系统,为程序员提供了一种基于socket(套接字)的间接访问系统TCP/IP协议栈进行通信的编程接口,目前大多数通信应用程序的编程都直接或间接地使用了该接口。
在Windows系统环境这个接口称之为Winsock API接口。
4、创建UDP套接字Linux系统提供一个socket系统调用来创建一个套接字。
socket函数的具体的说明如下:需要的头文件如下:#include <sys/types.h> #include <sys/socket.h> ●函数原型声明: int socket(int domain, int type, int protocol);●参数说明:domain:创建套接字所使用的协议族;type:套接字类型;protocol:用于指定某个协议的特定类型,通常某个协议中只有一种特定类型,这样该参数的值仅能设置为0;●domain参数的常用的协议族如下表所示:●type参数的常用的套接字类型如下表所示:函数返回值说明:执行成功返回值为一个新创建的套接字,否则返回-1,并设置错误代码errno。
计算机通信网络实验UDP/TCP通信实验学院:班级:学号:姓名:2012年11月6日一、实验目的熟练掌握UDP、TCP Client/Server模式的通信原理二、实验内容传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议。
面向连接是指一次正常的TCP传输需要通过在TCP客户端和TCP服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。
可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。
TCP通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
要通过TCP传输数据,必须在两端主机之间建立连接。
举例说明,TCP客户端需要和TCP服务端建立连接,过程如图所示:第一步中,客户端向服务端提出连接请求。
这时TCP SYN标志置位。
客户端告诉服务端序列号区域合法,需要检查。
客户端在TCP报头的序列号区中插入自己的ISN。
服务端收到该TCP分段后,在第二步以自己的ISN回应(SYN标志置位),同时确认收到客户端的第一个TCP分段(ACK标志置位)。
在第三步中,客户端确认收到服务端的ISN(ACK标志置位)。
到此为止建立完整的TCP 连接,开始全双工模式的数据传输过程。
根据以上内容编写一个TCP Client/Server模式的通信程序。
事实上网络程序是由两个部分组成:客户端、服务器端它们的建立步骤如下:服务器端socket-->bind-->listen-->accept客户端socket-->connect三、实验步骤1.编写UDP、TCP Client/Server模式的通信程序;2.调试并运行自己编写的实现程序;3.了解TCP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在实验报告中写出原因分析;4.保留编写的实现程序。
Tcp和Udp通信Linux系统开发实验报告
————————————————————————————————作者:————————————————————————————————日期:
一.实验目的
1. 编辑一个画图的功能,例如画圆以及画圆柱体等。
2. 实现两种通信,一种是tcp通信,一种是udp通信。
二.实验内容
实现一个画图的功能,主要就是点击画图按钮,他就会自动的进行画图,像画的是圆的话就让圆不停地显示,如果画的是圆柱体的话,就让圆柱体不停的进行比较显示。
做两个通信,一个是tcp通信,一个是udp通信;这两个通信都要实现最基本的通信,也就是客户机发送信息,服务器要能够接受到,并且显示出来。
三. 实验过程及结果
(一)画图功能
1.首先直接在操作ui界面,在界面里面添加相关组件,如下:
图1 ui界面
图2 ui界面
图3 ui界面
2.打开mainwindow.h文件,在里面定义一些槽函数以及一些变量,主要定义的是画图函数,以及停止函数。
图4 定义槽函数
3. 在这个基础上,具体实现每个槽函数,画圆为了让他不停的显示,需要启动定时器,画圆主要实现的就是一个在标签上贴图的功能。
而画柱体也是一样,如果要使用填充颜色,那么就要添加一个brush这个工具。
如果要使边框有颜色,就需要添加一个pen工具。
图5 实现槽函数
图6 实现槽函数
在mainwindows中添加涉及到的头文件。
图7 添加头文件
4.做好槽函数与按钮之间的响应,画图按钮跟定时器开关进行连接,注意的是,定时器跟画图函数响应。
图8 添加连接函数5.运行一下结果。
图9 定时器启动
图10 持续画图
图11 停掉画圆
图12 两个都停掉
(二)tcp通信
1.先定义槽函数以及一些变量,主要定义的是发送信息和发送文件,连接函数,监听函数等。
图13 定义槽函数
2.然后再具体实现槽函数。
下面定义了一个接受监听函数acceptlisten(),主要是服务器一直在监听有没有客户机发出连接请求。
而监听函数mylisten(),主要是服务器在监听客户机,最后一个sedm()函数,主要就是定时器,将文本框中的内容转为整型数据发送。
图14 实现槽函数
下面定义了一个myquit()函数,主要就是将定时器关闭,socket停止通信,服务器关闭。
而trandata()函数实现的是数据信息的发送;myconnect()函
数实现的是客户机和服务器的连接。
图15 实现槽函数
在下面的函数中,myrecvm()函数实现的是服务器接受信息的功能。
图16 添加头文件
把上面函数中所涉及到的类添加到头文件中
图17 添加头文件
3.做响应连接,主要把定时器跟接受数据函数连接,而发送数据按钮则是跟定时器开关相连接,主要一按下定时器就开启,那么服务器就会自动的接受数据了并显示出来。
图18 添加连接响应
4.修改一下.PRO文件,因为这个实现涉及到网络,所以需要在其中添加network。
因为源代码有opencv类,但这个小类库没有装,所以需要后面另行装上,然后再将类库包进来,添加在最后面。
图19 添加类库5.结果显示
图20 显示选项框
图21 显示选项框实现发送数据功能
图22 发送数据实现接受数据功能
图23 接受数据按下stop,就停止接收数据了
图24 停止接受数据按下quit,关掉服务器
图25 关闭服务器按掉close,就是把输出的内容全部清掉
图26 清除内容
图27 关闭连接
(三)udp通信
1.首先先定义槽函数还有几个变量,主要定义的是发送点对点、发送多播、发送广播,然后还有定时器以及相应的接受函数。
图28 定义槽函数
2.然后具体实现槽函数。
实现点对点的传播,主要先创建一个socket进行通信,然后将发送狂的内容变为整形数据,然后将定时器开启,那么其他的发送方式的原理也是这样的。
图29 实现槽函数
图30 实现槽函数
下面的btnclear()函数,主要就是将通信socket关闭,然后将输出框的内容清除。
图31 实现槽函数
接受信息函数,实现的是一个文本信息附加的功能。
图32 实现槽函数
将上面涉及到的类添加到头文件。
图33 添加头文件
3.做好响应连接。
主要将每个按钮与它们的对应函数相关联好。
图34 做好连接
4.修改.PRO文件,因为源代码有opencv类库,之前软件没有装这个类库,所以需要装上之后,在文件的后面添加上相应的类库。
图35 添加类库5.运行结果
图36 运行界面
图37 运行界面实现发送广播和接受广播功能
图38 发送广播
图39 接受广播
按stop之后,就会暂停输出,然后输入界面变为空
图40 输入变为空
图41 输出暂停按clear,输出界面就会清空
图42 清空界面实现发送点对点、接受点对点功能
图43 发送点对点
图44 接受点对点实现发送多播、接收多播功能
图45 实现发送多播
图46 实现接受多播
四.实验小结
1. 在实现画图功能时,例如画圆,为了让他不停的显示,需要启动定时器,画
圆主要实现的就是一个在标签上贴图的功能。
而画柱体也是一样,如果要使用填充颜色,那么就要添加一个brush这个工具。
如果要使边框有颜色,就需要添加一个pen工具。
2. 做好槽函数与按钮之间的响应,画图按钮跟定时器开关进行连接,注意的是,
定时器跟画图函数响应。
3. 实现tcp通信,先定义槽函数以及一些变量,主要定义的是发送信息和发送
文件,连接函数,监听函数等。
4. 然后再具体实现槽函数。
例如,acceptlisten()函数主要是服务器一直在
监听有没有客户机发出连接请求,而监听函数mylisten()主要是服务器在监听客户机,sedm()函数主要就是启动定时器并将文本框中的内容转为整型数据发送,而myquit()函数主要就是将定时器关闭、socket停止通信以及服务器关闭等等。
5. 做响应连接,主要把定时器跟接受数据函数连接,而发送数据按钮则是跟定
时器开关相连接,主要一按下定时器就开启,那么服务器就会自动的接受数据了并显示出来。
6. 修改一下.PRO文件,因为这个实现涉及到网络,所以需要在其中添加network。
因为源代码有opencv类,但这个小类库没有装,所以需要后面另行装上,然后再将类库包进来,添加在最后面。
7. 实现udp通信,首先先定义槽函数还有几个变量,主要定义的是发送点对点、
发送多播、发送广播,然后还有定时器以及相应的接受函数。
然后具体实现槽函数。
实现点对点的传播,主要先创建一个socket进行通信,然后将发送狂的内容变为整形数据,然后将定时器开启,那么其他的发送方式的原理也是这样的。
而btnclear()函数主要就是将通信socket关闭,然后将输出框的内容清除。
接受信息函数,实现的是一个文本信息附加的功能。