zoukankan      html  css  js  c++  java
  • tracert路由跟踪(ICMP)

    1. ICMP报文是封装在IP数据包中传输的。
      了解这一点对后面编程非常重要,图03是IP数据包的组成结构图:


    图03:IP数据包的组成结构图

      习惯上把IP数据包划分为三个部分:
      (1).IP数据包中的前二十个字节的数据,即图03中从【4位版本】到【32位目的地址IP】,这称为IP首部。  

          (2).选项,即图03中的【选项(如果有)】部分。 

      (3).数据,即图03中的【数据】部分。

      其中后面二个部分组成的就是ICMP报文。ICMP报文的具体组成结构如图04所示:


    图04:ICMP报文组成结构图


      2. ICMP协议没有固定的端口号。

    setsockopt函数解析

    int setsockopt (
    SOCKET
    s,                
      int level,               
      int optname,             
      const char FAR * optval
      int optlen               
    );

    The Windows Sockets setsockopt function sets a socket option.

    中文解释好像是:设置套接字的选项。

    先看如下代码:
    setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int))

    这里是设置SockRaw这个套接字的ip选项中的IP_HDRINCL

    参考以下资料:

    ***************************************************************************************************

    . 套接字选项

    有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了. 

     getsockopt和setsockopt 

    int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
    int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

    level指定控制套接字的层次.可以取三种值:
    1)SOL_SOCKET:通用套接字选项.
    2)IPPROTO_IP:IP选项.
    3)IPPROTO_TCP:TCP选项. 
    optname指定控制的方式(选项的名称),我们下面详细解释 

    optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换 


    选项名称        说明                  数据类型
    ========================================================================
    SOL_SOCKET
    ------------------------------------------------------------------------
    SO_BROADCAST      允许发送广播数据            int
    SO_DEBUG        允许调试                int
    SO_DONTROUTE      不查找路由               int
    SO_ERROR        获得套接字错误             int
    SO_KEEPALIVE      保持连接                int
    SO_LINGER        延迟关闭连接              struct linger
    SO_OOBINLINE      带外数据放入正常数据流         int
    SO_RCVBUF        接收缓冲区大小             int
    SO_SNDBUF        发送缓冲区大小             int
    SO_RCVLOWAT       接收缓冲区下限             int
    SO_SNDLOWAT       发送缓冲区下限             int
    SO_RCVTIMEO       接收超时                struct timeval
    SO_SNDTIMEO       发送超时                struct timeval
    SO_REUSERADDR      允许重用本地地址和端口         int
    SO_TYPE         获得套接字类型             int
    SO_BSDCOMPAT      与BSD系统兼容              int
    ==========================================================================
    IPPROTO_IP
    --------------------------------------------------------------------------
    IP_HDRINCL       在数据包中包含IP首部          int
    IP_OPTINOS       IP首部选项               int
    IP_TOS         服务类型
    IP_TTL         生存时间                int
    ==========================================================================
    IPPRO_TCP
    --------------------------------------------------------------------------
    TCP_MAXSEG       TCP最大数据段的大小           int
    TCP_NODELAY       不使用Nagle算法             int
    =========================================================================

    关于这些选项的详细情况请查看 Linux Programmer"s Manual 

    8.2 ioctl 
    ioctl可以控制所有的文件描述符的情况,这里介绍一下控制套接字的选项. 

    int ioctl(int fd,int req,...)

    ==========================================================================
    ioctl的控制选项
    --------------------------------------------------------------------------
    SIOCATMARK       是否到达带外标记            int
    FIOASYNC        异步输入/输出标志            int
    FIONREAD        缓冲区可读的字节数           int
    ==========================================================================

    参考例子程序:http://115.com/file/bj3k2wa1

  • 相关阅读:
    java积累
    mybatis
    Netty
    springcloud相关笔记整理
    java基础总结笔记
    读书笔记-RocketMQ实战与原理解析
    读书笔记-kafka权威指南
    读书笔记-rabbitmq实战指南
    Centos 部署ServiceDesk
    IDEA将新建项目上传至GitLab
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2801263.html
Copyright © 2011-2022 走看看