自己實現(xiàn)一個ping程序

小時候不太會玩電腦,一般自己玩的時候流程是:開始--附加功能--游戲與娛樂。
倘若旁邊有妹子在圍觀柴底,我便會win+R-----cmd----ping baidu.com.然后看著屏幕上跳出一行行數(shù)字蚯撩,假裝自己看得懂的樣子,過一會兒再慢悠悠地打開太空彈球玩起來
現(xiàn)在想起來真的是圖樣圖森破咽弦,甚至還非常naive啊徒蟆。
這個ping程序算是我對計算機最早的認識了,作為一個生活在圖形界面時代的人類型型,這也是我第一次知道了命令行形式的人機交互段审。
之前學(xué)習了計算機網(wǎng)絡(luò)的知識,知道了它的原理其實是利用ICMP協(xié)議的回顯請求來實現(xiàn)的闹蒜,通過構(gòu)造ICMP報文向目的主機發(fā)出寺枉,然后接收返回報文,計算經(jīng)過的時間绷落,就能計算出主機到目的主機之間的RTT(Round Trip Time)姥闪,也就是我們平時講的延遲。
由于ICMP工作在網(wǎng)絡(luò)層,不能保證交付砌烁,也不保證順序筐喳,所以發(fā)送多個請求的時候,可能會出現(xiàn)亂序的情況函喉,于是ping程序中在數(shù)據(jù)段保存包本身的發(fā)送時間避归,接收到之后用系統(tǒng)時間減去報文中讀取的時間即可得到RTT。為了簡化過程函似,我在此只發(fā)送一個報文槐脏。
要構(gòu)造ICMP包,首先要知道其格式撇寞,
Type (8bit) | Code(8bit) | Checksum (16bit) | Identifier (16bit) | Sequence Number (16bit) | Data ...
我么要用到的是回顯請求顿天,對應(yīng)type是8堂氯,code是0,checksum要通過特定的算法獲得牌废,其他部分自己處理即可咽白。

import socket
import  array,struct,time,select
def checksum(data):
if(len(data)%2!=0):
    data+=b'\x00'
a=array.array('H',data)
s=0
for d in a:
    s=s+d
s=(~s)&0xffff
return s

這段代碼將已經(jīng)除checksum以外其它打包好的數(shù)據(jù)進行一系列計算,得到一個16bit的數(shù)鸟缕,用于差錯檢測晶框,如果計算錯誤,服務(wù)器方不會響應(yīng)懂从,你也就接受不到響應(yīng)的報文了授段。在編寫網(wǎng)絡(luò)程序的時候,調(diào)試時要利用抓包工具查看自己發(fā)出的報文的具體內(nèi)容番甩,否則難以得知自己錯在何處侵贵。

def send_packet(my_socket,destination_addr):
header=struct.pack('bbHh',8,0,1,1)
data=0
data=struct.pack('d',data)
checks=checksum(header+data)
packet=struct.pack('bbHHh',8,0,checks,1,1)+data
my_socket.sendto(packet,(destination_addr,1))
t=recive_ping(my_socket, 5)
print(t)

def recive_ping(my_socket,timeout):
timeleft=timeout
while True:
    starttime=time.time()
    select_=select.select([my_socket],[],[],timeleft)
    if select_[0]==[]:
        print("timeout")
        return -1
    t=time.time()-starttime
    return  t

這兩個函數(shù)一起完成了報文的構(gòu)造和發(fā)送,這其中用到了raw類型socket缘薛,select用于接收數(shù)據(jù)窍育,由于數(shù)據(jù)要翻譯成二進制發(fā)送,直接連接字符串肯定是不行的宴胧,所以要用struct將數(shù)據(jù)打包漱抓。

def do(addr):
icmp=socket.getprotobyname('icmp')
s=socket.socket(socket.AF_INET,socket.SOCK_RAW,icmp)
send_packet(s, addr)

do("220.181.57.217")

這就是程序的入口了,運行效果就不貼了恕齐,反正就是打印出一個浮點數(shù)乞娄。數(shù)字的含義是延遲時間(實際是rtt)。

與ping相似的另一個traceroute显歧,實現(xiàn)原理也類似补胚,它利用的是ip頭部的TTL,通過構(gòu)造指向目的主機的ttl從1遞增的數(shù)據(jù)包,就能獲得源主機到目的主機之間所有經(jīng)過的路由追迟,這可以在網(wǎng)上找到不少資料溶其,此處不再贅述。

參考:[1]:https://bbs.ichunqiu.com/thread-8970-1-1.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敦间,一起剝皮案震驚了整個濱河市瓶逃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌廓块,老刑警劉巖厢绝,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異带猴,居然都是意外死亡昔汉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門拴清,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靶病,“玉大人会通,你說我怎么就攤上這事÷χ埽” “怎么了涕侈?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長煤辨。 經(jīng)常有香客問我裳涛,道長,這世上最難降的妖魔是什么众辨? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任端三,我火速辦了婚禮,結(jié)果婚禮上鹃彻,老公的妹妹穿的比我還像新娘技肩。我一直安慰自己,他們只是感情好浮声,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旋奢,像睡著了一般泳挥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上至朗,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天屉符,我揣著相機與錄音,去河邊找鬼锹引。 笑死矗钟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的嫌变。 我是一名探鬼主播吨艇,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腾啥!你這毒婦竟也來了东涡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤倘待,失蹤者是張志新(化名)和其女友劉穎疮跑,沒想到半個月后慧妄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肄鸽,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡碉纳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年邪驮,在試婚紗的時候發(fā)現(xiàn)自己被綠了谁帕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡技健,死狀恐怖骄呼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情整以,我是刑警寧澤胧辽,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站公黑,受9級特大地震影響邑商,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凡蚜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一人断、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧朝蜘,春花似錦恶迈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至副渴,卻和暖如春奈附,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煮剧。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工斥滤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勉盅。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓佑颇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親草娜。 傳聞我的和親對象是個殘疾皇子挑胸,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1.這篇文章不是本人原創(chuàng)的,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的宰闰,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,053評論 6 174
  • 個人認為嗜暴,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習博客系列博客是一部非常精彩的學(xué)習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評論 0 8
  • nmap使用指南(終極版) 原創(chuàng)2017-09-09hl0rey信安之路 一议蟆、目標指定 1.CIDR標志位 192...
    用電熱毯烤豬閱讀 11,982評論 1 49
  • 7.1 引言 “ping”這個名字源于聲納定位操作闷沥。Ping程序由Mike Muuss編寫,目的是為了測試另一臺主...
    張芳濤閱讀 1,686評論 0 2
  • 人認為自己應(yīng)當采取一種行動咐容,這種行動可以稱作公道舆逃、正當、道德、自然法路狮,這種正當行為的念頭常吵嫔叮縈繞在人的腦際。 人知...
    蘇曼青閱讀 390評論 0 1