标签:
参考:http://ctf.idf.cn/index.php?g=&m=article&a=index&id=10 写的很赞的一些列入门文章
网络中每个通信实体的 socket 是用一个三元组标识的。三元组往往称为半相关
三元组指的是:协议族(地址族),网络地址、和传输层端口 (Ipv4 )。
通信双方的一个连接是用网络五元组来标识的,它是由双方相同协议族的两个本地三元组合成的。五元组往往称为全相关。
网络五元组指的是:协议族(地址族)、本地网络地址、本地端口、远程网络地址和远程端口。
套接口分为若干类型,常用的是 SOCK_STREAM 和 SOCK_DGRAM 。
SOCK_STREAM 是面向连接的套接字,使用的协议是 TCP ,通信的双方通过三次握手建立起虚拟的连接线路,通信的过程是可靠的。
而 SOCK_DGRAM 是面向非连接的套接字,使用的协议是 UDP ,通信双方以数据包的方式进行通信,通信的可靠性就不能得到保证。本项目要求采用 SOCK_STREAM 类型。
五元组格式(协议,本地 IP ,本地端口,远方 IP ,远方端口)的建立过程
服务器一般都有两个功能:监听 和 处理
在监听的时候,协议 / 本地 IP/ 本地端口(监听端口)都是确定的,当收到客户端的报文时,远方 IP 就是报文的源 IP 地址,远方端口就是报文的源端口,这样一来五元组就确定了。
然后服务器进入处理阶段,需要开启一个新的线程与客户端交互,当然就需要确定一个新的五元组,这时候协议 / 本地 IP/ 远方 IP/ 远方端口都来自监听阶段确定的五元组,而本地端口会在 1024 以上随机选取 (不再使用监听端口,以便监听其他客户端的请求)。
客户端的话正好相反,在发送请求时采用随机的本地端口 ,而接受响应时采用服务器的源端口作为远方端口。
1. 创建套接字
int socket(int family, int type, int protocol);
Socket 函数用于建立三元组中的协议族部分 。
2. 绑定套接字
int bind(int sockfd, cost struct sockaddr * saddr, socklen_t addrlen);
bind 函数用于建立三元组中的本地 IP 地址和本地端口号部分。
3. 监听
int listen( int sockfd, int backlog ) ;
4. 接受连接
int accept( int sockfd, struct sockaddr * client_addr, socklen_t *addrlen);
5. 连接服务器
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
connect 完成后通信双方两个三元组组成的五元组就建立起来了。
PCAP文件格式分析
pcap文件格式是常用的数据报文存储格式,主流抓包软件,如wireshark、tcpdump等都支持这种格式。
其具体格式为:
pcap文件头 + { 数据报文信息 + 数据报文 }+..
二、文件头结构体:24字节
sturct pcap_file_header
{
DWORD magic; //标识位,目前为“D4 C3 B2 A1”
WORD version_major;//主版本号
WORD version_minor;//副版本号
DWORD thiszone;//时区
DWORD sigfigs;//精确时间戳
DWORD snaplen;//数据包最大长度
DWORD linktype;//链路层类型,1代表以太网
}
三、数据包头结构体:16字节
struct pcap_pkthdr
{
struct timeval ts; //时间戳
DWORD caplen;//数据包长度
DWORD len;//数据包实际长度
}
struct timeval
{
DWORD GMTtime;//秒计时
DWORD microTime;//毫秒计时
}
数据报文,即网络中传输的数据包,其具体格式依赖于具体的网络协议,比如一个数据报文链路层采用以太网协议,网络层采用IP协议,传输层采用TCP协议,那么其内容就需要一层一层向上解析。可以自己对比协议规范去进行pcap文件的解析。
抓包分析提取五元组
标签:
原文地址:http://www.cnblogs.com/paranoidboy/p/4486034.html