Socket主机与客户机通信难点

本文探讨了使用Socket传输大量视频数据时遇到的数据不完整及丢失问题。分析了TCP协议下Socket分包机制,并提出两种解决方案:一是通过循环接收确保所有数据被接收;二是利用MSG_WAITALL参数强制接收指定长度的数据。

         最近在研究视频传输,通过服务器将采集到的视频通过socket传输到远程终端,但每当建立好连接,服务器已经采集好数据,但将其通过send发送到终端,终端通过recv接受数据,但每次接受到的数据都不完整,大量数据丢失,很多书上只是接受了socket通信的方法 但没有提到大量数据传输时,数据丢失的解决办法和问题,恰巧我也遇到了,只是研究了一翻,发现原来socket发送数据时会讲数据进行分包出来,再TCP的数据格式中,最大的数据量为1500,所以每次接受的数据量默认最大的1500,如果你采用一次性read或者recv就可能导致接受到的数据丢失。

        解决办法有两个:一个是每次recv(socket_client,ptr,len,0),其中len<1500,然后反复写入,知道recv返回0,这样就把所以数据成功接受到了。

        或者将最后一个参数设置成MSG_WAITALL,这个参数的目的是强制一次接受len长度的数据,这样就不会受限制了。

实验指导手册 计 算 机 网 络 原 理 计算机软件学院 目录 实验项目1 局域网设计及仿真 1 1.1实验目的 1 1.2实验内容 1 1.3基本要求 2 1.4实验步骤 2 1.4.2 网络互联 5 (2)网络路由 6 (3)测试联通性 1 实验项目2 网络协议数据捕获及分析 1 3.1实验目的 1 3.2实验内容 1 3.3基本要求 1 3.4实验步骤 1 3.4.1 在Packet Tracer构建网络模型 1 实验项目3 socket网络编程 1 2.1实验目的 1 2.2实验内容 1 2.3基本要求 1 2.4 实验步骤 1 2.4.1 TCP编程 1 2.4.1 UDP编程 4 实验报告书写请登录:“http://172.31.36.37:8084/#/login” 报告书写要求: (1)根据实验拓扑结构自行规划网络结构和网络参数,并作详细记录。 (2)分析实验过程中出现的各种现象、问题,如何解决此类问题的方法也要记录下来。 (3)在实验过程中可以参考按表格内容完成实验任务和报告,也可以自行设计,但要记录关键数据。 实验项目1 局域网设计及仿真 1.1实验目的 能够在Packet Tracer模拟软件中进行网络系统模拟仿真。 理解交换机的工作原理,掌握局域网的规划构建的基本方法。 掌握IP地址的结构(网络部分主机部分的区分)及子网掩码的含义。 理解路由表的作用、基本结构以及路由器转发分组的机制。 1.2实验内容 利用网络仿真软件(如Packet Tracer等)进行网络规划设计,包括设计网络拓扑结构、网络设备选择、参数配置、数据分析等。具体实验内容如下: (1)利用Packet Tracer软件模拟一个局域网,需求为:给定一个24位前缀长度的网络(如192.168.1.0/24),对其进行子网划分,要求能够保证局域网1和局域网2 至少120台机器。另外整个网络通过ISP路由器连接Internet网络(表示有多个网络)如图1-1所示。 (2)合理规划各网络及各设备的IP地址。 (3)验证交换机的工作原理。 (4)给出路由器R1和R2的路由表。 (5)设置路由表,使得局域网1、局域网2能相互连通并能正常访问DNS-serv和Internet网络资源。 图 1-1 通过本实验使学生学会使用网络仿真软件的一般方法,理解交换机的工作原理,掌握局域网的规划构建的基本方法,能够借助网络仿真软件进行计算机网络系统模拟仿真,满足网络工程项目建设的需要。 1.3基本要求 (1)课前准备:仔细阅读实验指导书,详细规划实验过程和步骤,设计实验数据记录表,对相关知识做好预习和准备。 (2)实验过程:按照实验指导书要求,完成实验内容,记录好实验过程、关键数据和实验结果。 (3)实验报告:根据实验情况及时撰写实验报告,实验报告应包含实验目的、实验内容、实验步骤、实验数据及分析,以及实验总结等内容。 1.4实验步骤 本次实验是一个常见局部网络互联的内容。可分成两个环节进行: (1)局部网络的构建及交换机的工作原理。 (2)使用路由器把几个局部网络互联起来,并实现相互连通。 1.4.1局部网络模型的构建及交换机的工作原理 (1)单台交换机 在Packet Tracer软件中构建如图1-2所示的拓扑结构图。 图1-2 合理规划各主机的IP地址,完成表1-1 中各主机及设备接口的相关信息。 表1-1 设备连接信息及参数记录表 设备或接口 连接交换机的端口(FastEthernet0/0) IP地址 MAC地址 PC1 PC2 PC3 PC4 测试网络的连通性及交换机MAC地址映射表的变换情况 切换到“模拟器Simulation”模式,使用查看工具( )在交换机上单击,在弹出菜单中选择“MAC Table”查看交换机的MAC 表,此时MAC 表是空的,没有任何表项,如图1-3 所示。 图1-3 初始化时交换机的MAC 地址表 “模拟器Simulation”模式下编辑过滤器(点击“Edit Filters”),选择要查看的协议,选中“ARP”和“ICMP ”,如图1-4所示。 图1-4 设置过滤条件仅允许ICMP、ARP 协议报文 按照表1-2的结构测试个主机主机之间(按照表格中pc1pc2的模式自行规划)的连通性,观察交换机转发表的变化情况,并记录相关数据。 表 1-2 交换机工作原理及连通性测试表 源主机<-->目的主机 <-->:表示源主机和目的主机之间的通信 -->:表示源主机向目的主机发送数据 <--:表示目的主机向原主机响应(返回)数据 交换机MAC地址映射表变化情况 交换机收到数据帧的类型(单播、广播)及转发方式 MAC 地址 端口 PC1<-->PC2 PC1-->PC2 PC1<--PC2 从工具栏中选择“Add Simple PDU”工具( ),然后依次点击PC1、PC2,表示PC0 ping PC1(也可以切换到模拟器simulation模式下,然后打开PC机的命令行界面,输入ping 目标ip地址),但是此时PC1还没有PC2的ARP 表项。ARP 协议在ICMP 报文之前发送,用于学习目的IP地址对应的MAC 地址,只有学习到目的IP 地址对应的MAC 地址之后,协议栈才能正确的在IP 报文之前封装以太网帧头。所以此时PC1 首先发送一个ARP Request 报文。点击“Capture / Forward”按钮,可以一步一步观察ping 命令执行过程。 PC1 发送一个ARP Request 报文给交换机,交换机接收到PC1 的ARP Request 报文之后,将依据“基于接收帧的源MAC 地址学习”原则,添加一条MAC 表项。 PC2 回复ARP Reply 报文,交换机接收到该帧之后,将学习到PC2 的MAC 地址,并添加到MAC 表,如图1-5所示。 (3)多台交换机互联结构 在Packet Tracer软件中构建多台交换机互联的网络结构,例如图1-5所示的拓扑结构图(可以自行规划)。 图1-5 多台交换机互连 按照表1-3的结构测试个主机主机之间的连通性,观察交换机转发表的变化情况,并记录相关数据。 表 1-3 交换机工作原理及连通性测试表 源主机<-->目的主机 <-->:表示源主机和目的主机之间的通信 -->:表示源主机向目的主机发送数据 <--:表示目的主机向原主机响应(返回)数据 交换机MAC地址映射表变化情况 交换机收到数据帧的类型(单播、广播)及转发方式 Switch1 Switch2 Switch3 Mac地址 端口 Mac地址 端口 Mac地址 端口 PC1<-->PC2 PC1-->PC2 PC1<--PC2 问题:通过实验结果可以验证交换机的工作原理是? 1.4.2 网络互联 (1)构建网络结构并规划网络参数 利用Packet Tracer软件模拟一个局域网,需求为:给定一个24位前缀长度的网络(如192.168.1.0/24),对其进行子网划分,要求能够保证局域网1和局域网2 至少120台机器。实现局域网1、2、3之间的互联,并都能访问互联网(表示有多个网络),网络结构参考图1-6。 图1-6 网络结构参考图 合理规划各网络及各设备的IP地址,参照表1-6 的模式给出个主机、设备的连接信息及参数。 表1-6 每一台PC 配置IP 地址以及掩码 设备或接口 连接的设备及端口号 IP地址 子网掩码 MAC地址 PC1 Switch1 fa0/1接口 192.168.1.11 255.255.255.0 0060.5CA8.EC2B Switch1 fa0/3 Router1 fa0/0接口 --- --- --- Router1 fa0/0 Switch1 fa0/3 192.168.1.1 255.255.255.0 0060.5CA8.EC23 (2)网络路由 1)路由表(Routing Table):存储在路由器的内存中,用于指示路由器如何将IP数据包转发至正确目的地的信息表。路由表的基本结构如表1-5所示。 表1-7 路由表基本结构 Destination(目的地) Mask(掩码) Nexthop(下一跳) Interface(接口) destination :目的地址(网络、主机) mask(掩码):目的网络中的子网掩码 nexthop(地址):下一跳路由器的IP地址 interface(接口):该路由的发送接口名 2)路由表的形成 直连网段 配置IP地址,端口UP状态,形成直连路由。 直连路由:路由器接口所连接的子网的路由方式称为直连路由。 直连路由是由链路层协议发现的,该路径信息不需要网络管理员维护,也不需要路由器通过某种算法进行计算获得,只要该接口处于活动状态(Active),路由器就会把通向该网段的路由信息填写到路由表中去,直连路由无法使路由器获取其不直接相连的路由信息。 非直连网段 需要静态路由或动态路由,将网段添加到路由表中。 静态路由:由管理员手工配置、维护路由表。 3)根据需求分析,参照表1-7写出各路由器的路由表(每个路由器的路由表单独给出),使得局域网1、2、3能相互连通并能正常访问互联网络资源。 (3)测试联通性 按照表1-8的结构,测试不同网络之间的连通性,记录、分析相关数据。 表1-8 测试记录表 源主机<-->目的主机 <-->:表示源主机和目的主机之间的通信 -->:表示源主机向目的主机发送数据 <--:表示目的主机向原主机响应(返回)数据 数据在各设备上的封装情况(各设备根据自己网络拓扑实际情况填写,这里可以省略经过交换机转发的情况,只填写主机和路由器对数据的封装情况)。 原(发送)主机 经过的路由器 经过的路由器 原Mac地址原IP地址 目的Mac地址目的IP地址 进入端口及原Mac地址原IP地址、目的Mac地址目的IP地址 转发(输出)端口及原Mac地址原IP地址、目的Mac地址目的IP地址 进入端口及原Mac地址原IP地址、目的Mac地址目的IP地址 转发(输出)端口及原Mac地址原IP地址、目的Mac地址目的IP地址 PC1<-->PC2 PC1-->PC2 PC1<--PC2 实验项目2 网络协议数据捕获及分析 3.1实验目的 掌握以太网帧的格式及各字段的含义 掌握IP包的组成格式及各字段的含义 掌握UDP报文和TCP报文的格式及各字段的含义 理解HTTP协议、DNS协议、DHCP协议的工作机制 熟悉用户数据在网络各层之间的封装关系 3.2实验内容 利用网络仿真软件(如Packet Tracer等)进行网络规划设计,包括设计网络拓扑结构、网络设备选择、参数配置、数据分析等。具体实验内容如下: (1)利用Packet Tracer仿真软件搭建一个包含DNS、WWW、DHCP等服务的互联网。 (2)配置测试各种服务并测试连通性。 (3)捕获IP数据报、TCP报文段、HTTP报文、DNS报文、DHCP报文,识别和分析IP协议、TCP协议、UDP协议。了解TCP、UDP协议的数据传输机制。 通过本实验使学生学会使用网络仿真软件的一般方法,熟悉用户数据在整体网络中的活动和封装情况,能够运用网络协议分析工具获取网络流量,分析网络流量和协议结构解,理解各层协议的功能、作用及相互之间的关系,理解网络协议工作原理。 3.3基本要求 (1)课前准备:仔细阅读实验指导书,详细规划实验过程和步骤,设计实验数据记录表,对相关知识做好预习和准备。 (2)实验过程:按照实验指导书要求,完成实验内容,记录好实验过程、关键数据和实验结果。 (3)实验报告:根据实验情况及时撰写实验报告,实验报告应包含实验目的、实验内容、实验步骤、实验数据及分析,以及实验总结等内容。 3.4实验步骤 3.4.1 在Packet Tracer构建网络模型 建立如图3-1所示网络结构,根据图中标注的主机A、主机B、DNS服务器、WEB服务器和路由器接口(接口根据自己建立的网络拓扑结构的实际情况指定)的IP地址和子网掩码,正确配置各设备/接口的相关参数,完成表3-1内容,MAC地址请根据自己建立的网络拓扑图中每台PC实际的MAC地址如实填写(注意:MAC地址每个人的都不一样)。 建立如图2-1所示网络结构,路由器部分接口、本地域名服务器、DHCP服务器、WWW服务器主机1、主机H1、主机H2均采用静态IP地址配置,相关地址信息见图2-1中标注。主机2~主机N通过DHCP服务器动态获取IP地址等配置信息。在t₀时刻H1的ARP表和交换机S的交换表均为空,H1在此刻利用浏览器通过域名www.abc.com请求访问Web服务器,在t1时刻(t1>t₀)S第一次收到了封装HTTP请求报文的以太网帧,假设从t₀到t1期间网络未发生任何此次Web访问无关的网络通信。本地域名服务器(192.168.1.67)上建立了一条资源记录(A),域名为www.123.cn,IP地址为192.168.1.2。WWW服务器(192.168.1.2)上配置的默认文档为index.html。现有以太网交换机(无VLAN功能)和路由器两类网络互连设备可供选择。 图 2-1 网络结构图 (1)分析设备1和设备2分别应选择什么类型网络设备?设备1和设备2中,哪几个设备的接口需要配置IP地址?并为对应的接口配置正确的IP地址。 (2)在Packet Tracer模拟软件中建立网络结构,配置网络参数,并实现网络的连通。 1)详细记录个主机(包括服务器)或接口的TCP/IP参数,结构如表2-1所示。 表2-1 每一台PC 配置IP 地址以及掩码 设备或接口 IP地址 子网掩码 默认网关 MAC地址 域名服务器 2)给出相关路由器的路由表(每个路由器一个路由表),结构如表2-2所示。 表2-2 路由表结构 Destination(目的地) Mask(掩码) Nexthop(下一跳) Interface(接口) (3)为确保主机1~主机N、主机H1主机H2都能够访问Internet,R需要提供什么服务? (4)从t₀到t1期间,主机H1除了HTTP之外还运行了哪个应用层协议?从应用层到数据链路层,该应用层协议报文是通过哪些协议进行逐层封装的? (4)DHCP服务器可为主机2~主机N动态分配IP地址的最大范围是什么?请给出DHCP服务器主机2~主机N分配的IP地址池范围、默认网、子网掩码、DNS服务器等参数。主机2使用DHCP协议获取IP地址的过程中要经过那几个阶段,作用分别是什么?按表2-3的结构,写出每个阶段在不同层次数据封装的情况。 表2-3 主机2~主机在自动获取IP地址过程中数据的封装情况 数据链路层封装 网络层封装 传输层封装 目的MAC地址 源MAC地址 目的IP地址 原IP地址 目的端口 原端口             (6)若交换机S的交换表结构为<MAC地址,端口>,则t1时刻S交换表的内容是什么? (7)从t₀到t1期间,H2至少会接收到几个此次Web访问相关的帧?接收到的是什么帧?帧的目的MAC地址是什么? (8)若主机2的ARP表为空,则该主机访问Internet时,发出的第一个以太网帧的目的MAC地址是什么?封装主机2发往Internet的IP分组的以太网帧的目的MAC地址是什么? (9)若主机1(192.168.1.3)的子网掩码和默认网关分别配置为255.255.255.192和192.168.1.4,则该主机是否能访问WWW服务器(192.168.1.2)?是否能访问Internet?请说明理由。 (10)WWW服务器站点主目录下有index.html和123.html文档。 用户在主机H1的浏览器的地址栏里输入什么地址可以访问到WWW服务器的主页index.html? 用户在主机H1的浏览器的地址栏里输入什么地址可以访问到WWW服务器的主页123.html? (11)当用户在主机1(ARP表已缓存相关设备的IP地址MAC地址)的浏览器的地址栏里输入www.123.cn访问WWW服务器上的页面时,分析网络进行了那几个阶段的数据传输活动的处理,分析各阶段数据在不同结点(只关注原主机和经过的路由器,如图数据经过某个路由器传输,路由器分为进入方向数据封装和输出方向数据封装)上的各层的封装情况,完成表6所示内容。 表2-3 主机1在浏览器地址栏输入“www.123.cn”的数据封装记录表 数据传输方向(源-->目的或源<--目的)及数据所在结点。 例如: 主机A-->主机B,主机A。表示由主机A发送数据给主机B,数据在主机A上的封装。 数据链路层封装 网络层封装 传输层 应用层 说明此次通信的作用 目的MAC地址 源MAC地址 目的IP地址 原IP地址 何种协议 目的端口 原端口 何种应用 实验项目3 socket网络编程 报告书写要求:本实验项目有参考实例,同学们只能参考,不能使用实例中的参数和图片,否则报告按“0分”计算。 2.1实验目的 理解Socket的作业及Socket通信机制 熟悉Socket的类型及使用场景 掌握Socket的工作流程 能够熟练使用常见编程语言完成Socket网络应用程序的编写和调试 2.2实验内容 (1)运用特定的编程开发语言(C、Python、Java等),完成具体的应用层网络应用的开发; (2)使用TCP或UDP作为传输层的联网协议进行设计,并能够对比两种传输层协议在网络通信及协议开发中的区别; (3)网络应用层程序能够真正实现服务器的角色,并支持多个客户端同时接入,客户端之间通信互不干扰; (4)通过最终编译的可执行程序验证最初的实验目标,并总结相关的心得体会。 2.3基本要求 (1)课前准备:仔细阅读实验指导书,详细规划实验过程和步骤,设计实验数据记录表,对相关知识做好预习和准备。 (2)实验过程:按照实验指导书要求,完成实验内容,记录好实验过程、关键数据和实验结果。 (3)实验报告:根据实验情况及时撰写实验报告,实验报告应包含实验目的、实验内容、实验步骤、实验数据及分析,以及实验总结等内容。 2.4 实验步骤 2.4.1 TCP编程 (1)建立一个TCP服务器连接需要6个步骤(以Python为例) 创建socket对象。调用socket构造函数: socket=socket.socket(familly,type) family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字)、SOCK_RAW(raw套接字),TCP使用SOCK_STREAM参数。 将socket绑定(指派)到指定地址上,socket.bind(address) address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。 绑定后,必须准备好套接字,以便接受连接请求。 socket.listen(backlog) backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。 服务器套接字通过socket的accept方法等待客户请求一个连接: connection,address=socket.accept() 调用accept方法时,socket会进入'waiting'(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它客户通信;第二个元素(address)是客户的internet地址。 处理阶段,服务器和客户通过send和recv方法通信(传输数据)。 服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入'blocket'状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。 传输结束,服务器调用socket的close方法以关闭连接。 (2)建立一个TCP客户端连接则需要4个步骤 创建一个socket以连接服务器 socket=socket.socket(family,type) 使用socket的connect方法连接服务器 socket.connect((host,port)) 客户和服务器通过send和recv方法通信。 结束后,客户通过调用socket的close方法来关闭连接。 (3)建立TCP服务器TCP客户端程序 服务器程序: 创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。 客户端程序: 创建套接字,连接,等待输入,发送。 同一台电脑结果在两个shell中演示。 分TCP客户端TCP服务器通信过程中,TCP连接建立、数据传输、连接释放分别在什么地方触发。 2.4.1 UDP编程 由于UDP是无连接的,TCP的区别在服务器端表现为,无需监听函数listen()对客户端的连接进行监听; 在客户端的表现为客户端的socket无需服务器建立连接就能够进行数据的发送接收,即无需connect()函数。 (1)建立一个UDP服务器连接需要4个步骤(以Python为例) 创建socket对象。调用socket构造函数: socket=socket.socket(familly,type) family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字),UDP 使用SOCK_DGRAM参数。 将socket绑定(指派)到指定地址上,socket.bind(address) address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。 处理阶段,服务器和客户通过sendto()和recvfrom()方法通信(传输数据)。 传输结束,服务器调用socket的close方法以关闭连接。 建立UDP服务器程序: 创建套接字,开始监听,就是一个while循环一直监听有没有消息连接。 创建套接字,while循环一直监听有没有消息连接。 (2)建立一个UDP客户端连接则需要4个步骤 创建一个socket以连接服务器 socket=socket.socket(family,type) 使用socket的connect方法连接服务器 socket.connect((host,port)) 客户和服务器通过sendto()和recvfrom()方法通信。 结束后,客户通过调用socket的close方法来关闭连接。 (3)编写UDP服务器客户端程序 (4)运行效果 通过本实验项目,分析TCP协议和UDP协议各种的特点。
最新发布
11-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值