Wireshark实验

实验1 HTTP抓包

实验目标:抓取HTTP请求和响应
基本工具:分组嗅探器,用来被动的拷贝计算机发送和接收的报文。
分组嗅探器架构:
image.png
分组捕获器由于是复制的数据链路层的数据,所以链路层以及其上层协议的信息都被捕获了。
分组分析器按照数据链路层、网络层、应用层的顺序将分组逐层拆解,分析各层包含的信息。

实验步骤

  1. 安装WireShark
  2. 启动WireShark,在主界面选择接口

由于只有无线网络,所以选择wireless
image.png
选择这个有起伏的接口
image.png

  1. 在浏览器输入:http://gaia.cs.umass.edu/wireshark-labs/INTRO-wireshark-file1.html
  2. 在筛选栏中输入:http,获取http报文

image.png

  1. 查看http报文数据

image.png

实验2 DNS

使用nslookup来查询指定域名的IP地址和权威DNS服务器:
image.png

socket实验

实验1

实验要求:

在这个编程作业中,你将用Python语言开发一个简单的Web服务器,它仅能处理一个请求。具体而言,你的Web服务器将:

  1. 当一个客户(浏览器)联系时创建一个连接套接字;
  2. 从这个连接套接字接收HTTP请求;
  3. 解释该请求以确定所请求的特定文件;
  4. 从服务器的文件系统获得请求的文件;
  5. 创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行;
  6. 经TCP连接向请求浏览器发送响应。如果浏览器请求一个在该服务器种不存在的文件,服务器应当返回一个“404 Not Found”差错报文。

查看本机IP地址:
终端输入:ifconfig | grep “inet”

实验步骤

  1. 编写server.py

    1. #encoding=UTF-8
    2. from socket import *
    3. serverSocket = socket(AF_INET, SOCK_STREAM)
    4. #Prepare a sever socket
    5. serverSocket.bind(('', 8080)) # 将TCP欢迎套接字绑定到指定端口
    6. serverSocket.listen(1) # 最大连接数为1
    7. while True:
    8. #Establish the connection
    9. print ('Ready to serve...')
    10. connectionSocket, addr = serverSocket.accept() # 接收到客户连接请求后,建立新的TCP连接套接字
    11. try:
    12. message = connectionSocket.recv(1024) # 获取客户发送的报文
    13. filename = message.split()[1]
    14. f = open(filename[1:])
    15. outputdata = f.read()
    16. #Send one HTTP header line into socket
    17. header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n'
    18. % (len(outputdata))
    19. connectionSocket.send(header.encode())
    20. #Send the content of the requested file to the client
    21. for i in range(0, len(outputdata)):
    22. connectionSocket.send(outputdata[i].encode())
    23. connectionSocket.close()
    24. except IOError:
    25. #Send response message for file not found
    26. header = ' HTTP/1.1 404 Found'
    27. connectionSocket.send(header.encode())
    28. # 返回错误后关掉server,防止手动关闭端口未释放
    29. serverSocket.close()
    30. break
  2. 创建html文档(与py文件在同一个目录)

  3. 运行server.py
  4. 在浏览器输入:http://128.238.251.26:8080/HelloWorld.html,IP地址为本机的IP地址

实验2

实验要求:

在这个编程作业中,你将用Python编写一个客户ping程序。该客户将发送一个简单的ping报文,接受一个从服务器返回的pong报文,并确定从该客户发送ping报文到接收到pong报文为止的时延。该时延称为往返时延(RTT)。由该客户和服务器提供的功能类似于在现代操作系统中可用的标准ping程序,然而,标准的ping使用互联网控制报文协议(ICMP)(我们将在第4章中学习ICMP)。此时我们将创建一个非标准(但简单)的基于UDP的ping程序。 你的ping程序经UDP向目标服务器发送10个ping报文,对于每个报文,当对应的pong报文返回时,你的客户要确定和打印RTT。因为UDP是一个不可靠协议,由客户发送的分组可能会丢失。为此,客户不能无限期地等待对ping报文的回 答。客户等待服务器回答的时间至多为1秒;如果没有收到回答,客户假定该分组丢失并相应地打印一条报文。 在此作业中,我们给出服务器的完整代码(在配套网站中可以找到。你的任务是编写客户代码,该代码与服务器代码非常类似。建议你先仔细学习服务器的代码,然后编写你的客户代码,可以不受限制地从服务器代码中剪贴代码行。

UDPPingerServer.py

  1. # encoding=UTF-8
  2. from socket import *
  3. import random # random包用来模拟UDP包的随机丢失情况
  4. import time
  5. serverSocket = socket(AF_INET, SOCK_DGRAM)
  6. serverSocket.bind(('', 12000))
  7. while True:
  8. rand = random.randint(0, 10)
  9. message, address = serverSocket.recvfrom(1024)
  10. time.sleep(0.05) # 防止数据返回过快全是0.000s
  11. message = message.upper() # 将客户端消息大写化
  12. # 如果rand小于4,将视为数据包丢失
  13. if rand < 4:
  14. continue
  15. serverSocket.sendto(message, address)

UDPPingerClient.py

  1. # encoding=UTF-8
  2. from socket import *
  3. import time
  4. serverName = '10.30.37.31'
  5. serverPort = 12000
  6. clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建使用IPv4协议的UDP套接字
  7. clientSocket.settimeout(1) # 设置socket超时为1s
  8. for i in range(0, 10):
  9. sendtime = time.time() # 记录当前时间
  10. message = ('Ping %d %s' % (i+1, sendtime)).encode()
  11. try:
  12. clientSocket.sendto(message, (serverName, serverPort)) # 将信息发送到服务器的套接字
  13. modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
  14. rtt = time.time() - sendtime # 计算往返时间
  15. print('Sequence %d: Reply from %s, RTT = %.3fs' % (i+1, serverAddress, rtt))
  16. except Exception as e:
  17. print('Sequence %d: Rquest timeout' % (i+1))
  18. clientSocket.close()

实验4

实验要求:

您的任务是开发一个能够缓存网页的小型Web代理服务器。这是一个很简单的代理服务器,它只能理解简单的GET请求,但能够处理各种对象 —— 不仅仅是HTML页面,还包括图片。 客户端发送的请求消息和Web服务器返回的响应消息都要经过代理服务器。代理程序接收用户的GET请求,若请求的内容发已存在于代理服务器,则直接返回内容,若不存在,则转发该请求到目标服务器,接收目标服务器的响应,并将响应内容存储为文件,作为缓存,已被之后同样的请求。

实验步骤:

  1. 编写WebProxy.py ```python

    coding:utf-8

    from socket import *

创建socket,绑定到端口,开始监听

tcpSerPort = 8989 tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind((‘’, tcpSerPort)) tcpSerSock.listen(5)

while True:

  1. # 开始从客户端接收请求
  2. print('Ready to serve...')
  3. tcpCliSock, addr = tcpSerSock.accept()
  4. print('Received a connection from: ', addr)
  5. message = tcpCliSock.recv(4096).decode()
  6. # 从请求中解析出filename
  7. filename = message.split()[1].partition("//")[2].replace('/', '_')
  8. fileExist = "false"
  9. print(filename)
  10. try:
  11. # 检查缓存中是否存在该文件
  12. f = open(filename, "r")
  13. # 读取成功
  14. outputdata = f.readlines()
  15. fileExist = "true"
  16. print('File Exists!')
  17. # 缓存中存在该文件,把它向客户端发送
  18. for i in range(0, len(outputdata)):
  19. tcpCliSock.send(outputdata[i].encode())
  20. print('Read from cache')
  21. # 缓存中不存在该文件,异常处理
  22. except IOError:
  23. print('File Exist: ', fileExist)
  24. if fileExist == "false":
  25. # 在代理服务器上创建一个tcp clientSocket,此时代理服务器为client
  26. print('Creating socket on proxyserver')
  27. c = socket(AF_INET, SOCK_STREAM)
  28. hostn = message.split()[1].partition("//")[2].partition("/")[0]
  29. print('Host Name: ', hostn)
  30. try:
  31. # 连接到远程服务器80端口
  32. c.connect((hostn, 80))
  33. print('Socket connected to port 80 of the host')
  34. # 转发请求并接收响应
  35. c.sendall(message.encode())
  36. buff = c.recv(4096)
  37. # 转发远程服务器响应
  38. tcpCliSock.sendall(buff)
  39. # 将响应文件加入缓存
  40. tmpFile = open("./" + filename, "w")
  41. tmpFile.writelines(buff.decode().replace('\r\n', '\n'))
  42. tmpFile.close()
  43. except:
  44. print("Illegal request")
  45. else:
  46. # HTTP response message for file not found
  47. # Do stuff here
  48. print('File Not Found...Stupid Andy')
  49. # Close the client and the server sockets
  50. tcpCliSock.close()

tcpSerSock.close() ```

  1. 修改web代理

image.png

  1. 运行代理WebProxy.py
  2. 在浏览器输入:http://gaia.cs.umass.edu/wireshark-labs/INTRO-wireshark-file1.html
  3. 终端得到:

image.png

  1. 发现目录下新建了html文档

image.png

  1. 刷新网页,终端得到:

image.png