iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0

走過最難的TCP,接下來是比較簡單的環節了,這兩天,我們來實作一個基於UDP的DNS server

還是一樣,我們要從第二層構建header,但是和前幾天的TCP相比,我們只是把TCP的header換成TCP,所以_buildEthHeader_buildIPHeader不變,這裡來為大家介紹_buildUDPHeader的部分

  1. 把自己的port,目的地的port,udp的長度,和checksum(這裡先為0)打包成udp_header
  2. 把自己的ip,目的地的ip,protocol,udp的長度打包成pseudo_header
  3. 把pseudo_header、udp_header、data連在一起做checksum
  4. 把checksum和port、len重新打包一次

完整程式如下

def _buildUDPHeader(dip, dest_port, udp_len, data):
    udp_header = struct.pack('!4H', self.port, dest_port, udp_len, 0)
    pseudo_header = struct.pack('!4s4sBBH', socket.inet_aton(self.ip), socket.inet_aton(dip), 0 , socket.IPPROTO_UDP, udp_len)
    check_sum_of_udp = getUDPChecksum(pseudo_header + udp_header + data)
    udp_header = struct.pack('!4H', self.port, dest_port, udp_len, check_sum_of_udp)

    return udp_header

到目前為止,有了_buildEthHeader_buildIPHeader_buildUDPHeader,接下來用這三個函數實作DNS server


上一篇
Day25 自幹TCP四向揮手(2)
下一篇
Day27 自幹DNS server(2)
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言