2018-04-08 09:12:00 qq_28808697 阅读数 86
  • 第07章-网络通信协议(OSI、TCP、UDP、IP、ARP、ICMP...

    课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址和MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令使用详解 tracert命令使用详解 TCP详解 UDP协议详解 网络通信协议(应用层)协议

    8116 人正在学习 去看看 深博

    Linux TTL=64  Windows TTL=128  Unix TTL = 225 。 每经过一个路由器, TTL减1。

 常用的ping命令:   

ping ip地址 -t一直ping
ping /? 查看ping命令
ping -l 200 ip地址指定ping的数据包为200字节
ping -i 2修改TTL,可以这样依次ping -i 1,ping -i 2....来得到依次每一个路由器的IP地址。

使用ping命令排除网络故障:

    ping 8.8.8.8 (外网) 能通,则网络层是通的。ping 一个域名能得到其IP地址,则网络层是通的,但无法访问目标网页,说明有域名解析问题。QQ能够通,是因为QQ不需要域名解析,直接连的IP地址。

使用ping命令估算网络是否通畅:ping局域网应小于10ms。

   (没有网关,计算机就不知道到别的网段怎么走;没有路由表,路由器也不知道该怎么走,数据包到了目标地址,但没有回来,请求超时)

    pathping 跟踪数据包的路径, 计算丢包情况。能够跟踪到故障位置(路由器)。

    tracert 跟踪数据包路径。跟踪路由。

    ping命令用的是ICMP协议,是网络层的。不是应用层程序。

2016-09-01 22:27:57 github_35156632 阅读数 11654
  • 第07章-网络通信协议(OSI、TCP、UDP、IP、ARP、ICMP...

    课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址和MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令使用详解 tracert命令使用详解 TCP详解 UDP协议详解 网络通信协议(应用层)协议

    8116 人正在学习 去看看 深博

一次完整的PIng过程

涉及到的协议:

UDP ICMP  ARP OSPF


ICMP报文:

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用







1、Pc1在应用层发起个目标IP为192.168.2.2的Ping请求。

2、传输层接到上层请求的数据,将数据分段并加上UDP报头。下传到Internet层。  

3、网际层接收来处上层的数据后,根据ICMP协议进行封装,添加PC1的IP为源IP为和PC2IP为目标IP后封装成数据包。下传到网络接口层,因Pc1ip与pc2ip不在同一网段,所以数据包将发往网关Router E0口。  

4、网络接口层接收数据包后,进行封装,源MAC地址为PC1的MAC地址,目标MAC地址则查询自己的ARP缓存表以获取网关MAC地址。如果PC1 arp缓存表中没有网关对应的MAC地址,则PC1发出一个ARP广播报文。ARP报文中源MAC地址为Pc1mac地址,源IP地址为PC1 IP,所要请求的是网关IP对应的MAC地址  

5、交换机1从F0/1接收到ARp帧后,检查自己Arp缓存表中是否有与F0/1口相对应PC1的mac地址。没有,则将PC1Mac地址与F0/1接口对应起来,存储到交换机1的arp缓存表中。然后将该ARP请求报文进行除F0/1口以外的所有端口进行泛洪。 

6、Router收到ARP广播后,进行解封装,发现所要请求的MAC地址是自己的。则Router将PC1的mac地址写入arp缓存表中。然后向PC1发送一个ARP应答单播。该单播消息包括目标IP为PC1ip,目标Mac为pc1mac地址,源IP为Router的E0口IP,源Mac为Router的E0的Mac。  

7、ARP帧F0/24口传给交换机,交换机同样检查MAC表,然后将F0/24口与Router的E0的MaC地址对应起来,存入MAC缓存表中,然后转发该帧。  

8、Pc1接收到Router的arp应答帧后,将Router的E0的MAC地址存入arp缓存中,并将Router的E0的Mac地址作为目标地址封装到数据帧中。发给下层进行网络传输。 

9、Router的E0接收这个帧后,看目标mac地址是否指向自己。是,PC2则将帧头去掉,然后检查目标ip地址,发现这个目标ip不是自己,刚不再进行解封装。  

10、Router在自己的route表中检查自己的是否有去往目标地址的路由,没有则丢弃该帧。有,路由器经检查发现是去往与E1口直连的网段。则路由器对数据包进行二层封装成帧,源IP为pc1的IP,源mac地址为routerE1口的Mac地址,目标IP为Pc2的ip,目标Mac地址则检查自己的arp缓存表获取。如果没有,则发送ARp请求报文。  

11、交换机收到报文后也检查ARp缓存表,然后存储对应接口的MAC地址后进行除接收端口外的泛洪。  

12、PC2收到ARP广播后,进行解封装,发现所请求的MAC地址是自己的。则RouterE1的mac地址写入arp缓存表中。然后向PC1发送一个ARP应答单播。该单播消息包括目标IP为RouterE1的ip,目标Mac为RouterE1的mac地址,源IP为PC2的IP,源Mac为pc2的Mac。  

13、ARP帧经F0/24口传给交换机,交换机同样检查MAC表,然后将F0/24口与PC2的MaC地址对应起来,存入MAC缓存表中,然后转发该帧。  

14、RouterE1口接收到PC2的arp应答帧后,将Pc2的MAC地址存入arp缓存中,并将Pc2的Mac地址作为目标地址封装到数据帧中,然后转发。  

15、Pc2网际层接收到这个信息包,查看包头,发现目标IP和自己匹配,则解封装,将数据向上层传输。  

16、传输层接收来自下层的Ping请求的UDP报文,则去掉UDP报头,向应用层传送。  

17、应用层收到ping请求后,发送一个PIng回应报文给PC

2015-06-16 11:49:07 u010779842 阅读数 501
  • 第07章-网络通信协议(OSI、TCP、UDP、IP、ARP、ICMP...

    课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址和MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令使用详解 tracert命令使用详解 TCP详解 UDP协议详解 网络通信协议(应用层)协议

    8116 人正在学习 去看看 深博

         ping的英文全称是:PacketInternet Groper。这里的groper有探索的意思。因此呢,ping的中文含义就是:因特尔包探索器 。

        它的工作原理是这样的:利用网络上机器IP地址的唯一性,给目标IP地址发送一个数据包,再要求对方返回一个同样大小的数据包来确定两台网络机器是否连接相通,时延是多少。

2017-11-07 20:01:37 iren120502 阅读数 971
  • 第07章-网络通信协议(OSI、TCP、UDP、IP、ARP、ICMP...

    课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址和MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令使用详解 tracert命令使用详解 TCP详解 UDP协议详解 网络通信协议(应用层)协议

    8116 人正在学习 去看看 深博

一、作业要求
  1.ping的gui程序
  2.作业内要求有可执行的exe,作业链接,Readme,gif图,以及源代码

二、完成步骤
  1.创建类型为SOCK_RAW的一个套接字,同时设定协议*IPPROTO_ICMP。
  2.创建并初始化ICMP头。
  3.调用sendto或WSASendto,将ICMP请求发给远程主机。
  4.调用recvfrom或WSARecvfrom,以接收任何ICMP响应。

三、代码实现

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#pragma  comment (lib, "ws2_32.lib")

#define ICMP_ECHOREPLY  0  // ICMP回复应答
#define ICMP_ECHOREQ    8  // ICMP回应请求
#define REQ_DATASIZE 32     // 请求数据报大小

// 定义IP首部格式
typedef struct _IPHeader
{
    u_char  VIHL;           // 版本和首部长度
    u_char  ToS;            // 服务类型
    u_short TotalLen;       // 总长度
    u_short ID;         // 标识号
    u_short Frag_Flags;     // 段偏移量
    u_char  TTL;            // 生存时间
    u_char  Protocol;       // 协议
    u_short Checksum;       // 首部校验和
    struct  in_addr SrcIP;  // 源IP地址
    struct  in_addr DestIP; // 目的地址
}IPHDR, *PIPHDR;


// 定义ICMP首部格式
typedef struct _ICMPHeader
{
    u_char  Type;           // 类型
    u_char  Code;           // 代码
    u_short Checksum;       // 首部校验和
    u_short ID;             // 标识
    u_short Seq;            // 序列号
    char    Data;           // 数据
}ICMPHDR, *PICMPHDR;

// 定义ICMP回应请求
typedef struct _ECHOREQUEST
{
    ICMPHDR icmpHdr;
    DWORD   dwTime;
    char    cData[REQ_DATASIZE];
}ECHOREQUEST, *PECHOREQUEST;

// 定义ICMP回应答复 
typedef struct _ECHOREPLY
{
    IPHDR   ipHdr;
    ECHOREQUEST echoRequest;
    char    cFiller[256];
}ECHOREPLY, *PECHOREPLY;

// 计算校验和
u_short checksum(u_short *buffer, int len)
{
    register int nleft = len;
    register u_short *w = buffer;
    register u_short answer;
    register int sum = 0;
    // 使用32bit的累加器,进行16bit的反馈计算
    while( nleft > 1 )  {
        sum += *w++;
        nleft -= 2;
    }
    // 补全奇数位
    if( nleft == 1 ) {
        u_short u = 0;

        *(u_char *)(&u) = *(u_char *)w ;
        sum += u;
    }
   // 将反馈的16bit从高位移至地位
    sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
    sum += (sum >> 16);         /* add carry */
    answer = ~sum;             /* truncate to 16 bits */
    return (answer);
}



// 发送回应请求函数
int SendEchoRequest(SOCKET s,struct sockaddr_in *lpstToAddr) 
{
    static ECHOREQUEST echoReq;
    static nId = 1;
    static nSeq = 1;
    int nRet;

    // 填充回应请求消息
    echoReq.icmpHdr.Type        = ICMP_ECHOREQ;
    echoReq.icmpHdr.Code        = 0;
    echoReq.icmpHdr.Checksum    = 0;
    echoReq.icmpHdr.ID          = nId++;
    echoReq.icmpHdr.Seq         = nSeq++;

    // 填充要发送的数据(随便填写)
    for (nRet = 0; nRet < REQ_DATASIZE; nRet++)
        echoReq.cData[nRet] = ' '+nRet;

    // 储存发送的时间
    echoReq.dwTime = GetTickCount();

    // 计算回应请求的校验和
    echoReq.icmpHdr.Checksum = checksum((u_short *)&echoReq, sizeof(ECHOREQUEST));

    // 发送回应请求                                 
    nRet = sendto(s,                        // 建立起的套接字
                 (LPSTR)&echoReq,           // 发送的缓冲区内容
                 sizeof(ECHOREQUEST),
                 0,                         // 标志位
                 (struct sockaddr*)lpstToAddr, // 发送的目标地址
                 sizeof(SOCKADDR_IN));   // 地址结构长度

    if (nRet == SOCKET_ERROR)
    {
        printf("sendto() error:%d\n",WSAGetLastError());
    }
    return (nRet);
}

// 接收应答回复并进行解析
DWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) 
{
    ECHOREPLY echoReply;
    int nRet;
    int nAddrLen = sizeof(struct sockaddr_in);

    //接收应答回复    
    nRet = recvfrom(s,                  // 接收的套接字
                    (LPSTR)&echoReply,  // 接收的缓冲区
                    sizeof(ECHOREPLY),  // 缓冲区长度
                    0,                  // 标识
                    (LPSOCKADDR)lpsaFrom,   // 接收的地址
                    &nAddrLen);         // 地址结构长度

    // 检验接收结果
    if (nRet == SOCKET_ERROR) 
    {
        printf("recvfrom() error:%d\n",WSAGetLastError());
    }
    // 记录返回的TTL
    *pTTL = echoReply.ipHdr.TTL;
    //返回应答时间
    return(echoReply.echoRequest.dwTime);       
}

// 等待回应答复,使用select机制
int WaitForEchoReply(SOCKET s)
{
    struct timeval timeout;
    fd_set readfds;

    readfds.fd_count = 1;
    readfds.fd_array[0] = s;
    timeout.tv_sec = 5;
    timeout.tv_usec = 0;

    return(select(1, &readfds, NULL, NULL, &timeout));
}

// Ping功能实现
void Ping(char *pstrHost)
{
    SOCKET    rawSocket;
    LPHOSTENT lpHost;
    struct    sockaddr_in destIP;
    struct    sockaddr_in srcIP;
    DWORD     dwTimeSent;
    DWORD     dwElapsed;
    u_char    cTTL;
    int       nLoop;
    int       nRet;

    // 创建原始套接字,ICMP类型
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR) 
    {
        printf("socket() error:%d\n",WSAGetLastError());
        return;
    }

    // 检测目标主机
    lpHost = gethostbyname(pstrHost);
    if (lpHost == NULL)
    {
        printf("Host not found: %s\n", pstrHost);
        return;
    }

    // 设置目标机地址
    destIP.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
    destIP.sin_family = AF_INET;
    destIP.sin_port = 0;

    // 提示开始进行Ping
    printf("\nPinging %s with %d bytes of data:\n",
                inet_ntoa(destIP.sin_addr),
                REQ_DATASIZE);


    // 发起多次Ping测试
    for (nLoop = 0; nLoop < 4; nLoop++)
    {
        //发送ICMP回应请求
        SendEchoRequest(rawSocket, &destIP);

        // 使用select()等待回复的数据
        nRet = WaitForEchoReply(rawSocket);
        if (nRet == SOCKET_ERROR)
        {
            printf("select() error:%d\n",WSAGetLastError());
            break;
        }
        if (!nRet)
        {
            printf("\nRequest time out");
            break;
        }

        //接收回复
        dwTimeSent = RecvEchoReply(rawSocket, &srcIP, &cTTL);

        // 计算花费的时间
        dwElapsed = GetTickCount() - dwTimeSent;
        printf("\nReply from %s: bytes=%d time=%ldms TTL=%d", 
               inet_ntoa(srcIP.sin_addr), 
               REQ_DATASIZE,
               dwElapsed,
               cTTL);
    }

    printf("\n");
    nRet = closesocket(rawSocket); // 关闭套接字,释放资源
    if (nRet == SOCKET_ERROR)
    {
        printf("closesocket() error:%d\n",WSAGetLastError());
    }
}

void main(int argc, char **argv)
{
    WSADATA wsd;
    int nRet;

    // 检测输入的参数
    if (argc != 2)
    {
        printf("\nUsage: ping hostname\n");
        return;
    }
    // 初始化Winsock
    if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)
    {
        printf("加载Winsock失败!\n");
    }

    //开始Ping
    Ping(argv[1]);

    // 释放Winsock资源
    WSACleanup();
}

四、实现图例
  1.ping程序实现
  2.ping的GIF实现

五、程序实现文件链接
http://pan.baidu.com/s/1cdeQKI

六、参考博文
http://blog.sina.com.cn/s/blog_47120f8f0101fjul.html
http://blog.csdn.net/ivy8966/article/details/54612601?locationNum=6&fps=1
http://blog.csdn.net/qq_36249516/article/details/78467009
http://download.csdn.net/download/qq_36249516/10107387

七、总结与体会
由于最近在积极准备软件评测师的考试,所以没能好好静下心来做这次ping程序的实验,大部分借鉴了此次实验其他参与人员的实验流程,希望有机会完成软考资格考试的时候,再来细致地做这个实验,看起来很有意思!

2019-04-09 13:58:58 qq_40712051 阅读数 492
  • 第07章-网络通信协议(OSI、TCP、UDP、IP、ARP、ICMP...

    课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址和MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令使用详解 tracert命令使用详解 TCP详解 UDP协议详解 网络通信协议(应用层)协议

    8116 人正在学习 去看看 深博

ping命令全称为Packet Internet Grope(因特网包探测器),一般用于测试源主机到目的主机网络的连通性。ping命令在IP层(网络层)利用回应请求/应答ICMP报文测试目的主机或路由器的可达性。

  • 发送ping测试报文

“ping IP地址”或者“ping 域名”,其中对域名有解析作用

ping  baidu.com

在这里插入图片描述

  • 连续发送ping测试报文
    使用-t选项
ping 192.168.1.100  -t
  • 自选数据长度的ping测试报文
    默认情况之下,ping命令使用的测试报数据长度为32B ,使用“-l size”选项可以指定测试数据长度。(65500个字节是数据允许的最大长度)
ping baidu.com -l 65500
  • 修改ping命令请求超时时间
    默认情况下,系统超时时间为1000ms,如果超过这个时间,系统将提醒请求超时。增加“-w”选项指定更长的超时时间。
ping baidu.com -w 6000
  • 不允许路由器和客户端对探测报文进行分段
    有时候为了让探测报文通过MTU(Maximum Transmission Unit,MTU)较小的网络,会将探测报文进行分段。如果不允许被分段,可以使用“-f”选项。
ping baidu.com -f -l  65500
  • DOS攻击_死亡之ping
    Dos攻击,俗称拒绝服务攻击,通过发送无用请求数据包给服务器,耗尽服务器资源,从而无法通过正常的访问服务器资源,导致服务器崩溃。(多台电脑同时进行,效果更佳)事实说明,用一台电脑进行攻击没什么luan用,即便我把目标电脑的防火墙给关闭了,修改请求超时时间。(关闭防火墙的方法:netsh advfirewall set allprofiles state off)
ping -l 65500 目标ip -t  -w 6000

在这里插入图片描述

  • 附录_ping命令的所有命令选项及其含义
    在这里插入图片描述
没有更多推荐了,返回首页