传输层协议分析实验报告

合集下载

计算机网络实验-传输层协议分析

计算机网络实验-传输层协议分析

实验四、传输层协议分析【实验目的】1. 通过捕获TCP 包并进行分析,了解传输层协议的工作过程,加深对TCP 及面向连接的服务的工作原理的理解与掌握,2. 观察简单的TCP 流传输,理解其首部各字段的变化。

3. 理解UDP 数据报的传输特点。

【实验原理】【实验内容】1、查看分析TCP 链路管理(1)、在PC2(192.168.2.24)中安装有FTP 服务端程序。

(2)、在PC1 中开启协议分析软件,进行数据包抓包。

(3)、在PC1 中的协议分析软件中利用工具栏中的TCP 连接工具对PC2 发起连接,如下图所示。

PC1 主动打开连接请求确认PC2 被动打开确认确认SYN ,SEQ = xACK,SEQ = x+1,ACK = y +1SYN,ACK,SEQ = y , ACK = x+1图 4-12 TCP连接工具在IP地址中填入PC2地址192.168.2.24,端口填入FTP服务端口21,然后点击连接。

分析捕获到的三次握手报文。

图 4-13 三次握手第一次连接查看上图TCP报文中的报头部分:源端口:3241,由于发起连接的是客户端,因此源端口为TCP程序随机出的短暂端口,在此连接中是3241。

目的端口:21,由于是向FTP服务发起连接,因此目的端口为FTP服务的熟知端口,为21。

序列号:0X732020CD,此序列号为TCP程序随机出的字节编号。

确认序号:0X00000000,第一个发出的连接请求中,确认号为0。

TCP首部长度:7,TCP首部长度包括TCP报头长度和数据长度,这个字段表示TCP报头长度,其中20字节为标准TCP报头长度,另有8字节选项字段长度,选项字段中和服务器端协商了最大报文段长度。

标识位:SYN位置1,只有TCP连接中三次握手第一次连接的报文段中SYN位置1。

窗口大小:65535,默认大小。

校验和:0X5D64,校验和是对TCP报头、数据和伪首部进行计算得出的校验和。

TCP协议分析实验报告

TCP协议分析实验报告

TCP协议分析实验报告实验4传输层协议分析一、实验目的1、学习3CDaemon FTP服务器的配置和使用,分析TCP报文格式,理解TCP的连接建立、和连接释放的过程。

2、学习3CDaemon TFTP服务器的配置和使用,分析UDP报文格式,理解TCP协议与UDP协议的区别。

二、实验工具软件3CDaemon软件简介3CDaemon是3Com公司推出的功能强大的集FTP Server、TFTP Server、Syslog Server 和TFTP Client于一体的集成工具,界面简单,使用方便。

这里主要介绍实验中需要用到的FTP Server功能和TFTP Server功能。

1、FTP Server功能(1)配置FTP Server功能:选中左窗格功能窗口,打开FTP Server按钮,单击窗格中的 Configure FTP Server按钮,打开3CDaemon Configuration配置窗口,配置FTP Server功能。

这里需要设置的就是“Upload/Download”路径,作为FTP Server的文件夹,其它选项可以使用系统缺省设置。

设置完成后,单击确认按钮,设置生效。

(2)在实验中,我们使用3CDaemon系统内置的匿名帐户“anonymous”登陆FTP 服务器,客户端使用微软FTP客户端命令,关于Ftp命令的说明介绍如下。

(3) Ftp命令的说明FTP的命令格式:ftp[-v][-d][-i][-n][-g][-w:windowsize][主机名/IP地址] 其中:-v不显示远程服务器的所有响应信息;-n限制ftp的自动登录;-i在多个文件传输期间关闭交互提示-d允许调试、显示客户机和服务器之间传递的全部ftp命令;-g不允许使用文件名通配符;-w:windowsize忽略默认的4096传输缓冲区。

使用FTP命令登录成功远程FTP服务器后进入FTP子环境,在这个子环境下,用户可以使用FTP的内部命令完成相应的文件传输操作。

tcp协议实验报告

tcp协议实验报告

tcp协议实验报告TCP协议实验报告一、引言在计算机网络中,TCP(Transmission Control Protocol)是一种常用的传输层协议,负责实现可靠的数据传输。

本实验旨在通过对TCP协议的实验研究,深入理解其工作原理和性能特点。

二、实验目的1. 理解TCP协议的基本原理和机制。

2. 掌握TCP协议的连接建立、数据传输和连接释放过程。

3. 了解TCP协议的流量控制和拥塞控制机制。

三、实验环境1. 操作系统:Windows 102. 实验工具:Wireshark、Python四、实验过程1. 连接建立在实验中,我们使用Python编写了一个简单的TCP服务器和客户端程序。

首先,客户端向服务器发起连接请求(SYN包),服务器接收到请求后发送确认包(SYN+ACK包),最后客户端发送确认包(ACK包)完成连接建立过程。

2. 数据传输在连接建立后,我们通过客户端向服务器发送数据,观察数据在网络中的传输情况。

Wireshark工具可以捕获和分析网络数据包,我们可以通过它来查看TCP 数据包的详细信息,包括源地址、目的地址、序列号、确认号等。

3. 连接释放当数据传输完成后,我们需要关闭TCP连接。

在实验中,我们模拟了正常关闭连接和异常关闭连接两种情况。

正常关闭连接时,客户端和服务器分别发送FIN包和ACK包,最后双方都发送FIN包完成连接释放。

异常关闭连接时,我们可以通过强制关闭客户端或服务器进程来模拟,观察TCP协议对连接异常关闭的处理过程。

五、实验结果通过实验,我们观察到TCP协议的一些重要特点和性能表现:1. 可靠性:TCP协议通过序列号和确认号机制,确保数据的可靠传输。

如果接收方收到的数据包乱序或丢失,TCP协议会要求发送方重新发送。

2. 流量控制:TCP协议通过滑动窗口机制实现流量控制,防止发送方发送速度过快导致接收方无法处理。

当接收方缓冲区已满时,会发送窗口为0的ACK包,告知发送方暂停发送。

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告精编

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告精编

计算机网络原理实验七传输层可靠传输协议GBN编程实验报告精编实验七:传输层可靠传输协议-GBN编程实验报告一、实验目的1. 理解传输层的可靠传输协议GBN(Go-Back-N)的工作原理;2. 利用Python编程实现GBN协议;3.通过实验验证GBN协议的可靠性。

二、实验环境1. 操作系统:Windows 10;2. 开发工具:Python3.9;3. Python库:socket, threading。

三、实验原理GBN(Go-Back-N)协议是一种滑动窗口协议,用于实现可靠的传输。

在GBN协议中,发送方可以连续发送一批数据包,每个数据包都有一个序号。

接收方会按照相同的序号顺序接收并确认收到的数据包,若一些数据包丢失,则接收方会等待一定时间,然后要求发送方重传从丢失的数据包开始之后的所有数据包。

在本实验中,我们将通过编程实现一个简化的GBN协议。

发送方和接收方将通过socket进行通信。

发送方将发送一定数量的数据包,接收方将模拟数据包丢失,并且在一段时间后要求发送方重传。

四、实验过程1. 建立发送方和接收方的socket连接,并互相绑定IP地址和端口号;2.发送方将一定数量的数据包发送给接收方;3.接收方按照GBN协议的规定接收数据包,并发送确认信息给发送方;4.发送方接收到确认信息后,继续发送下一批数据包;5.当接收方丢失数据包时,等待一段时间之后要求发送方重传;6.发送方收到重传请求后,重新发送从丢失的数据包开始之后的所有数据包;7.重复步骤2-6,直到所有数据包都被成功接收。

五、实验结果经过多次实验,数据包的发送与接收均顺利进行。

发送方能够根据接收方的确认信息进行滑动窗口的滑动,并实现重传功能。

接收方也能够检测到丢失的数据包,并要求发送方进行重传。

整个传输过程基本完成了GBN协议可靠性传输的要求。

六、实验总结通过本次实验,我深入理解了传输层的可靠传输协议GBN的工作原理,并通过编程实现了一个简化的GBN协议。

实验五、传输层可靠传输协议GBN编程实验报告

实验五、传输层可靠传输协议GBN编程实验报告

实验五、传输层可靠传输协议GBN编程实验报告序号:姓名:杨学号:成绩一、实验目的:1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

二、实验指导:参考教材。

三、实验要求:编程实现一个GBN传输协议,程序源代码:发送方源代码:// sender.cpp发送方程序代码,定义控制台应用程序的入口点//#include <stdafx.h>#include <iostream>#include <WinSock2.h>#include <string.h>#include <../header/ARQ.h>#include <../header/Exception.h>#define SERVER_PORT 2011 // 服务器端口#define MAXRETRY 5 //最大重传次数#define TIMEOUT 2000 // 传送传时时间#pragma comment(lib,"ws2_32.lib")//设置link时的lib库using namespace std;SOCKET PrimaryUDP;char ServerIP[20];char FilePath[MAX_PATH];bool g_number = false; // 用作奇偶检校的序号char g_bcc;// 返回的控制字符HANDLE m_hEvent;void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){throw Exception("Windows sockets 2.2 startup unsuccessful");}else{printf("Using %s (Status: %s)\n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API versions %d.%d to %d.%d\n\n",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));}}void mksock(int type){PrimaryUDP = socket(AF_INET, type, 0);if (PrimaryUDP < 0){throw Exception("create socket error");}}void BindSock(){sockaddr_in sin;sin.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = 0;if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0) throw Exception("bind error");}bool ASendto(){sockaddr_in remote;remote.sin_addr.S_un.S_addr = inet_addr(ServerIP);remote.sin_family = AF_INET;remote.sin_port = htons(SERVER_PORT);int fromlen = sizeof(remote);// 打开文件FILE * file;if((file = fopen(FilePath, "rb")) == NULL){cout<<FilePath<<" open error"<<endl;return false;}cout<<"file open succeed"<<endl;// 设置文件指针位置SetFilePointer(file, 0, NULL, FILE_BEGIN);BSC bsc;bsc.header = STX;bsc.tail = ETX;// 设为有信号SetEvent(m_hEvent);// 分段序号bool number = false;unsigned long dwRead = -1;bool sendComplete = false;while(!sendComplete){// 清空数据memset(bsc.data, 0, MAXBSCLENGTH);// 当前分块的奇偶序号bsc.number=number;// 记录当前的分块序号g_number = bsc.number;if (dwRead ==-1)//第一次应发送文件请求消息{// 发送文件请求bsc.bcc = ENQ;char * filename = FilePath;if ((filename = strrchr(FilePath,'\\'))==NULL)filename = FilePath;else++filename;strcpy(bsc.data,filename);dwRead = 0;}else{if(!feof(file)){bsc.bcc = SYN;int i = fread(bsc.data, sizeof(char),MAXBSCLENGTH , file);cout<<"read:"<<i<<"\tsend:"<<sizeof(bsc.data)<<endl;dwRead+=i;}else{// 发送完毕bsc.bcc = EOT;sendComplete = true;cout<<"send complete.send size:"<<dwRead<<endl;fclose(file);}}for(int i=0;i<MAXRETRY;i++){sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,fromlen);ResetEvent(m_hEvent);DWORD reslut = WaitForSingleObject(m_hEvent,TIMEOUT);if (reslut == WAIT_OBJECT_0){// 收到应答消息,一种是ACK,一种是NAKif (g_bcc == NAK){if (i == MAXRETRY -1){return false;}// 继续重传continue;}else{ // 收到应答消息//cout<<"send succeed"<<endl;break;}}else if(i == MAXRETRY-1){cout<<"send file failed"<<endl;return false;}} // 开始发下一段数据number = !number;}return true;}DWORD WINAPI ARecv(LPVOID lpParam){sockaddr_in remote;int sinlen = sizeof(remote);BSC buffer;int iread = 0;while (true){iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockaddr*)&remote,&sinlen);// 处理ACK与NAKif (iread == SOCKET_ERROR){continue;}// 与当前的分块序号进行比较,看是不是当前块的应答if (buffer.number!=g_number){continue;}if (buffer.bcc == ACK || buffer.bcc == NAK){// 保存返回的控制字符g_bcc = buffer.bcc;SetEvent(m_hEvent);}}return 0;}int _tmain(int argc, _TCHAR* argv[]){InitWinSock();mksock(SOCK_DGRAM);BindSock();cout<<"Please input receiver ip:";cin>>ServerIP;cout<<"Please input the file path:";cin>>FilePath;m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);CreateThread(NULL, 0, ARecv, NULL, 0, NULL);if (!ASendto()){cout<<"file send failed"<<endl;getchar();}getchar();getchar();return 0;}接收方源代码:// receiver.cpp 接收方程序代码,定义控制台应用程序的入口点// #include <stdafx.h>#include <iostream>#include <WinSock2.h>#include <../header/ARQ.h>#include <../header/Exception.h>#define SERVER_PORT 2011// 服务器端口#pragma comment(lib,"ws2_32.lib")//设置link时的lib库using namespace std;SOCKET PrimaryUDP;char FileSavePath[MAX_PATH];void InitWinSock(){WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){throw Exception("Windows sockets 2.2 startup unsuccessful");}else{printf("Using %s (Status: %s)\n",wsaData.szDescription, wsaData.szSystemStatus);printf("with API versions %d.%d to %d.%d\n\n",LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));}}void mksock(int type){PrimaryUDP = socket(AF_INET, type, 0);if (PrimaryUDP < 0){throw Exception("create socket error");}}void BindSock(){sockaddr_in sin;sin.sin_addr.S_un.S_addr = INADDR_ANY;sin.sin_family = AF_INET;sin.sin_port = htons(SERVER_PORT);if (bind(PrimaryUDP, (struct sockaddr*)&sin, sizeof(sin)) < 0) throw Exception("bind error");}DWORD WINAPI ARecv(LPVOID lpParam){FILE * file = NULL;sockaddr_in remote;int sinlen = sizeof(remote);BSC buffer,bsc;bsc.header = STX;bsc.tail = ETX;memset(bsc.data, 0, MAXBSCLENGTH);int iread = 0;unsigned long dwReceived = 0;bool number = true;//发送方的数据开始发送时的序号设为0,为了判断是不是第一次一段数据,所以这里标为1while (true){iread = recvfrom(PrimaryUDP,(char*)&buffer,sizeof(buffer),0,(sockaddr*)&remote,&sinlen) ;if (SOCKET_ERROR == iread || buffer.header != STX || buffer.tail != ETX) {// 数据错误,发送负应答cout<<"received a error data"<<endl;bsc.bcc = NAK;bsc.number=false;//number这时没有实际的意义sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;}if (buffer.number == number){// 重复收到数据,发送应答消息cout<<"received a repeat data"<<endl;bsc.bcc = ACK;bsc.number = buffer.number;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;}switch(buffer.bcc){case ENQ:{number = !number;//准备接收下一段数据// 文件请求cout<<"received a file request message,filename:"<<buffer.data<<endl;// 打开文件if(strcmp((FileSavePath+strlen(FileSavePath)-1),"\\")!=0)strcat(FileSavePath,"\\");strcat(FileSavePath,buffer.data);if((file = fopen(FileSavePath, "ab")) == NULL){cout<<"file open failed"<<endl;return -1;}break;}case SYN:{number = !number;// 文字发送中int i =0;if((i=fwrite(buffer.data, sizeof(char), sizeof(buffer.data), file)) <= 0){cout << "write failed" << endl;return -1;}dwReceived += i;cout<<"write:"<<i<<"\treceived:"<<sizeof(buffer.data)<<endl;break;}case EOT:{number = !number;// 文件发送完毕cout<<"file received completely,save path:"<<FileSavePath<<",received size:"<<dwReceived<<endl;fclose(file);break;}default:{// 数据错误,发送负应答bsc.bcc = NAK;bsc.number=false;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);continue;break;}} // 发送应答消息bsc.bcc = ACK;bsc.number = buffer.number;sendto(PrimaryUDP,(char*)&bsc,sizeof(bsc),0,(sockaddr*)&remote,sinlen);}return 0;}int _tmain(int argc, _TCHAR* argv[]){InitWinSock();mksock(SOCK_DGRAM);BindSock();CreateThread(NULL, 0, ARecv, NULL, 0, NULL);cout<<"Please input the file save path:";cin>>FileSavePath;cout<<"receiver start succeed"<<endl;getchar();getchar();return 0;}四、实验总结通过这次实验基本弄清了停止等待协议的工作机理。

UDP协议分析实验报告

UDP协议分析实验报告

实验三 UDP 协议分析一、实验目的1. 掌握传输层的UDP协议内容;2. 理解UDP协议的工作原理;2. 了解应用层协议与传输层协议的关系。

二、实验内容1. 学习UDP协议的通信过程;2. 分析UDP协议报文格式;3. 学会计算UDP的校验和。

三、实验原理UDP(User Datagram Protocol)用户数据报协议(RFC 768)一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

UDP 协议基本上是 IP 协议与上层协议的接口。

由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。

这是通过使用UDP 的“端口号”完成的。

例如,如果一个工作站希望在工作站 128.1.123.1 上使用域名服务系统,它就会给数据包一个目的地址 128.1.123.1 ,并在 UDP 头插入目标端口号 53 。

源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。

与 TCP 不同, UDP 并不提供对 IP 协议的可靠机制、流控制以及错误恢复功能等。

由于 UDP 比较简单, UDP 头包含很少的字节,比 TCP 负载消耗少。

UDP 适用于不需要 TCP 可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。

UDP 是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。

UDP协议结构:(1) Source Port —16位。

源端口是可选字段。

当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。

如果不使用,设置值为0。

(2) Destination Port — 16位。

目标端口在特殊因特网目标地址的情况下具有意义。

传输层协议分析实验报告

传输层协议分析实验报告

实验4 传输层协议分析一、实验目的1、学习3CDaemon FTP服务器的配置和使用,分析TCP报文格式,理解TCP 的连接建立、和连接释放的过程。

2、学习3CDaemon TFTP服务器的配置和使用,分析UDP报文格式,理解TCP 协议与UDP协议的区别。

二、实验工具软件3CDaemon软件简介3CDaemon是3Com公司推出的功能强大的集FTP Server、TFTP Server、Syslog Server和TFTP Client于一体的集成工具,界面简单,使用方便。

这里主要介绍实验中需要用到的FTP Server功能和TFTP Server功能。

1、FTP Server功能(1)配置FTP Server功能:选中左窗格功能窗口,打开FTP Server按钮,单击窗格中的Configure FTP Server按钮,打开3CDaemon Configuration配置窗口,配置FTP Server功能。

这里需要设置的就是“Upload/Download”路径,作为FTP Server的文件夹,其它选项可以使用系统缺省设置。

设置完成后,单击确认按钮,设置生效。

(2)在实验中,我们使用3CDaemon系统内置的匿名帐户“anonymous”登陆FTP服务器,客户端使用微软FTP客户端命令,关于Ftp命令的说明介绍如下。

(3) Ftp命令的说明FTP的命令格式:ftp[-v][-d][-i][-n][-g][-w:windowsize][主机名/IP地址]2、TFTP Server功能(1) TFTP Server功能配置基本同上(FTP erver功能)。

(2)实验中,为了与TFTP服务器连通,可以使用Windows命令行模式下的TFTP 客户端命令,命令格式如下:TFTP[-i]host[GET|PUT]source[destination]三、实验内容和步骤1、TCP协议分析实验(1)按照上面3CDaemon软件的介绍方法在PC1上建立FTP服务器;(2)在PC1和PC2中运行Ethereal,开始截获报文,为了只截获到与我们实验有关的内容,将截获条件设置为对方主机的IP地址,如PC1的截获条件为“host 192.168.1.xx”(注释:PC2的IP地址);(3)在PC2上打开命令行窗口,执行如下操作:C:\Documents and Settings\Administrator>ftpftp>openTo 192.168.1.yy(注释:PC1的IP地址)Connected to 192.168.1.yy.220 3Com 3CDaemon FTP Server Version 2.0User(192.168.1.yy:(none)):anonymous331 User name ok,need passwordPassword:230-The response'is not valid.230-Next time,please use your email address as password.230 User logged inftp>quit221 Service closing control connectionC:\Documents and Settings\Administrator>(4)停止截获报文,将截获的结果保存为FTP-学号,按下列要求分析截获的结果;a)结合本节TCP协议介绍部分的内容,分析TCP连接建立的“三次握手”过程,找到对应的报文,填写表1(传输方向填写PC2-> PC1或PC2<-PC1)。

分析tcp协议实验报告

分析tcp协议实验报告

分析tcp协议实验报告
《分析TCP协议实验报告》
近年来,随着互联网的快速发展,TCP协议作为互联网传输层协议的重要组成
部分,一直备受关注。

为了更好地了解TCP协议的性能和特点,我们进行了一
系列的实验,并撰写了实验报告,以便更深入地了解TCP协议的运行机制和优
化方法。

在实验中,我们首先搭建了一个简单的网络环境,然后使用不同的工具和技术
对TCP协议进行了测试和分析。

我们发现,在实际的网络环境中,TCP协议的
性能受到多种因素的影响,包括网络延迟、带宽限制和数据包丢失等。

通过实验,我们深入分析了这些因素对TCP协议性能的影响,并提出了一些优化建议,以改善TCP协议在实际应用中的性能表现。

另外,我们还对TCP协议的拥塞控制机制进行了深入研究。

通过实验,我们发
现TCP协议的拥塞控制机制在一定程度上可以有效地避免网络拥塞和数据包丢失,但也存在一些局限性和不足之处。

我们对这些问题进行了详细的分析和讨论,并提出了一些改进的建议,以提高TCP协议在拥塞控制方面的性能。

总的来说,通过本次实验和报告,我们深入分析了TCP协议的性能和特点,提
出了一些优化和改进的建议,以便更好地应用和推广TCP协议。

我们相信,通
过不断地实验和研究,我们可以更好地理解和利用TCP协议,为互联网的发展
和应用做出更大的贡献。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2. 传输层协议分析
2.A 数据包捕获分析部分
2.1 实验目的
理解TCP报文首部格式和字段的作用,TCP连接的建立和释放过程,TCP数据传输中编号与确认的作用。

2.2 实验内容
应用TCP应用程序传输文件,截取TCP报文,分析TCP报文首部信息,TCP连接的建立过程,TCP数据的编号和确认机制。

2.3 实验原理
TCP协议是传输控制协议的简称,工作在网络层协议之上,是面向连接的,可靠的,端到端的传输层协议。

1) TCP的报文格式
TCP报文段分为头部和数据两部分,如图1:
图1 TCP报文段的总体结构
TCP报文段首部又分为固定部分和选项部分,固定部分为20B,如图2所示,这些字段的组合实现了TCP的所有功能。

图2 TCP报文段的首部
0 15 31
连接释放三个阶段。

2) TCP连接的建立
TCP连接建立采用“3次握手”方式。

首先,主机A的TCP向主机B的TCP发出连接请求报文段,其首部中的同步位SYN 应置1,同时选择一个序号X,表明在后面传送数据时的第一个数据字节的序号是X+1,如图3所示:
然后,主机B的TCP收到连接请求报文段后,若同意,则发回确认。

在确认报文段中应将SYN和ACK都置1,确认号应为X+1,同时也为自己选择一个序号Y。

最后,主机A的TCP收到B的确认后,要向B发回确认,其ACK置1,确认号为Y+1,而自己的序号为X+1。

TCP的标准规定,SYN置1的报文段都要消耗掉一个序号。

同时,运行客户进程的主机A的TCP通知上层应用进程,连接已经建立。

当主机A向B发送第一个数据报文段时,其序号仍为X+1,因为前一个确认报文段并不消耗序号。

当运行服务器进程的主机B的TCP收到主机A的确认后,也通知其上层应用进程,连接已经建立。

另外,在TCP连接建立的过程中,还利用TCP报文段首部的选项字段进行双方最大报文段长度MSS协商,确定报文段的数据字段的最大长度。

双方都将自己能够支持的MSS写入选项字段,比较之后,取较小的值赋给MSS,并应用于数据传送阶段。

3) TCP数据的传送
为了保证TCP传输的可靠性,TCP采用面向字节的方式,将报文段的数据部分进行编号,每个字节对应一个序号。

并在连接建立时,双方商定初始序号。

在报文段首部中,序号字段和数据部分长度可以确定发送方传送数据的每一个字节的序号,确认号字段则表示接收方希望下次收到的数据的第一个字节的序号,即表示这个序号之前的数据字节均已收到。

这样既做到了可靠传输,又做到了全双工通信。

当然,数据传送阶段有许多复杂的问题和情况,如流量控制、拥塞控制、重传机制等,本次实验不探究。

4)TCP 连接的释放
在数据传输结束后,通信的双方都可以发出释放连接的请求。

TCP 连接的释放采用“4次握手”。

如图
应用进程释放连接A不再发送报文
放连接确认
B不再发送报文
FIN,ACK,SEQ=Y,ACK=X+1
A
图4 TCP 连接释放的4次握手过程
首先,设图4中主机A 的应用进程先向其TCP 发出释放连接的请求,并且不再发送数据。

TCP 通知对方要释放从A 到B 这个方向的连接,将发往主机B 的TCP 报文段首部的中止位置1,其序号X 等于前面已传送过的数据的最后一个字节的序号加1。

主机B 的TCP 收到释放连接通知后即发出确认,其序号为Y ,确认号为X+1,同时通知高层应用进程,如图中的箭头①。

这样从A 到B 的连接就被释放了,连接处于半关闭状态,相当于主机A 对主机B 说“我已经没有数据发送了。

但是如果你还有数据要发送,我仍然接收。


此后,主机B 不再接收A 发来的数据。

但若主机B 还有一些数据要发给A ,则可以继续发送(这种情况很少)。

主机A 只要正确收到数据,仍然向B 发送确认。

若主机B 不再向主机A 发送数据,其应用进程就通知TCP 释放连接,如图中的箭头②。

主机B 发出的连接释放报文段必须将中止位FIN 和确认位ACK 置1,并使其序号仍为Y (因为签名发送的确认报文段不消耗序号),但是还必须重复上次已经发送过的ACK =X+1。

主机A 必须对此发出确认,将ACK 置1,ACK=Y+1,而自己的序号仍然是X+1,因为根据TCP 标准,前面发送过的FIN 报文段要消耗掉一个序号。

这样就把B 到A 的反方向的连接释放掉。

主机A 的TCP 再向其应用进程报告,整个连接已经全部释放。

2.4 实验步骤
步骤1 在Wireshark 中设置过滤条件,协议为TCP HTTP ,地址为本机->any ,并开始截获报文;
步骤2打开.,完成后,保存截获的报文并命名为“TCP学号”,分析捕获的报文。

这里,TCP的连接和建立采用的是:三次握手方式,本机是192.168.3.3 ,远端主机是192.168.3.183 。

步骤3 分析TCP连接建立过程的前3个报文,填写下表1:
表1 TCP建立过程的三个报文信息
字段名称第一条报文第二条报文第三条报文
报文序号170417161718
Sequence Nunber830849835
ACK Number289291237
ACK12911
SYN111
步骤4 分析截获报文中数据发送部分的第一条TCP报文及其确认报文,将报文中的字段值填写在表格2中。

表2 TCP报文首部信息
字段名长度字段值字段意义
发送报文确认报文
源端口16发送
目标端口16确认端口号是唯一标识序号32
确认好32确认
头部长度4
保留6保留字段
窗口16
校验和16
紧急指针16
选项(长度可变)
步骤5 TCP连接建立时,其报文首部与其它TCP报文不同,有一个option字段,它的作用是什么?结合IEEE802.3协议规定的以太网最大帧长分析此数据是怎么得出来的?
步骤6分析TCP数据传送阶段的前8个报文,将报文信息填入表3:
表3 TCP数据传送部分的前8个报文
报文序号报文种类序号字段确认号
字段
数据长度被确认报文序号窗口
3744确认2891324289123 3754发送106616580 3764确认11344291123 3784发送106616579 3794确认2371290237123 3804发送106616593 3814确认289029029016768 3824确认290129029016768
2.5 实验总结
在实验中,通过分析截获的TCP报文首部信息,可以看到首部中的序号、确认号等字段是TCP可靠连接的基础。

分析TCP头部信息,分析“3次握手”过程。

通过对数据传送阶段报文的初步分析,了解数据的编码和确认机制。

总之,TCP协议中的各项设置都是为了在数据传输时提供可靠的面向连接的服务。

2.B 编程构造UDP数据包部分
使用C语言构造UDP数据包程序。

1) UDP首部和伪首部结构体定义
2)构建UDP报文数据
如有侵权请联系告知删除,感谢你们的配合!。

相关文档
最新文档