这里我们简单的对http头部进行一个分析。
网络3层或4层的流量特征是指从网络流量中提取的一些网络流量的基本特征数据,比如流量的大小、包长的信息、协议的信息、端口流量的信息、TCP 标志位的信息等。我们常常需要对明文的应用层流量做分析,来获得更丰富的流量信息。最常用的应用层协议是HTTP。
HTTP请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。下面这个网址提供了80端口和443端口的pcap网络流量包。SUEE1.pcap和SUEE8.pcap。https://github.com/vs-uulm/2017-SUEE-data-set。其中80端口是明文的HTTP流量,443端口是加密的HTTPS流量。
本次我们通过python编程从 SUEE1.zip流量包中,从80端口明文流量提取如下的HTTP请求头的关键字段,填入csv文件。
常见的http头关键字段包括:
1、Request Method
这个字段主要为GET、POST
2、Requet URI
请求的内容URI,比如GET /article/content/11/2/6286333707121934593/6286336064873300482/1/?version_code=5.4.5&app_name=news_article&vid=A6A279D2-3AC8-4D89-A6B4-DA8012CB3A27&device_id=14584054318&channel=App%20Store&resolution=750*1334&aid=13&ab_vers。
3、Host(发送请求时,该报头域是必需的)
作用: 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的
例如: 我们在浏览器中输入:http://www.hzau.edu.cn
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:www.hzau.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号
4、Referer
当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。
5、User-Agent
作用:告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。
代码如下
import pyshark
import pandas as pd
import os
import glob
#'field_names', 'get', 'get_field', 'get_field_by_showname', 'get_field_value', 'host', 'layer_name', 'pretty_print', 'raw_mode', 'referer', 'request', 'request_full_uri', 'request_line', 'request_method', 'request_number', 'request_uri', 'request_version', 'user_agent'
class net_flow(object):
def __init__(self,fp):
self.cap=pyshark.FileCapture(fp,display_filter="http")
def get_http_head(self,num=None):
for index, pkt in enumerate(self.cap):
#print(pkt.http.referer)
Request_Method=pkt.http.request_method
Request_URI=pkt.http.request_full_uri
Host=pkt.http.host
Referer=pkt.http.referer
User_Agent=pkt.http.user_agent
if num: # 如果指定num=100,则只会输出100个流
if index > num:
return [Request_Method,Request_URI,Host,Referer,User_Agent]
yield [Request_Method,Request_URI,Host,Referer,User_Agent]
if __name__ == '__main__':
try:
pcap_file = "SUEE1.pcap"
net_flow = net_flow(pcap_file)
http_head=net_flow.get_http_head();
with open("test.csv", 'a') as f: # 将提取出的特征组保存起来
f.write("Request Method,Request URI,Host,Referer,User Agent\r")
for http_head_item in http_head:
write_str = ",".join(http_head_item)
f.write(write_str + "\r")
f.close()
except Exception as e:
print(e)