1、现代通信技术实验TCP通信实验现代通信技术试验报告(二)TCP通信实验学院:计算机学院班级:24010107班学号:*姓名:*日期:2015.05.14TCP 通信实验一、【实验目的】 1. 掌握 TCP 网络的基本原理; 2. 掌握使用 Socket 进行 TCP 网络开发的基本方法。 二、【实验设备】 1. 装有 Linux 系统或装有 Linux 虚拟机的 PC 机一台; 2. 物联网多网技术综合教学开发设计平台一套; 3. 串口线一条或 USB 线(A-B)。 三、【实验要求】 编写程序在实验箱上实现一个 TCP 服务器,实现接收网络数据并将收到的网络数据发送给客户端 的功能。四、【实
2、验原理】 1. TCP/IP 协议 TCP/IP 协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议,又叫网络通 信协议,这个协议是 Internet 国际互联网络的基础。 TCP/IP 是用于计算机通信的一组协议,我们通常称它为 TCP/IP 协议族。它是 70 年代中期美国国 防部为其 ARPANET 广域网开发的网络体系结构和协议标准,以它为基础组建的 INTERNET 是目前国 际上规模最大的计算机网络,正因为 INTERNET 的广泛使用,使得 TCP/IP 成了事实上的标准。 TCP/IP 是网络中使用的基本
3、的通信协议。虽然从名字上看 TCP/IP 包括两个协议,传输控制协议 (TCP)和网际协议(IP),但 TCP/IP 实际上是一组协议,它包括 TCP、IP、UDP、ICMP、RIP、TELNET、 FTP、SMTP、ARP、TFTP 等许多协议,这些协议一起称为 TCP/IP 协议。 TCP/IP 由四个层次组成:数据链路层、网络层、传输层、应用层,其分层模型及协议如表 1 所 示:表1-TCP/IP分层模型网络接口层(Network) 网络接口层是 TCP/IP 网络体系的最低层,负责通过网络发送 IP 数据报,或者从网络上接收物理帧, 抽出 IP 数据报,交给 IP 层。 网络层(Int
4、ernet) 网络层负责相邻计算机之间的通信。其功能包括三方面: 嵌入式网关实验 1) 处理来自传输层的分组发送请求,收到请求后,将分组装入 IP 数据报,填充报头,选择去往 信宿机的路径,然后将数据报发往适当的网络接口; 2) 处理输入 IP 数据报:首先检查其合法性,然后进行寻径假如该数据报已到达信宿机,则 去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报; 3) 处理路径、流控、拥塞等问题。 传输层(Transport) 传输层提供应用程序间的通信。其功能包括:1) 格式化信息流; 2) 提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如
5、分组丢失,必须 重新发送。 应用层(Application)) 应用层向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录使 用 TELNET 协议提供在网络其它主机上注册的接口。TELNET 会话提供了基于字符的虚拟终端。文件 传输访问 FTP 使用 FTP 协议来提供网络内机器间的文件拷贝功能。 2. TCP 协议简介 TCP(Transmission Control Protocol)协议是 TCP/IP 协议栈中的传输层协议,它通过序列确认以及 包重发机制,提供可靠的数据流发送和到应用程序的虚拟连接服务。与 IP 协议相结合,TCP 组成了因 特网协议的核心。
6、 由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的网络终端上的软件程 序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用 TCP 的“端口号” 完成的。网络 IP 地址和端口号结合成为唯一的标识,称为“套接口”或“端点”。TCP 在端点间建立连 接或虚拟电路进行可靠通信。 TCP 服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用等技术。TCP 通过面 向连接的、端到端的可靠数据报发送来保证可靠性。TCP 在字节上加上一个递进的确认序列号来告诉 接收者发送者期望收到的下一个字节。如果在规定时间内,没有收到关于这个包的确认响应,TCP 将 重
7、新发送此包。TCP 的可靠机制允许设备处理丢失、延时、重复及读错的包。超时机制允许设备监测 丢失包并请求重发。同时,TCP 提供了有效流控制。当向发送者返回确认响应时,接收 TCP 进程就会 说明它能接收并保证缓存不会发生溢出的最高序列号。 3. Linux 下的 Socket 编程Socket 是 TCP/IP 协议传输层所提供的接口(称为套接口),供用户编程访问网络资源,它是使用标 准 UNIX 文件描述符和其他程序通信的方式。Linux 的套接口通信模式与日常生活中的电话通信非常类 似,套接口代表通信线路中的端点,端点之间通过通信网络来相互联系。Socket 接口被广泛应用并成为 事实上
8、的工业标准。它是通过标准的 UNIX 文件描述符和其他程序通信的一个方法。按其应用,套接口 主要有以下两种分类: 流式套接口(Stream Socket) 数据报套接口(Datagram Socket) 流式套接口采用 TCP 协议通信,而数据报套接口采用 UDP 协议通信。 4. 本次实验实验原理:本实验需要实现一个 TCP 服务器,该服务器将一直监听某一端口,等待客户端发起的连接请求。 当客户端与实验箱的服务器端建立 TCP 连接后,客户端如果向服务器端发送数据,则服务器端收到数 据后会将数据重新发送给客户端。TCP 服务器的程序流程如图1所示。图1-TCP服务器程序流程图五、【实验步骤】
9、 1.按照实验原理的描述编写程序,并保存为.c后缀的源程序文件,文件名为:ex07_TCPEchoSever.c;2.准备设置PC 端的环境,准备工作包括:实验箱与 PC 的硬件连接、串口通信软 件设置、网络环境设置;(1)实验箱与 PC 的硬件连接:一般情况下,实验箱同时需要两种方式与 PC 建立连接:串口和以太网。首先使用标准 9 针串口线, 将实验仪的 UART0 与 PC 的串口相连;然后,使用实验箱附带的网线,将实验箱的以太网接口与 PC 的网卡直接相连,或者将实验箱与路由器相连。这样就完成了硬件连接,如图 2 所示。 图2-实验箱与PC的基本硬件连接(2)串口通信软件设置 在 PC
10、 端需要使用串口通信软件来对实验箱进行控制。通常情况下,使用 Windows 系统自带的“超 级终端”工具即可(或者用户也可以使用其他同类型的软件,这里仅针对“超级终端”做详细设置说明)。 首先在“开始”菜单中,找到“程序” “附件” “通讯” “超级终端”,如图 3所示。图3-打开超级终端1、设置超级终端名称,任意名称即可,如图 4:图4-设置连接名称2、选择串口COM1,如图5:图5-选择连接的串口3、设置串口属性,每秒位数设置为 115200,数据流控制选择无,如图6:图6-设置所选的串口的属性4、将物联网多网设计平台的电源打开,A8 实验仪的拨动开关拨至“ON”,并按下实验仪上的“Po
11、wer”键,可以在超级终端中看到图 7 所示的启动提示信息:图7-U-boot启动界面5、待系统正常启动之后,可以看到“SAPP210.XXXX login:”的提示,等待用户登录,如图 8 所示: 图8-Linux启动完成6、按下 Enter 键,进入登陆,输入用户名“root”,密码“111111”,成功登录到系统:图9-登陆到linux成功(3)、网络环境设置 使用手动配置实验仪 IP 地址的方法必须设置电脑为静态 IP:点击打开网上邻居的属性,查看本地连接的属性,点击查看“Internet协议(TCP/IP)”的属性:图10-查看“Internet协议(TCP/IP)”在弹出的“Int
12、ernet 协议 (TCP/IP) 属性”对话框中,按照如图 11 设置 IP,单击“确定”按钮, 为电脑设置好静态 IP :192.168.87.1,如图11:图11-设置电脑的静态IP(4)配置实验仪 IP 地址 在超级终端中,执行命令“ipconfig eth0 -i 192.168.87.130 -m 255.255.255.0 -g 192.168.87.1”,为实验箱手动配置 IP 地址,如图 12所示:图12-手动配置实验箱的IP地址设置完成后,需要执行“service network restart”命令重启网络服务,使设置生效,如图 13所 示。需要注意的是,实验箱的 IP
13、地址需要设置为与电脑同一个网段:图13-重启网络服务查看当前实验箱的IP地址为,执行命令“ifconfig eth0”,查看结果如图14:图14-查看实验箱当前IP地址3.在 Ubuntu 的环境下,编译嵌入式C程序,打开Ubuntu终端工具,输入编译命令“arm-linux-gcc -0 ex07TCPEchoSever ex07_TCPEchoSever.c”,编译实验程序,如图15:图15-Ubuntu编译目标程序查看编译结果,生成新的文件:ex07_TCPEchoServer 文件;将编译好的可执行程序文件从 Ubuntu 中复制到 Windows 系统,然后打开“我的电脑”,在地 址
14、栏中输入“ftp:/192.168.87.1”,并将上面生成的ex07_TCPEchoServer 文件拷贝到该目录下, 如图 16 所示:图16-拷贝执行文件到对应目录4、为执行文件增加权限并执行该文件如图17:图17-增加权限并执行5、在 PC 的 windows 环境下, 开始-运行,输入 cmd 回车后,进入到命令行模式,输入“telnet 192.168.87.130 8000”命令,TCP 访问实验箱运行的 ex07_TCPEchoServer 运行程序,如图 18 所 示: 图18-远程 telnet 访问实验箱 8000 端口的 TCP 服务器 6、在 telnet 客户端内输
15、入字符具体现象如图19所示: 图19-TCP 实验运行结果 六、【实验中的问题小结及实验总结】问题:(1)、在设置电脑的静态IP的过程中,出现本地连接internet协议属性打不开的情况,后来关掉实验室教学管理系统,就正常了;(2)、在Ubuntu下终端工具输入编译命令,编译嵌入式源文件时提示不存在该文件,后来发现是因为没有进入到源文件所在的目录下面,使用cd 命令进入之后,编译命令可以正常执行。(3)在设置实验箱的IP地址时,第一次设置失败,后来改变了后几位主机号部分,避免了与网络中其他实验箱的IP重合;(4)在执行命令telnet访问TCP服务时出现失败的情况,后来发现是windows的t
16、elnet功能没有开启,开启之后运行正常。总结:通过本次TCP通信实验的完成,了解了TCP网络的基本原理,和使用Socket 进行 TCP 网络开发的基本方法;对于Ubuntu系统有了一定的了解,掌握了对于使用Ubuntu编译执行嵌入式c程序的方法;通过实验的完成,也对于嵌入式开发环境的搭建有了一定了解,掌握了搭建开发环境的基本步骤和配置方法等;七、【源程序】#include #include #include #include #include #include static unsigned short port = 8000; /定义端口号为8000int main(int argc,
17、char *argv) char *recvBuffer = (char *)malloc(4002); /非配数据接收内存 int recvLen; int listenfd, connfd; struct sockaddr_in serverAddr, clientAddr; int clientAddrSize; printf(TCP Echo Server Startedn); / Create a TCP socket connection listenfd = socket(AF_INET, SOCK_STREAM, 0); /将套接口由主动转为被动 if(listenfd = -
18、1) printf(Invalid socketn); exit(1); /socket地址赋值 bzero(&serverAddr, sizeof(serverAddr); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); printf(Binding server socket to port %dn, port); /为本地协议地址绑定socket端口 if(bind(listenfd, (struct so
19、ckaddr*)&serverAddr, sizeof(struct sockaddr) = -1) printf(Bad bindn); exit(1); if(listen(listenfd, 1) = -1) / Allow 1 queued requests printf(Bad listenn); exit(1); printf(Accepting connections(Max 1 connections).n); for(;) clientAddrSize = sizeof(struct sockaddr_in); /阻塞等待客户端的连接 connfd = accept(listenfd, (struct sockaddr *)&clientAddr, &clientAddrSize); if(connfd = -1) printf(Bad acceptn); exit(1); /接收PC机发来的数据并发送回去 while(recvLen = recv(connfd, recvBuffer, 4000, 0) 0) send(connfd, recvBuffer, recvLen, 0); printf(Connection closed.n); close(connfd); return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1