日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
解析Linux下Ping指令的源碼方法(linux下的ping源碼)

Ping是一種基于ICMP協(xié)議實(shí)現(xiàn)的網(wǎng)絡(luò)連通性測(cè)試工具,可以用于檢測(cè)目標(biāo)主機(jī)是否在線、網(wǎng)絡(luò)延遲等。在Linux系統(tǒng)下,Ping指令已經(jīng)成為了日常網(wǎng)絡(luò)命令中不可或缺的一部分。本文將使用Linux系統(tǒng)下的Ping指令作為案例,探究Ping指令的源碼實(shí)現(xiàn)方法。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了泰山免費(fèi)建站歡迎大家使用!

1. 下載并編譯ICMP庫

Ping指令的實(shí)現(xiàn)方式主要是通過發(fā)送ICMP回顯請(qǐng)求報(bào)文(Echo Request)并等待目標(biāo)主機(jī)的回復(fù)報(bào)文(Echo Response)來判斷目標(biāo)主機(jī)是否在線,并計(jì)算出網(wǎng)絡(luò)延遲數(shù)據(jù)。因此,我們首先需要編譯一個(gè)基于ICMP協(xié)議的庫文件。

在Linux系統(tǒng)中,我們可以選擇安裝liboping或libicmp庫,這里我們以libicmp庫為例。我們需要下載并解壓縮libicmp庫源碼包:

“`

wget https://github.com/hamishcoleman/linux-icmp/archive/refs/tags/v0.3.tar.gz

tar -zxvf v0.3.tar.gz

“`

接著,在源代碼目錄下執(zhí)行以下命令來編譯libicmp庫:

“`

cd linux-icmp-0.3

make

“`

編譯完成后,我們可以在目錄下看到生成了libicmp.so動(dòng)態(tài)庫文件。這個(gè)庫文件我們?cè)诤竺娴腜ing指令源碼中會(huì)用到。

2. 系統(tǒng)調(diào)用

我們知道,在Linux系統(tǒng)中,Ping指令可以通過命令行直接運(yùn)行。但是,這并不是真正的Ping指令的實(shí)現(xiàn)方法,而是一個(gè)運(yùn)行Ping指令的程序。真正的Ping指令是通過系統(tǒng)調(diào)用來實(shí)現(xiàn)的。這里,我們以Linux 2.6為例來講解Ping指令的實(shí)現(xiàn)原理。

在Linux中,系統(tǒng)調(diào)用是由內(nèi)核提供的一組接口函數(shù),用來實(shí)現(xiàn)用戶空間與內(nèi)核空間的交互。我們可以通過查看內(nèi)核源碼中的syscall.c文件來了解當(dāng)前系統(tǒng)支持的所有系統(tǒng)調(diào)用。在該文件中,第0號(hào)系統(tǒng)調(diào)用被定義為“sys_restart_syscall”,第1號(hào)系統(tǒng)調(diào)用為“sys_exit”,第2號(hào)系統(tǒng)調(diào)用為“sys_fork”,以此類推。

Ping指令最主要的系統(tǒng)調(diào)用是socket()、sendto()和recvfrom()。其中,socket()用于創(chuàng)建一個(gè)可以發(fā)送和接收IP數(shù)據(jù)包的套接字,sendto()用于向目標(biāo)主機(jī)發(fā)送ICMP回顯請(qǐng)求報(bào)文,recvfrom()用于接收目標(biāo)主機(jī)返回的ICMP回顯應(yīng)答報(bào)文。以下是具體的實(shí)現(xiàn)代碼:

“`

int mn(int argc, char *argv[])

{

int sfd;

struct sockaddr_in sin;

struct icmp_packet icmp;

char buf[1024];

struct timeval start, end;

double time_diff;

if (argc != 2) {

printf(“Usage: %s IP address\n”, argv[0]);

return -1;

}

/* 創(chuàng)建套接字 */

sfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

if (sfd

perror(“socket”);

return -1;

}

/* 初始化目標(biāo)主機(jī)地址結(jié)構(gòu)體 */

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET;

sin.sin_addr.s_addr = inet_addr(argv[1]);

/* 初始化icmp報(bào)文 */

icmp.type = ICMP_ECHO_REQUEST;

icmp.code = 0;

icmp.checksum = 0;

icmp.id = htons(getpid());

icmp.seq = htons(1);

memset(icmp.data, 0xff, 56);

icmp.checksum = checksum((unsigned short *)&icmp, sizeof(struct icmp_packet));

/* 發(fā)送icmp報(bào)文 */

if (sendto(sfd, &icmp, sizeof(struct icmp_packet), 0, (struct sockaddr *)&sin, sizeof(sin))

perror(“sendto”);

return -1;

}

/* 接收icmp應(yīng)答報(bào)文 */

if (recvfrom(sfd, buf, sizeof(buf), 0, NULL, NULL)

perror(“recvfrom”);

return -1;

}

gettimeofday(&end, NULL);

/* 計(jì)算網(wǎng)絡(luò)延遲 */

time_diff = (end.tv_sec – start.tv_sec) + (end.tv_usec – start.tv_usec) / 1000000.0;

printf(“Time cost: %lfms\n”, time_diff * 1000);

close(sfd);

return 0;

}

“`

在以上代碼中,我們可以看到使用了socket()、sendto()和recvfrom()三個(gè)系統(tǒng)調(diào)用來實(shí)現(xiàn)Ping指令的核心邏輯。其中,socket()函數(shù)創(chuàng)建了一個(gè)RAW套接字,這種類型的套接字可以直接發(fā)送IP數(shù)據(jù)包。sendto()函數(shù)用于向目標(biāo)主機(jī)發(fā)送ICMP回顯請(qǐng)求報(bào)文,recvfrom()函數(shù)用于從目標(biāo)主機(jī)接收ICMP回顯應(yīng)答報(bào)文。

3. ICMP報(bào)文格式

了解Ping指令的實(shí)現(xiàn)原理中,必須要掌握ICMP報(bào)文格式。以下是ICMP回顯請(qǐng)求報(bào)文和ICMP回顯應(yīng)答報(bào)文的具體格式。

ICMP回顯請(qǐng)求報(bào)文格式:

“`

0 7 15 23 31

+————–+————+————+————+

| 類型 | 代碼 | 校驗(yàn)和 | 標(biāo)識(shí)符 |

+————–+————+————+————+

| 序列號(hào) |

+————–+————+————+————+

| 數(shù)據(jù) |

+————–+————+————+————+

“`

其中,類型為8,代碼為0,標(biāo)識(shí)符和序列號(hào)自定義,數(shù)據(jù)字段最多為56字節(jié)。校驗(yàn)和的計(jì)算方法為將16位的數(shù)據(jù)按二進(jìn)制位求和,再將結(jié)果取反,得到的8位校驗(yàn)和填入校驗(yàn)和字段。

ICMP回顯應(yīng)答報(bào)文格式:

“`

0 7 15 23 31

+————–+————+————+————+

| 類型 | 代碼 | 校驗(yàn)和 | 標(biāo)識(shí)符 |

+————–+————+————+————+

| 序列號(hào) |

+————–+————+————+————+

| 數(shù)據(jù) |

+————–+————+————+————+

“`

其中,類型為0,代碼為0,標(biāo)識(shí)符和序列號(hào)與請(qǐng)求報(bào)文相同,數(shù)據(jù)字段最多為56字節(jié)。校驗(yàn)和的計(jì)算方法和請(qǐng)求報(bào)文相同。

4. 源碼結(jié)構(gòu)分析

在Linux系統(tǒng)中,Ping指令的源碼主要包括三個(gè)文件:ping.c、ping.h和hostlist.c。

其中,ping.c文件是整個(gè)程序的主函數(shù),主要實(shí)現(xiàn)了Ping指令的操作流程,包括創(chuàng)建socket、發(fā)送ICMP報(bào)文、接收ICMP報(bào)文、計(jì)算網(wǎng)絡(luò)延遲等。在這個(gè)文件中,我們可以看到,Ping指令的實(shí)現(xiàn)是基于上述系統(tǒng)調(diào)用和ICMP報(bào)文格式的。

ping.h文件則定義了Ping指令中需要用到的各種宏定義和函數(shù)聲明。

hostlist.c文件則是Ping指令的參數(shù)處理器,用于讀取命令行中指定的主機(jī)列表,并將參數(shù)傳遞給Ping指令的主函數(shù)。

5.

通過分析Linux系統(tǒng)下Ping指令的源碼實(shí)現(xiàn)方法,我們可以深入了解Ping指令的工作原理,以及基于ICMP協(xié)議的網(wǎng)絡(luò)連通性測(cè)試實(shí)現(xiàn)方法。對(duì)于網(wǎng)絡(luò)工程師來說,這些知識(shí)是非常重要的,可以幫助他們更好地理解和解決網(wǎng)絡(luò)問題。同時(shí),我們可以透過這個(gè)案例,學(xué)習(xí)到如何分析、理解并修改Linux系統(tǒng)中的源碼,這對(duì)于我們的Linux系統(tǒng)學(xué)習(xí)和應(yīng)用,也大有裨益。

相關(guān)問題拓展閱讀:

  • linux 系統(tǒng)下ping -f命令

linux 系統(tǒng)下ping -f命令

ping -f這個(gè)命令主要是搭灶加上ip是告訴用戶不要分段發(fā)送,數(shù)據(jù)包就不會(huì)被路由上的網(wǎng)關(guān)分段。通常你所發(fā)送的數(shù)瞎散據(jù)包都會(huì)通過路由分段再發(fā)送給對(duì)方,加上此參數(shù)以后路由就不會(huì)再分磨枝氏段處理。

ping -f

盡可能快地發(fā)送報(bào)文

linux下 ping命粗仔令參數(shù)

表1 ping命令參數(shù)(linux)

參數(shù)

描述

-c count

在收發(fā)指定的count個(gè)數(shù)目的報(bào)文后停止

-d

在套接口設(shè)置so_debug

-f

盡可能快地發(fā)送報(bào)文

-i wait

設(shè)置連續(xù)報(bào)文發(fā)送時(shí)報(bào)文間的發(fā)送時(shí)間間隔(單位為秒)

-i ?device?

設(shè)置輸出接口

-l preload

盡可能快地發(fā)送預(yù)載的報(bào)文,然后再返回到正常發(fā)送模式

-n

不查尋主機(jī)名,僅僅給出ip地址值

-p pattern

定義隨同報(bào)文一起被發(fā)送的便箋內(nèi)容(便箋最長橡凳困為16個(gè)字節(jié))

-q

僅輸出結(jié)果的總結(jié)內(nèi)容

-r

不使用

路由表

來發(fā)送報(bào)文,而是直接把報(bào)文發(fā)到主機(jī)

-r

設(shè)置記錄路由選擇功能,即記錄報(bào)文傳送經(jīng)過的路徑

-s packetsize

設(shè)置要發(fā)送的報(bào)文大小(單位為字節(jié),更大長度是64k,缺省長度是64)

-t tsonly

發(fā)送一個(gè)帶有時(shí)間戳的ping報(bào)文

-t tsandaddr

收集梁念時(shí)間戳和地址

-t tsprespec

>>> 收集來自預(yù)定的網(wǎng)絡(luò)段的時(shí)間戳和地址

-w timeout

指定等待每個(gè)響應(yīng)的最長時(shí)間(單位是毫秒)

Flood ping. For every ECHO_REQUEST sent a period “.” is

printed, while for ever ECHO_REP received a backspace is

printed. This provides a rapid display of how many packets are

being dropped. If interval is not given, it sets interval to

zero and outputs packets as fast as they come back or one hun‐

dred times per second, whichever is more. Only the super-user

may use this option with zero interval.

我對(duì)LINUX熟,加我,我告訴你

linux下的ping源碼的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux下的ping源碼,解析Linux下Ping指令的源碼方法,linux 系統(tǒng)下ping -f命令的信息別忘了在本站進(jìn)行查找喔。

香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。


文章標(biāo)題:解析Linux下Ping指令的源碼方法(linux下的ping源碼)
當(dāng)前鏈接:http://www.dlmjj.cn/article/cdcdjho.html