计算机网络2.1

实验内容

  1. 操作系统附带的标准 Ping 命令使用 ICMP 进行通信,本实验要求学生编程实现一个简单的,非标准的,基于 UDP 进行通信的 Ping 程序。学生需要用 Python 编写一个 Ping 客户端。客户端程序发送一个 ping 报文,然后接收一个从已经提供的服务器上返回的对应 pong 报文,并计算出从该客户发送 ping 报文到接收到 pong 报文为止的往返时延(Round-Trip Time,RTT)。
  2. 在客户端程序一次执行过程中,学生编写的的 Ping 客户端程序需经 UDP 向服务器发送 10 个ping 报文。对于每个报文,当对应的 pong 报文返回时,客户端程序要确认并打印输出 RTT值;在整个执行过程中,客户端程序需要考虑分组丢失情况,客户端最多等待 1 秒,超过该时长则打印丢失报文。

代码说明

服务端代码server.py

import random
from socket import *serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', 12000))
while True:rand = random.randint(0, 10)message, address = serverSocket.recvfrom(1024)message = message.upper()if rand < 4:continueserverSocket.sendto(message, address)

客户端代码client.py

from socket import *
from time import time# 创建socket套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)# 设置超时时间为1s
udpSocket.settimeout(1)# 准备接收方的地址
sendAddress = ("127.0.0.1", 12000)# 总的包的个数
total_data = 10get_data_counts = 0  # 接收包的个数
max_RIT = 0.000  # 最大RIT时间
min_RIT = 1.000  # 最短RIT时间
total_RIT = 0.000  # 总的时间
sendData = 1  # 发送的消息while sendData <= total_data:begin_time = time()udpSocket.sendto(str(sendData).encode(), sendAddress)try:receiveData = udpSocket.recvfrom(1024)run_time = time() - begin_timeprint("RIT time:", run_time, "s")print(receiveData)get_data_counts += 1min_RIT = min(min_RIT, run_time)max_RIT = max(max_RIT, run_time)total_RIT += run_timeexcept Exception as e:print('Time out!!!!')sendData += 1print("max_time:", max_RIT, "s")
print("min_time:", min_RIT, "s")
print("avg_time:", total_RIT / get_data_counts, "s")
print("average packet loss rate:", (float)(get_data_counts) / total_data * 100, "%")udpSocket.close()

实验过程

  1. 启动服务端server,py代码
  2. 启动客户端client,py代码
  3. 观察和计算平均RIT时间和平均丢包率

实验结果和改进措施

实验结果

RIT time: 0.0002722740173339844 s
(b'1', ('127.0.0.1', 12000))
RIT time: 0.0001609325408935547 s
(b'2', ('127.0.0.1', 12000))
Time out!!!!
RIT time: 0.00022411346435546875 s
(b'4', ('127.0.0.1', 12000))
RIT time: 7.915496826171875e-05 s
(b'5', ('127.0.0.1', 12000))
RIT time: 6.890296936035156e-05 s
(b'6', ('127.0.0.1', 12000))
Time out!!!!
Time out!!!!
RIT time: 0.000347137451171875 s
(b'9', ('127.0.0.1', 12000))
Time out!!!!
max_time: 0.000347137451171875 s
min_time: 6.890296936035156e-05 s
avg_time: 0.00019208590189615885 s
average packet loss rate: 60.0 %

改进措施

  1. 由于本次实验我只仅仅发送10个数据包。由于数据包数量过少,并不能很好地模拟出丢包率,所以为了更好地模拟丢包率。我将发送的数据包增加到了100。以下是部分实验结果


由此可见,当发送的数据包足够大时,平均丢包率为70%

实验中问题以和解决方法

实验中遇到的问题:

  1. 判断该请求是否超时
  2. 怎么精确计算RIT时间

解决方法:

  1. 使用socket的内置函数settimeout来判断请求是否超时,并捕获异常打出超时
  2. 利用python内置模块time获取发送和接受数据的时间戳,相减得到RIT时间

不同网络环境下的测试结果

  1. server.py放在我的云服务器主机122.9.33.112
  2. python运行
  3. 本机开始ping

python socket ICMP 进行通信相关推荐

  1. python通信原理实验报告_【Python之旅】第五篇(一):Python Socket通信原理-阿里云开发者社区...

    只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理. 1.Socket socket也称作"套接字",用于描述IP地 ...

  2. Python Socket网络编程(二)局域网内和局域网与广域网的持续通信

    目录 前言 IP地址 简介 公有IP 私有IP 局域网之间网络通信 前提 功能描述 源码 运行结果 局域网与广域网网络通信 前提 源码 结语 前言 本系列博客是笔者学习Python Socket的过程 ...

  3. python socket编程之双方相互通信简单实例_扣丁学堂Python开发socket实现简单通信功能实例...

    扣丁学堂Python开发socket实现简单通信功能实例 2018-08-21 14:12:38 747浏览 今天扣丁学堂Python培训老师给大家结合实例介绍一下关于socket实现的简单通信功能, ...

  4. python socket通信 recv 丢包_用clumsy模拟丢包测试socket库的失败重传

    用python的socket库写了通信小程序,现在我需要通过软件模拟出在网络极差的情况下,socket底层解决丢包问题的能力怎么样,我一开始想的是分别在linux和windowns下分别测试,后来一想 ...

  5. python socket双向通信_Python socket实现多对多全双工通信的方法

    服务器:#server.py #!/usr/bin/env python #-*-coding:utf-8-*- import sys import struct#将字符串打包为二进制流进行网络传输 ...

  6. Arduino-ESP32通过socket和python或MFC进行通信,点灯和温湿度

    #include <WiFi.h> #include <WiFiClient.h> #include <ArduinoJson.h>const char* ssid ...

  7. python socket 说明

    一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...

  8. Python Socket 网络通信详解

    Python 模块 Socket 网络通信 文章目录 Python 模块 Socket 网络通信 1. socket介绍 2. Socket 类型 3. Socket 函数 3.1 服务器端 Sock ...

  9. Python Socket套接字编程

    网络模型的简介 网络技术是从1990年代中期发展起来的新技术,它把互联网上分散的资源融为有机整体,实现资源的全面共享和有机协作,使人们能够透明地使用资源的整体能力并按需获取信息,资源包括高性能计算机. ...

最新文章

  1. Newtonsoft.Json文件错误
  2. VMware vCenter 6.0 安装及群集配置介绍
  3. C++手动实现库函数
  4. CityEngine Web Scene如何在IIS下部署
  5. 非阻塞式异步Java 8和Scala的Try / Success / Failure
  6. 亿佰特串口服务器接入阿里云MQTT协议的软件配置教程
  7. Microsoft SQL Server 2005数据库安装
  8. 换一种方式“写代码 编程序“,为自己的程序生涯找条新路
  9. java浮点运算很难_关于Java:浮点运算不能产生精确结果
  10. 进程状态-Linux ps命令详细参数
  11. php解析视频_YY神曲视频PHP解析调用代码
  12. duet display连接不上怎么办
  13. Python基础知识从hello world 开始(第四天完结)
  14. 怎么把多个图片转成一个文字版的Word呢
  15. Android编译命令m、mm、mmm区别及工程搭建示例
  16. JVM学习四:垃圾收集器与内存回收策略
  17. “展厅三维全景”技术,将产品和企业文化以vr展示出来
  18. Mac上最强大的截图软件-xnip
  19. vue2关于引入字体的步骤
  20. 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)

热门文章

  1. Linux 常用工具(上)
  2. todoList案例(vue版本)之编辑todo(vuex实现)
  3. ucosiii使用两个串口调试记录
  4. 有限扩散集团凝聚模型(DLCA)第三讲:流动水流中的凝聚模拟(1)
  5. 【2020学年】电子科大AISC大作业
  6. 加载超大超长图片(本地、在线)---使用第三方subsampling-scale-image-view
  7. 魅族u20怎么刷Android,魅族魅蓝U20刷机教程-魅族魅蓝U20专用线刷ROM包下载
  8. 使用Frida rpc抓取酷安app
  9. ES历史索引清理:脚本手动
  10. 单位冲激信号 matlab,matlab里如何表示冲激信号