上一节解析了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
测试结果:
三、结语
至此本系列的基础知识实践分享就告一段落了,想学习更多知识的小伙伴可以去慕课网编程必备基础 计算机组成原理+操作系统+计算机网络 看更详细的讲解,希望能帮到大家,谢谢!