很快就來到最後一個實作了,自幹一個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就大功告成啦!
下一節,讓我們介紹如何測試