基础知识十二、Python解析网络报文之UDP首部报文解析

       上一节解析了TCP报文首部后,本节继续解析同样位于传输层的UDP报文首部。UDP作为一种无连接,不可靠的协议,其存在数据丢失不可知和没有拥塞控制等缺点,但有失亦有得,UDP的效率相对于TCP较高,多应用于对准确性要求相对低的场景,比如网络直播,网络视频语音通话等。

一、UDP首部解析器的实现

       UDP首部位于IP首部之后,每行同为32位,总共2行,长度为8字节,也就是位于IP数据报第21-28字节的位置。
       在UDPParser中分别对头部报文的每一行进行解析。

class UDPParser(TransParser):

    @classmethod
    def parse_udp_header(cls, udp_header):
        """
        UDP报文格式
        1. 16位源端口 16位目的端口
        2. 16位UDP长度 16位UDP报文校验和
        :param udp_header:
        :return:
        """
        udp_header = struct.unpack('>HHHH', udp_header)

        # 返回结果
        # src_port 源端口
        # dst_port 目的端口
        # udp_length UDP报文长度
        # udp_checksum UDP报文校验和
        return {
            'src_port': udp_header[0],
            'dst_port': udp_header[1],
            'udp_length': udp_header[2],
            'udp_checksum': udp_header[3]
        }

    @classmethod
    def parser(cls, packet):

        return cls.parse_udp_header(packet[cls.IP_HEADER_LENGTH:cls.IP_HEADER_LENGTH + cls.UDP_HEADER_LENGTH])

二、测试逻辑

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

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:  # TCP协议
        headers['transport_header'] = TCPParser.parser(self.packet)
    elif ip_header['protocol'] == 17:  # UDP协议
        headers['transport_header'] = UDPParser.parser(self.packet)

    return headers

       测试结果:
基础知识十二、Python解析网络报文之UDP首部报文解析_第1张图片

三、结语

       至此本系列的基础知识实践分享就告一段落了,想学习更多知识的小伙伴可以去慕课网编程必备基础 计算机组成原理+操作系统+计算机网络 看更详细的讲解,希望能帮到大家,谢谢!

你可能感兴趣的:(python,网络,udp,网络协议)