上一节解析了 IP首部报文 后,本节继续解析TCP报文首部。TCP协议处于OSI七层模型的传输层,传输层的作用就是负责管理端到端的通信连接问题。连续ARQ(automatic repeat request 自动重传请求)协议使得的TCP协议成为一种可靠性传输的协议,滑动窗口和慢启动、拥塞避免算法又赋予了TCP协议较好的流量控制和拥塞控制,这也使得TCP协议被广泛应用在一些准确性要求相对高的场所。

一、TCP首部解析器的实现

创建trans包 新建parser.py文件
TCP首部位于IP首部之后,每行同为32位,总共5行,长度为20字节,也就是位于IP数据报第21-40字节的位置。
在TCPParser中分别对头部报文的每一行进行解析。

class TransParser:
    IP_HEADER_LENGTH = 20  # IP报文头部的长度
    UDP_HEADER_LENGTH = 8  # UDP头部的长度
    TCP_HEADER_LENGTH = 20  # TCP头部的长度
class TCPParser(TransParser):
    @classmethod
    def parse_tcp_header(cls, tcp_header):
        TCP报文格式
        1. 16位源端口号 16位目的端口号
        2. 32位序列号
        3. 32位确认号
        4. 4位数据偏移 6位保留字段 6位TCP标记 16位窗口
        5. 16位校验和 16位紧急指针
        :param tcp_header:
        :return:
        line1 = struct.unpack('>HH', tcp_header[:4])
        src_port = line1[0]
        dst_port = line1[1]
        line2 = struct.unpack('>L', tcp_header[4:8])
        seq_num = line2[0]
        line3 = struct.unpack('>L', tcp_header[8:12])
        ack_num = line3[0]
        line4 = struct.unpack('>BBH', tcp_header[12:16])  # 先按照8位、8位、16位解析
        data_offset = line4[0] >> 4  # 第一个8位右移四位获取高四位
        flags = line4[1] & int(b'00111111', 2)  # 第二个八位与00111111进行与运算获取低六位
        FIN = flags & 1
        SYN = (flags >> 1) & 1
        RST = (flags >> 2) & 1
        PSH = (flags >> 3) & 1
        ACK = (flags >> 4) & 1
        URG = (flags >> 5) & 1
        win_size = line4[2]
        line5 = struct.unpack('>HH', tcp_header[16:20])
        tcp_checksum = line5[0]
        urg_pointer = line5[1]
        # 返回结果
        # src_port 源端口
        # dst_port 目的端口
        # seq_num 序列号
        # ack_num 确认号
        # data_offset 数据偏移量
        # flags 标志位
        #     FIN 结束位
        #     SYN 同步位
        #     RST 重启位
        #     PSH 推送位
        #     ACK 确认位
        #     URG 紧急位
        # win_size 窗口大小
        # tcp_checksum TCP校验和
        # urg_pointer 紧急指针
        return {
            'src_port': src_port,
            'dst_port': dst_port,
            'seq_num': seq_num,
            'ack_num': ack_num,
            'data_offset': data_offset,
            'flags': {
                'FIN': FIN,
                'SYN': SYN,
                'RST': RST,
                'PSH': PSH,
                'ACK': ACK,
                'URG': URG
            'win_size': win_size,
            'tcp_checksum': tcp_checksum,
            'urg_pointer': urg_pointer
    @classmethod
    def parser(cls, packet):
        return cls.parse_tcp_header(packet[cls.IP_HEADER_LENGTH:cls.IP_HEADER_LENGTH + cls.TCP_HEADER_LENGTH])

二、测试逻辑

       当IP首部中的protocol等于6时表示该报文属于TCP协议,在ServerProcessTask中调用TCPParser。

def process(self):
    异步处理方法
    :return:
    headers = {
        'network_header': None,
        'transport_header': None
    ip_header = IPParser.parse(self.packet)
    headers['network_header'] = ip_header
    if ip_header['protocol'] == 6:
        headers['transport_header'] = TCPParser.parser(self.packet)
    return headers

       测试结果:
在这里插入图片描述

文章目录一、TCP首部解析器的实现二、测试逻辑       上一节解析了IP首部报文后,本节继续解析TCP报文首部。TCP协议处于OSI七层模型的传输层,传输层的作用就是负责管理端到端的通信连接问题。连续ARQ(automatic repeat request 自动重传请求)协议使得的TCP协议成为一种可靠性传输的协议,滑动窗...
tcp.py 复制代码 代码如下:# -*- coding: cp936 -*-import socketfrom struct import *from time import ctime,sleepfrom os import system system(‘title tcp sniffer’)system(‘color 05’) # the public network interfaceHOST = socket.gethostbyname(socket.gethostname()) # create a raw socket and bind it to the public int
if __name__ == '__main__': # 创建服务端套接字,这个套接字服务于整个程序 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定ip和端口 server_sock... 这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。 微信小程序搜索:Python面试宝典 或可关注原创个人博客:https://lienze.tech 也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习 客户端服务端 服务器是一个软 服务器端先初始化Socket,建立一个套接字 与端口绑定(bind),用 bind 函数来绑定一个端口号和 IP 地址。 对端口进行监听(listen),服务器调用 listen 函数,使服务器的这个端口和 IP 处于监听状态 服务器调用accept阻塞,等待客户端连接。等待客户机的连接。 客户机用 socket 函数建立一个套接字,设定远程 IP 和端口。
在汽车CAN报文数据分析工作过程中,需要经常对总线报文进行解析,并生成曲线做数据分析,定位以及对比。本文以车速报文为例,在不依托vector及其他CAN分析上位机的条件下,基于python工具对CAN报文进行解析,最终回执信号折线图。 代码如下: # *-* coding:utf8 *-* from matplotlib import pyplot as plt import numpy as np import pandas as pd # 函数作用:将ASC数据中的时间戳和车速信...
TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。 TCP通信需要经过创建连接、数据传送、终止连接三个步骤。 TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”" TCP特点 1. 面向...
Python 网络编程(进阶)TCP协议1. 预备知识分包粘包2. TCP协议2.1 TCP协议的作用分包:TCP传输的“特性”2.2 TCP 数据包的大小2.3 TCP数据包的编号(SEQ)2.4 TCP数据包的组装2.5 慢启动和 ACK2.6 数据包的遗失处理 1. 预备知识 (1)what is 分包 TCP是 以段(Segment)为单位 发送数据的,建立TCP链接后,有一个 最大报文长度(Maximum Segment Size,MSS) ,就是 TCP数据包每次能够传输的最大数据分段。
在工作中,有段时间需要构造报文来进行相关的系统功能验证,而当时手边又没有一个趁手的报文构造或者改包工具(其实后来知道有的只是我不知道----手动狗头),遂接触了python3的第三方库scapy。 可以先看看scapy的官方介绍 Scapy is a Python program that enables the user to send, sniff and dissect and forge network packets. This capability allows cons...
根据要求,需将报文长度以4个字节的形式拼接在报文前。 当前通信是使用python中的socket包,在发送前需先将报文转为bytes形式发送,因此选用了将int型的报文长度转换为4个字节长度的bytes型数据进行传输的方法,如下。 int(length).to_bytes(length=4, byteorder='big', signed=True) def socket_sendto(ip, port, xmlbw): # 此时的xmlbw是b