iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
0
Software Development

那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析系列 第 28

Day28 自幹Ping server(1)

很快就來到最後一個實作了,自幹一個ping Server,分散式的應用越來越流行,同一個應用不再是靠共享記憶體,而是靠網路線串接各台機器,那分散式的基礎設施靠什麼在保證彼此的連線呢?靠的是ping,ping的好處是很輕量,只到第三層就能確認彼此主機是否相連,ping Server預設在每台作業系統背景執行,如果我們想要客製化ping server要怎麼做呢?例如故意加個系統延時模擬當前網路環境很慢

首先,我們依舊需要_buildEthHeader_buildIPHeader這兩個函數,這在前面幾講已經提過了,我們現在要另外構建_buildICMPHeader,放在IP header之後
完整的程式碼可見:https://gist.github.com/kaichiachen/9b84defbce02cd738cd5187424418a0b 可以搭配著看

def _buildICMPHeader(self, pktID, seq, data, icmp_type = 0, code = 0):
    icmp_header = struct.pack('!BbHHh', icmp_type, code, 0, pktID, seq)
    check_sum_of_icmp = getICMPChecksum(icmp_header + data)
    icmp_header = struct.pack('!BbHHh', icmp_type, code, check_sum_of_icmp, pktID, seq)

    return icmp_header

其實也是大同小異,但是多了很多要穿進去的參數。
我們會先解析來自client的ping,unpack它之後取得icmp_type, code, checksum, pktID, seq,如下所示

icmp_type, code, checksum, pktID, seq = struct.unpack('!BbHHh', icmp_header)

建構一個reply的packet header很簡單,原封不動把code、pktID和seq傳進_buildICMPHeader就好,icmp_type改成0,代表reply,_buildICMPHeader裡面會計算checksum就大功告成啦!

下一節,讓我們介紹如何測試


上一篇
Day27 自幹DNS server(2)
下一篇
Day29 自幹Ping server(2)
系列文
那些年還給老師的TCP/IP五層結構 - 用Python進行網路封包分析30

尚未有邦友留言

立即登入留言