Wireshark实验
实验1 HTTP抓包
实验目标:抓取HTTP请求和响应
基本工具:分组嗅探器,用来被动的拷贝计算机发送和接收的报文。
分组嗅探器架构:
分组捕获器由于是复制的数据链路层的数据,所以链路层以及其上层协议的信息都被捕获了。
分组分析器按照数据链路层、网络层、应用层的顺序将分组逐层拆解,分析各层包含的信息。
实验步骤
- 安装WireShark
- 启动WireShark,在主界面选择接口
由于只有无线网络,所以选择wireless
选择这个有起伏的接口
- 在浏览器输入:http://gaia.cs.umass.edu/wireshark-labs/INTRO-wireshark-file1.html
- 在筛选栏中输入:http,获取http报文

- 查看http报文数据
实验2 DNS
使用nslookup来查询指定域名的IP地址和权威DNS服务器:
socket实验
实验1
实验要求:
在这个编程作业中,你将用Python语言开发一个简单的Web服务器,它仅能处理一个请求。具体而言,你的Web服务器将:
- 当一个客户(浏览器)联系时创建一个连接套接字;
- 从这个连接套接字接收HTTP请求;
- 解释该请求以确定所请求的特定文件;
- 从服务器的文件系统获得请求的文件;
- 创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行;
- 经TCP连接向请求浏览器发送响应。如果浏览器请求一个在该服务器种不存在的文件,服务器应当返回一个“404 Not Found”差错报文。
查看本机IP地址:
终端输入:ifconfig | grep “inet”
实验步骤
编写server.py
#encoding=UTF-8from socket import *serverSocket = socket(AF_INET, SOCK_STREAM)#Prepare a sever socketserverSocket.bind(('', 8080)) # 将TCP欢迎套接字绑定到指定端口serverSocket.listen(1) # 最大连接数为1while True:#Establish the connectionprint ('Ready to serve...')connectionSocket, addr = serverSocket.accept() # 接收到客户连接请求后,建立新的TCP连接套接字try:message = connectionSocket.recv(1024) # 获取客户发送的报文filename = message.split()[1]f = open(filename[1:])outputdata = f.read()#Send one HTTP header line into socketheader = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n'% (len(outputdata))connectionSocket.send(header.encode())#Send the content of the requested file to the clientfor i in range(0, len(outputdata)):connectionSocket.send(outputdata[i].encode())connectionSocket.close()except IOError:#Send response message for file not foundheader = ' HTTP/1.1 404 Found'connectionSocket.send(header.encode())# 返回错误后关掉server,防止手动关闭端口未释放serverSocket.close()break
创建html文档(与py文件在同一个目录)
- 运行server.py
- 在浏览器输入: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
# encoding=UTF-8from socket import *import random # random包用来模拟UDP包的随机丢失情况import timeserverSocket = socket(AF_INET, SOCK_DGRAM)serverSocket.bind(('', 12000))while True:rand = random.randint(0, 10)message, address = serverSocket.recvfrom(1024)time.sleep(0.05) # 防止数据返回过快全是0.000smessage = message.upper() # 将客户端消息大写化# 如果rand小于4,将视为数据包丢失if rand < 4:continueserverSocket.sendto(message, address)
UDPPingerClient.py
# encoding=UTF-8from socket import *import timeserverName = '10.30.37.31'serverPort = 12000clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建使用IPv4协议的UDP套接字clientSocket.settimeout(1) # 设置socket超时为1sfor i in range(0, 10):sendtime = time.time() # 记录当前时间message = ('Ping %d %s' % (i+1, sendtime)).encode()try:clientSocket.sendto(message, (serverName, serverPort)) # 将信息发送到服务器的套接字modifiedMessage, serverAddress = clientSocket.recvfrom(1024)rtt = time.time() - sendtime # 计算往返时间print('Sequence %d: Reply from %s, RTT = %.3fs' % (i+1, serverAddress, rtt))except Exception as e:print('Sequence %d: Rquest timeout' % (i+1))clientSocket.close()
实验4
实验要求:
您的任务是开发一个能够缓存网页的小型Web代理服务器。这是一个很简单的代理服务器,它只能理解简单的GET请求,但能够处理各种对象 —— 不仅仅是HTML页面,还包括图片。 客户端发送的请求消息和Web服务器返回的响应消息都要经过代理服务器。代理程序接收用户的GET请求,若请求的内容发已存在于代理服务器,则直接返回内容,若不存在,则转发该请求到目标服务器,接收目标服务器的响应,并将响应内容存储为文件,作为缓存,已被之后同样的请求。
实验步骤:
创建socket,绑定到端口,开始监听
tcpSerPort = 8989 tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind((‘’, tcpSerPort)) tcpSerSock.listen(5)
while True:
# 开始从客户端接收请求print('Ready to serve...')tcpCliSock, addr = tcpSerSock.accept()print('Received a connection from: ', addr)message = tcpCliSock.recv(4096).decode()# 从请求中解析出filenamefilename = message.split()[1].partition("//")[2].replace('/', '_')fileExist = "false"print(filename)try:# 检查缓存中是否存在该文件f = open(filename, "r")# 读取成功outputdata = f.readlines()fileExist = "true"print('File Exists!')# 缓存中存在该文件,把它向客户端发送for i in range(0, len(outputdata)):tcpCliSock.send(outputdata[i].encode())print('Read from cache')# 缓存中不存在该文件,异常处理except IOError:print('File Exist: ', fileExist)if fileExist == "false":# 在代理服务器上创建一个tcp clientSocket,此时代理服务器为clientprint('Creating socket on proxyserver')c = socket(AF_INET, SOCK_STREAM)hostn = message.split()[1].partition("//")[2].partition("/")[0]print('Host Name: ', hostn)try:# 连接到远程服务器80端口c.connect((hostn, 80))print('Socket connected to port 80 of the host')# 转发请求并接收响应c.sendall(message.encode())buff = c.recv(4096)# 转发远程服务器响应tcpCliSock.sendall(buff)# 将响应文件加入缓存tmpFile = open("./" + filename, "w")tmpFile.writelines(buff.decode().replace('\r\n', '\n'))tmpFile.close()except:print("Illegal request")else:# HTTP response message for file not found# Do stuff hereprint('File Not Found...Stupid Andy')# Close the client and the server socketstcpCliSock.close()
tcpSerSock.close() ```
- 修改web代理

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

- 发现目录下新建了html文档

- 刷新网页,终端得到:

