收藏 分销(赏)

基于TCP的文件传输程序.doc

上传人:精*** 文档编号:3943212 上传时间:2024-07-24 格式:DOC 页数:16 大小:93.04KB
下载 相关 举报
基于TCP的文件传输程序.doc_第1页
第1页 / 共16页
基于TCP的文件传输程序.doc_第2页
第2页 / 共16页
基于TCP的文件传输程序.doc_第3页
第3页 / 共16页
基于TCP的文件传输程序.doc_第4页
第4页 / 共16页
基于TCP的文件传输程序.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、计算机网络系统实践报告设计题目:网络文件传输学生姓名:郑波学 号:2013211644专业班级:计算机科学与技术13-2班2015年12月一、 设计要求1、 实现单线程文件传输功能2、 在以上的基础上,掌握多线程技术,在文件网络传输时,可选择单线程或多线程3、 加入异常控制机制,增强程序的鲁棒性(Robust)4、 了解如何提高套接字传输的速率,以及如何加强传输的稳定性二、开发环境与工具Windows7下Microsoft Visual Stuio三、设计原理1、网络传输协议TCP/IP协议栈中的两个协议:TCP(Transmission Control Protocol):传输控制协议UDP

2、(User Datagrm Protocal):用户数据报协议TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。该连接一旦建立,两台计算机之间就可以把数据当做一个双向字节流进行交换。UDP是无连接的通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据.就是说,如果一个主机向另外一台主机发送数据,这个数据就会立即发出,而不管另外一台主机是否已准备接收数据。如果另外一台主机接收到了数据,它不会确认收到与否。本次工程目的是传输文件,显然需要用TCP建立连接,而TCP连接需要“三次

3、握手。2、三次握手 三次握手具体过程:1、客户端主动与服务器联系,TCP首部控制位中的SYN设置为1,发送带有SYN的TCP段,并把初始序号告诉对方2、服务端收到带有SYN的报文,记录客户端的初始序号,选择自己的初始序号,设置控制位中的SYN和ACK。因为SYN占用一个序号,所以确认序号设置为客户端的初始序号加1,对客户端的SYN进行确认3、服务端的报文到达客户端,客户端设置ACK控制位,并把确认好设为服务器的初始序号加1,以确认服务器的SYN报文段,这个报文只是确认消息,告诉服务器已经成功建立了连接四、系统功能描述及软件模块划分1、系统功能描述 软件实现了点对点的文件传输。传输前的接收提醒以

4、及传输过程中的控制. 2、软件模块划分 本程序可以划分成以上三个模块:传输控制模块,文件传输模块和服务连接模块。其中:服务连接模块用来建立客户端到服务器的连接 文件传输模块主要用两个线程:_SendThread和_ListenThread来完成,实现发送和接收文件的功能。传输控制模块主要通过封装好的可串行化信息类CMessage互相传递两端的文件操作消息,响应“暂停传输”,“关闭连接”等功能五、设计步骤 1、服务连接模块 先要建立起客户端与服务器之间的连接,大致过程如下: 服务器启动: if(m_nServerType = SERVER)/创建服务器套接字m_psockServer = new

5、 CListenSocket(this);if(!m_psockServerCreate(m_wPort)) /绑定端口delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(”错误”), MB_ICONHAND);return ;/开启线程,监听客户端连接if(!m_psockServer-Listen() delete m_psockServer;m_psockServer = NULL;MessageBox(GetError(GetLastError(), _T(”错误), MB_I

6、CONHAND);return ; 客户端填入相应的IP地址,连接服务器if((CIPAddressCtrl)GetDlgItem(IDC_IPADDRESS)-IsBlank()MessageBox(”IP 地址不能为空, 错误”, MB_ICONHAND);return ;/创建客户端套接字m_psockClient = new CClientSocket(this);if(!m_psockClientCreate()delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(错误”),

7、MB_ICONHAND);return ;/与服务器建立连接CString strIPAddress;GetDlgItem(IDC_IPADDRESS)GetWindowText(strIPAddress);if(!m_psockClient-Connect(strIPAddress, m_wPort) /Connect连接服务器,服务器用OnAccept响应delete m_psockClient;m_psockClient = NULL;MessageBox(GetError(GetLastError(), _T(”错误”), MB_ICONHAND);return ;/初始化客户端套接字

8、m_psockClientInit(); 服务器响应CClientSocket pSocket=new CClientSocket(this);/接收请求后获得新的套接字,交由新的套接字处理请求if(m_psockServerAccept(pSocket)) /非零则接收连接请求成功/初始化Accpet返回的套接字pSocketInit();CMessage pMsg;/检测套接字是否为空,空则还没有连接任何客户端if(m_psockClient=NULL)pMsg=new CMessage(CONNECT_BE_ACCEPT); pSocket-SendMsg(pMsg);/发回“这边可以连

9、接”消息回去,客户端的Receive接收m_psockClient=pSocket; /若为服务器,则之前未初始化,可保存这个套接字,用来跟客户端交互GetDlgItem(IDC_SELECT_FILE)-EnableWindow(TRUE);else pMsg=new CMessage(CONNECT_BE_REFUSE);pSocketSendMsg(pMsg); 客户端收到连接成功消息if(pMsgm_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)EnableWindow(TRUE);return;2、传输控制模块该工程用了两对套接

10、字,一对用来接收传输控制消息,一对用来收发文件。我们这个模块用的是第一对在MFC中定义了一个在套接字编程中使用的CSocketFile类,可以充分发挥CSocket类的特性。CSocketFile类是CFile的派生类,主要用来在Windows Sockets编程中发送和接收序列化数据(如结构体数据).通过把CSocketFile类对象、CArchive对象和CSocket创建的套接字对象联系起来,可以实现数据的加载(接收)和存储(发送)。 MFC集成CSocketFile、CSocket、CArchive可以简化网络传输。下图可以直观地反应这三者是如何结合来在客户端和服务器之间传输消息的 先

11、来看看服务器和客户端的套接字初始化工作:m_pFile = new CSocketFile(this);m_pArchiveIn = new CArchive(m_pFile,CArchive::load);m_pArchiveOut = new CArchive(m_pFile,CArchive::store); 这样一来,当使用m_pArchiveIn对象来调用可串行化消息类CMessage的Serialize时,接收方就能响应OnReceive消息,来完成控制信息的传递。 本工程在主类CsendFileDlg中定义了传输的三种状态:m_bIsWait:已连接,正在等待传输文件m_bIsT

12、ransmitting: 正在传输文件m_bIsStop:传输已终止本工程定义的可串行化消息类CMessage,用来传递文件名m_strFileName、文件长度m_dwFileSize以及当前的传输状态m_nType,大致流程如下图:其中,我在建工程的时候,把客户端和服务器集成在了一个界面OnReceive就用来接收两方的消息,关键代码如下:CMessage pMsg=new CMessage();pSocketReceiveMsg(pMsg);if(pMsgm_nType=CONNECT_BE_ACCEPT)GetDlgItem(IDC_SELECT_FILE)EnableWindow(T

13、RUE);return;if(pMsg-m_nType=CONNECT_BE_REFUSE)MessageBox(_T(”服务器正在和另外的客户端连接,稍等),_T(”错误”), MB_ICONHAND);delete m_psockClient;m_psockClient=NULL;return ;if (pMsgm_nType=DISCONNECT) MessageBox(_T(对方已经关闭”), _T(警告”), MB_ICONHAND);if(m_psockClient != NULL)delete m_psockClient;m_psockClient = NULL;/接收请求if(

14、pMsgm_nType=REQUEST)m_bIsWait=TRUE; /忙状态置1m_strFileName=pMsgm_strFileName;m_dwFileSize=pMsg-m_dwFileSize;CString strName,strSize;strName。Format(”文件名:%s”,m_strFileName);strSize。Format(文件大小:%ld字节”,strSize);/这里完成了发送文件前给对方提示的功能if(MessageBox(strName+”rn+strSize,对方请求向你发送文件”,MB_OKCANCEL)=IDCANCEL)CMessage*

15、 pMsg = new CMessage(REFUSE);m_psockClient-SendMsg(pMsg);return;CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,所有文件(。)。|,this);dlg。m_ofn.lpstrTitle=_T(”另存为”);strcpy(dlg.m_ofn。lpstrFile,m_strFileName。GetBuffer(m_strFileName。GetLength());if(dlg.DoModal()=IDOK)if(m_bIsWait=FALSE)M

16、essageBox(_T(对方已经取消文件发送), _T(”警告”), MB_ICONEXCLAMATION);return ;m_bIsClient=FALSE; m_strPath=dlg。GetPathName();/启动接收文件的线程GetDlgItem(IDC_SR)SetWindowText(已接收:);pThreadListen = ::AfxBeginThread(_ListenThread, this); /服务器接收到RUEST,开启接收文件线程 return ;if(m_bIsWait = TRUE)/告诉对方文件发送请求被拒绝 CMessage pMsg = new C

17、Message(REFUSE);m_psockClient-SendMsg(pMsg);m_bIsWait = FALSE;return ;/当对方同意,并且已经准备好接收文件的时候if(pMsg-m_nType=ACCEPT)KillTimer(1);m_bIsWait=FALSE; /等待状态清空/启动发送文件线程GetDlgItem(IDC_SR)SetWindowText(”已发送:”);pThreadSend=::AfxBeginThread(_SendThread,this);return;/当发送文件请求被拒绝if(pMsg-m_nType=REFUSE)m_bIsWait=FA

18、LSE;MessageBox(_T(请求被拒绝”), _T(警告”), MB_ICONEXCLAMATION);return ;/当对方取消文件传输时执行该if语句里面的内容if(pMsg-m_nType = CANCEL)m_bIsWait = FALSE;return ; 3、文件传输模块两个线程:_ListenThread():建立新的监听套接字,准备接收文件_SendThread(): 建立客户端套接字,连接监听套接字,发送文件 当两方建立了可靠的连接,一方选择文件后,就会使用传输控制模块给对方发送文件发送请求,对方的ProcessReceive接收到后查看当前的消息状态,(上个模块的

19、OnReceive已经写得很清楚),同意接受后,开启文件接收线程,同时给发送方返回一个准备完成状态,于是,发送方开启文件发送线程,最后完成文件的传输工作,同时置状态m_bIsStop为TRUE,便于双方传输控制 发送线程关键函数SendFilevoid CSendFileDlg:SendFile(CSocket senSo)m_bIsTransmitting=TRUE; CFile file;if (!file。Open(m_strPath,CFile:modeReadCFile::typeBinary))AfxMessageBox(_T(文件打开失败);senSo.Close();retur

20、n ;m_ctrlProgress.SetRange32(0,m_dwFileSize);int nSize=0,nLen=0;DWORD dwCount = 0;char bufBLOCKSIZE=0;file。Seek(0,CFile::begin);/开始传送while(1)/每次读取BLOCKSIZE大小nLen=file.Read(buf,BLOCKSIZE);if(nLen=0)break;/发送文件内容nSize=senSo。Send(buf,nLen);dwCount+=nSize;m_ctrlProgress.SetPos(dwCount);CString strTransf

21、ersSize;strTransfersSize。Format(%ld 字节,dwCount);/设置进度条属性GetDlgItem(IDC_RECEIVE_SIZE)-SetWindowText(strTransfersSize);int p=((double)dwCount)/(int)m_dwFileSize+1)100+1;strTransfersSize.Format(”%d,p);strTransfersSize+=”;/判断用户是否停止发送if(m_bIsStop)m_bIsStop=FALSE;break;if (nSize=SOCKET_ERROR)break;file。Cl

22、ose();senSo。Close();if(m_dwFileSize=dwCount)AfxMessageBox(_T(”文件发送成功”));elseAfxMessageBox(_T(文件发送失败”);m_ctrlProgress.SetPos(0);m_bIsTransmitting = FALSE; 接收线程关键函数ReceiveFilevoid CSendFileDlg:ReceiveFile(CSocket recSo)/停止等待超时计时器KillTimer(2);m_bIsWait=FALSE;m_bIsTransmitting=TRUE; /正在传输置1m_ctrlProgres

23、s。SetRange32(0,m_dwFileSize);int nSize=0;DWORD dwCount=0;char bufBLOCKSIZE=0;CFile file(m_strPath,CFile::modeCreateCFile::modeWrite);/开始接收文件while (1)/每次接收BLOCKSIZE大小的内容nSize=recSo.Receive(buf,BLOCKSIZE);if(nSize=0)break;/写入文件file.Write(buf,nSize);dwCount+=nSize;m_ctrlProgress。SetPos(dwCount);CString

24、 strTransfersSize;strTransfersSize。Format(ld 字节”,dwCount);GetDlgItem(IDC_RECEIVE_SIZE)-SetWindowText(strTransfersSize);int p=(double)dwCount)/((int)m_dwFileSize+1)*100+1;strTransfersSize。Format(d”,p);strTransfersSize+=”%;GetDlgItem(IDC_PECENT)SetWindowText(strTransfersSize)/用户是否停止了接收if(m_bIsStop)m_b

25、IsStop=FALSE;break;file。Close();recSo。Close();if(m_dwFileSize=dwCount)AfxMessageBox(_T(”文件接收成功));elseAfxMessageBox(_T(”文件接收失败));m_ctrlProgress。SetPos(0);m_bIsTransmitting = FALSE;六、关键问题及其解决方法1、在传输文件前、中、后能让程序响应各类控制消息集成后的互通消息代码很简单:void Serialize(CArchive& ar)if(ar.IsStoring()ar m_nType;ar m_strFileNam

26、e;ar m_nType;ar m_strFileName;ar m_dwFileSize; CSocket、CSocketFile、CArchive三个类的联动,完美地解决了这个问题,在传输文件的过程中,若一方有事件发生(暂停传输、关闭连接等等),则改变预先设定的状态值,SendMsg给CSocketFile,触发对方的虚函数OnReceive,从而解决通信问题。 2、解决单线程传输阻塞的非“非阻塞”式方法在使用AfxBeginThread实现多线程的同时,也增加了诸如发送超时、接收超时等判断(使用Windows定时器SetTimer响应OnTime来实现),这一定程度上增强了程序的鲁棒性

27、文件的传输时阻塞式的,所以在主线程中直接传输文件必然导致界面卡死,所以这里我用到了多线程技术,为传输文件和接受文件分别开设线程. _ListenThreadUINT _ListenThread(LPVOID lparam)CSendFileDlg pDlg=(CSendFileDlg*)lparam;/创建服务器端套接字CSocket sockSrvr;if(!sockSrvr。Create(pDlgm_wPort+PORT)pDlgTransfersFailed();::MessageBox((HWND)lparam, pDlgGetError(GetLastError(), _T(”错误)

28、, MB_ICONHANDMB_OK);return -1;if(!sockSrvr.Listen()) /监听pDlgTransfersFailed();:MessageBox((HWND)lparam, pDlgGetError(GetLastError()), _T(错误), MB_ICONHAND|MB_OK);return -1;/接收套接字已经创建向主对话框发送自定义消息,该消息发送一个消息给发送方,可以开始传数据pDlgSendMessage(WM_ACCEPT_TRANSFERS);CSocket recSo;if(!sockSrvr。Accept(recSo) :Messag

29、eBox(HWND)lparam, pDlgGetError(GetLastError(), _T(”错误”), MB_ICONHAND|MB_OK);return 1;sockSrvr.Close();/调用主对话框类中的ReceiveFile成员函数进行文件的接受 pDlg-ReceiveFile(recSo);return 0; _SendThreadUINT _SendThread(LPVOID lparam)CSendFileDlg* pDlg=(CSendFileDlg*)lparam;/创建套接字CSocket sockClient;if(!sockClient。Create()

30、)pDlgTransfersFailed();::MessageBox(HWND)lparam, pDlgGetError(GetLastError(), _T(错误”), MB_ICONHAND|MB_OK);return 1;CString strIPAddress;UINT nPort;/获取对方地址pDlgm_psockClientGetPeerName(strIPAddress,nPort);/连接服务器if(!sockClient。Connect(strIPAddress,pDlg-m_wPort+PORT)pDlgTransfersFailed();:MessageBox((HW

31、ND)lparam, pDlg-GetError(GetLastError()), _T(”错误), MB_ICONHAND|MB_OK);return -1;/调用主对话框类进行文件发送pDlgSendFile(sockClient);return 0; 3、在文件传输前,提前让对方了解文件信息,以便对方判断是否接受文件。由于本工程实现了“文件传输与两端消息响应”的明确划分,该功能实现相当简单,只需要在发送端SelectFile之后向接收端发送一个“准备发送”的消息(该消息由于CMessage的封装,包含了文件的基本消息),该消息被接收后弹出对话框,由接收方来选择是否接受。接收端由接收方选择

32、对话框选项,根据MessageBox返回值IDOK或是IDCANCLE,若为IDOK,则发送一个Accpet消息给发送方,否则发送一个REFUSE回去,均由发送方的OnReceive虚函数处理,大致过程如下:七、设计结果1、服务器客户端的选择(服务器客户端集成) 说明:根据每个进程实例的用户选择RadioBox来更改界面外观 初始默认服务器:InitDialog时设置按钮文本及调用gethostname获取本机IPv4地址及设置端口号 根据用户选择响应RadioBox消息,若为客户端,则更改界面外观,同时内部变量“m_bIsCilent设置为TRUE(默认为FALSE),便于程序的后续工作2、

33、简单的文件传输及简单的传输控制 说明:文件的发送专门由两个线程完成,线程中创建用于文件传输的套接字,而文件的传输控制则由主界面响应消息来完成,分工明确3、设计思考题的回答套接字有基于阻塞和非阻塞的工作方式,试问你编写的程序是基于阻塞还是非阻塞的?各有什么优缺点? 答:本程序文件传输基于阻塞、传递文件控制消息基于非阻塞。1) 阻塞传输具有稳定性好,代码逻辑简单,编写程序方便的优点,但是阻塞传输效率低2) 非阻塞传输相对应的效率较高,但是编写程序较为复杂,传输也更难控制如何将上述通信改为非阻塞,避免阻塞? 答:在源代码采用Send发送文件和Receive来接收文件的基础上,改用OnReceive和

34、OnSend来响应文件发送和接收消息,结合MFC的CasyncSocket异步非阻塞套接字类来编程在传输前能否先将要传输的文件的相关属性现行报告给对方,以便对方判断是否接受该文件的传输? 答:由于本工程实现了“文件传输与两端消息响应的明确划分,该功能实现相当简单,只需要在发送端SelectFile之后向接收端发送一个“准备发送的消息(该消息由于CMessage的封装,包含了文件的基本消息),该消息被接收后弹出对话框,由接收方来选择是否接受。八、软件使用说明 打开一个进程实例后,一端选择服务器(默认为服务器),软件会自动调用库函数获取本机IPv4地址以及自动设置端口号,点击【启动】按钮开始监听客

35、户端的接入 客户端打开软件后,点选【客户端】,此时IP地址控件置空,用户输入正在监听的客户端的IP地址,必要时输入对应的端口号,点选【连接】,开始申请连接服务器。 连接选项设有超时器,超时会提示连接超时,成功后两端建立连接。连接成功后,两端的【选择文件】按钮点亮,可以选择文件发送.点击【选择文件】后弹出文件选择对话框,发送方成功选择文件,点击【确定】.此时启动发送超时器,超时显示超时。若成功,接收方弹出文件保存对话框,接收方选择好接收目录后点击【确定】,文件传输正式开始。 传输开始后,双方【停止传输】【取消】点亮,双发可以通过点选这两个按钮来进行传输控制.传输失败会提示失败消息。九、参考资料1

36、zhuyf87。TCP三次握手.博客园博客,2012.2 高传善,毛迪林,曹袖。计算机网络教程。高等教育出版社,2008。3 孙鑫。VC+深入详解。电子工业出版社,2006.十、验收时间及验收情况验收时间:2016.12.29验收情况:演示了文件传输的程序,从建立连接单选择文件再到传输文件,到终止传输,没有出现问题。通信方式是阻塞还是非阻塞的? 答:本程序使用了两对套接字,一对工作于阻塞方式,用于传输文件,由于阻塞,故开辟了线程供其传输,一对工作于非阻塞方式,通过响应来实现客户端服务器的消息控制.客户端服务器建立连接的过程?答:使用MFC的CSocket类简化C/S连接:服务器Create()

37、创建监听套接字,Listen()开始监听;服务器创建一个连接套接字,Connect()请求服务器连接,服务器OnAccept响应,并使用另外创建的套接字开始与客户端通信。程序的鲁棒性怎么样?答:程序在创建套接字,连接服务器等操作时用了比较多的错误检测与提示,比如在套接字创建过程:对Create()的返回值进行分析,如果是0则代表创建失败,立即调用GetLastError()分析错误原因,并使用MessageBox弹出提醒用户。 另外也使用了TRYCATCH块,增强程序的错误检测和恢复能力。十一、设计体会 1、之前写的程序大多都是“单机”的,这次工程的实践让我更加深入地了解了互联网程序的编写,认

38、识了Socket套接字的使用. 2、通过编写程序,在应用层面理解了TCP的“三次握手”,深切体会到了基于TCP连接的传输稳定性. 3、在设计时遇到了阻塞和非阻塞的选择,好在工程实现的时候,由于微软对Win_Sock的封装,结合CSocket、CSocketFile、CArchive三个类的使用,很好地简化了两端的通信问题,从而可以放心地把传输数据作为阻塞方式放到新开的线程中. 4、在工程初步完成的时候,把程序放到两台不处于一个局域网内的机子上,发现不能连接.通过课本的翻阅和网上资料的查询,了解了NAT以及NAT穿越技术,知道了许多基于互联网的技术都需要用到“NAT穿孔”。 5、文件传输涉及到了

39、很多的异常处理,在之前编写的大部分程序要么没有异常处理,要么单纯地使用if else解决,在本次工程中用到了一些TRY CATCH块,体会到了异常处理机制的重要性.路由器配置实验一、实验目的1. 认识路由器的端口、型号 2掌握路由器的路由配置 3. 理解网络互联的基本原理 二、实验环境与设备 本实验在 PC 机上利用模拟软件 Packet Tracer V6 进行操作. 三、实验内容 1。 路由器接口的配置 2。 静态路由配置 3. 默认路由配置 4。 动态路由配置 本次实验的主要任务是了解路由器的基本设置,和网络之间的连接关系。通过 这次的实验很好的掌握了各个网段之间的,各个路由器下的 pc

40、 的连接情况。通 过对静态,默认,动态路由配置,使得各个路由器下的 PC 相互通信.四、实验步骤1、路由器接口的配置 创建拓扑结构图:(1) 为主机 PC0,PC1,PC2 配置 IP 地址、子网掩码和默认网关。配置情况如下:IP地址和子网掩码的配置:(2) 为路由器的各个接口分配 IP 地址和子网掩码,交换机不用配置。 配置方法入下: WAN口配置:(3) 查看路由器的路由表使用命令:show ip route 显示路由表中的路由信息。保存此时路由器显示的路由信息,以便与后面的实验结果进行比较。 (C 表示直连路由)Router0 的路由表:Router1的路由表Router2的路由表(4)

41、测试主机之间的连通性PC0 与 PC2 的连通性: 可以看到PC0 ping不到PC2,可见PC0是不知道PC2的网段的PC1与PC2的连通性: 根据网关发回的消息,同样PC1是ping不到PC2的2。 配置静态路由(1)在 Router0 中添加一条到网络 192。168。3。0 的静态路由,命令如下:Router(config)#ip route 192.168.3。0 255.255。255。0 172.16.1。1(2)再去查看 Router0 路由表,与步骤(2)中的路由表进行对比,观察路由表的变化情况。 可以看到,路由器0多了一条S的路由信息,之后有目的为该IP的包到达路由器,路由

42、器就能根据路由表做出路由。(3)在 Router2 中添加一条到网络 192。168。1。0 的路由后,路由表如下:Router(config)ip route 192。168.1。0 255.255。255.0 172。16.1.2 同样,路由器1也增加了一条路由信息(4)测试 PC0 与 PC2 的连通性PC0 与 PC2 的连通性如下图: 可以看到,添加静态路由后PC0与PC2接通(5) 在 Router1 和 Router2 中各添加一条静态路由,以实现 PC1 与 PC2 的互通。路由器1增加静态路由:路由器2增加静态路由: 根据之前的实验,现在PC2和PC1应该能互相ping通了。P1 与 P2 的连通性: 由于来回经过两次路由器,TTL(128)-2=126(6)测试 PC0 与 PC1 的连通性 可以看到,PC0 ping不到PC1。查看 Router0 的路由表可知,其中不存在到达 PC1 所在网络(192。168。2.0)的路由,查看Router2 的路由表可知,其中不存在到达

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服