自己實(shí)現(xiàn)一個(gè)ping程序

小時(shí)候不太會(huì)玩電腦,一般自己玩的時(shí)候流程是:開始--附加功能--游戲與娛樂。
倘若旁邊有妹子在圍觀,我便會(huì)win+R-----cmd----ping baidu.com.然后看著屏幕上跳出一行行數(shù)字,假裝自己看得懂的樣子,過一會(huì)兒再慢悠悠地打開太空彈球玩起來
現(xiàn)在想起來真的是圖樣圖森破,甚至還非常naive啊。
這個(gè)ping程序算是我對(duì)計(jì)算機(jī)最早的認(rèn)識(shí)了,作為一個(gè)生活在圖形界面時(shí)代的人類,這也是我第一次知道了命令行形式的人機(jī)交互。
之前學(xué)習(xí)了計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí),知道了它的原理其實(shí)是利用ICMP協(xié)議的回顯請(qǐng)求來實(shí)現(xiàn)的,通過構(gòu)造ICMP報(bào)文向目的主機(jī)發(fā)出,然后接收返回報(bào)文,計(jì)算經(jīng)過的時(shí)間,就能計(jì)算出主機(jī)到目的主機(jī)之間的RTT(Round Trip Time),也就是我們平時(shí)講的延遲。
由于ICMP工作在網(wǎng)絡(luò)層,不能保證交付,也不保證順序,所以發(fā)送多個(gè)請(qǐng)求的時(shí)候,可能會(huì)出現(xiàn)亂序的情況,于是ping程序中在數(shù)據(jù)段保存包本身的發(fā)送時(shí)間,接收到之后用系統(tǒng)時(shí)間減去報(bào)文中讀取的時(shí)間即可得到RTT。為了簡(jiǎn)化過程,我在此只發(fā)送一個(gè)報(bào)文。
要構(gòu)造ICMP包,首先要知道其格式,
Type (8bit) | Code(8bit) | Checksum (16bit) | Identifier (16bit) | Sequence Number (16bit) | Data ...
我么要用到的是回顯請(qǐng)求,對(duì)應(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ù)進(jìn)行一系列計(jì)算,得到一個(gè)16bit的數(shù),用于差錯(cuò)檢測(cè),如果計(jì)算錯(cuò)誤,服務(wù)器方不會(huì)響應(yīng),你也就接受不到響應(yīng)的報(bào)文了。在編寫網(wǎng)絡(luò)程序的時(shí)候,調(diào)試時(shí)要利用抓包工具查看自己發(fā)出的報(bào)文的具體內(nèi)容,否則難以得知自己錯(cuò)在何處。

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

這兩個(gè)函數(shù)一起完成了報(bào)文的構(gòu)造和發(fā)送,這其中用到了raw類型socket,select用于接收數(shù)據(jù),由于數(shù)據(jù)要翻譯成二進(jìn)制發(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")

這就是程序的入口了,運(yùn)行效果就不貼了,反正就是打印出一個(gè)浮點(diǎn)數(shù)。數(shù)字的含義是延遲時(shí)間(實(shí)際是rtt)。

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,546評(píng)論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,570評(píng)論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評(píng)論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,786評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,219評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,438評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,971評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,796評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,995評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,230評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,697評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評(píng)論 2 374

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

  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,110評(píng)論 6 174
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,083評(píng)論 0 8
  • nmap使用指南(終極版) 原創(chuàng)2017-09-09hl0rey信安之路 一、目標(biāo)指定 1.CIDR標(biāo)志位 192...
    用電熱毯烤豬閱讀 12,026評(píng)論 1 49
  • 7.1 引言 “ping”這個(gè)名字源于聲納定位操作。Ping程序由Mike Muuss編寫,目的是為了測(cè)試另一臺(tái)主...
    張芳濤閱讀 1,705評(píng)論 0 2
  • 人認(rèn)為自己應(yīng)當(dāng)采取一種行動(dòng),這種行動(dòng)可以稱作公道、正當(dāng)、道德、自然法,這種正當(dāng)行為的念頭常常縈繞在人的腦際。 人知...
    蘇曼青閱讀 406評(píng)論 0 1