计算机网络

一、计算机网络体系


    1. 概念

        
    

    2.功能

        

    3.组成和工作方式

        

    4.分类

        
        

二、分层结构

        

    1. 分层的意义

            

    2.分层的基本原则

            

    3.结构

        

四、分层模型

        
        
    

    1. OSI七层模型

        (1)结构
                    

        (2)通信过程
                        

       

    2.各层的作用以及传输单元

            物理层:在物理媒介上实现比特流的透明传输,确定机械及电气规范(比特Bit)

            数据链路层:将网络层传下来的数据报组装成帧和将物理层传上来的比特组装成帧(帧Frame)
                                   成帧(定义帧的开始和结束,定义帧头和帧尾)
                                   差错控制(帧错+位错)
                                   流量控制  
            网络层:把分组从源端传到目的端,实现网机互联。是主机到主机之间的数据传输(数据报PackeT,分组和数据报之间是父与子的关系,数据报过长就会被切割成一个个的小分组)
                            路由选择(选择最佳的传输路径)
                            流量控制
                            差错控制
                            拥塞控制
            传输层:负责主机中两个进程的通信,即端到端通信,是进程与进程之前的数据传输。(报文段Segment)
                           可靠传输(大文件)、不可靠传输(小文件)
                            差错控制
                            流量控制
                            复用分用

            会话层:建立、管理和终止会话(会话协议数据单元SPDU)

            表示层:对数据进行翻译(数据格式的交换)、加密及解密和压缩及恢复,用于处理在两个通信系统中交换信息的表示方式,也就是规定语法和语义;(表示协议数据单元PPDU)

            应用层:允许访问OSI环境的手段,提供用户与网络的接口,所有能和用户交互产生网络流量的程序(应用协议数据单元APDU)

    3.各层的协议以及设备

            物理层:RJ45、CLOCK、IEEE802.3    (中继器,集线器,网关)
            数据链路:PPP、FR、HDLC、VLAN、MAC  (网桥,交换机)
            网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
            传输层:TCP、UDP、SPX
            会话层:NFS、SQL、NETBIOS、RPC
            表示层:JPEG、MPEG、ASII
            应用层:FTP、DNS、Telnet、SMTP(电子邮件)、HTTP(万维网)、WWW、NFS、FTP(文件传输)
            (注:ARP在OSI里是链路层,在TCP/IP里是网络层)

    4.交换机、路由器、网关

        交换机
  • 在计算机网络系统中,交换机是针对共享工作模式的弱点而推出的。交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的所有的端口都挂接在这条背部总线上,当控制电路收到数据包以后,处理端口会查找内存中的地址对照表以确定目的MAC(网卡的硬件地址)的NIC(网卡)挂接在哪个端口上,通过内部交换矩阵迅速将数据包传送到目的端口。目的MAC若不存在,交换机才广播到所有的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中
  • 交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。
        路由器
  • 路由器(Router)是一种计算机网络设备,提供了路由与转发两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在OSI模型的第三层——即网络层,例如IP协议。
  • 路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)。

        网关

        网关(Gateway),网关顾名思义就是连接两个网络的设备,区别于路由器(由于历史的原因,许多有关TCP/IP 的文献曾经把网络层使用的路由器(Router)称为网关,在今天很多局域网采用都是路由来接入网络,因此现在通常指的网关就是路由器的IP),经常在家 庭中或者小型企业网络中使用,用于连接局域网和Internet。 网关也经常指把一种协议转成另一种协议的设备,比如语音网关。

        在传统TCP/IP术语中,网络设备只分成两种,一种为网关(gateway),另一种为主机(host)。网关能在网络间转递数据包,但主机不能 转送数据包。在主机(又称终端系统,end system)中,数据包需经过TCP/IP四层协议处理,但是在网关(又称中介系 统,intermediate system)只需要到达网际层(Internet layer),决定路径之后就可以转送。在当时,网关 (gateway)与路由器(router)还没有区别。

        在现代网络术语中,网关(gateway)与路由器(router)的定义不同。网关(gateway)能在不同协议间移动数据,而路由器(router)是在不同网络间移动数据,相当于传统所说的IP网关(IP gateway)。

        网关是连接两个网络的设备,对于语音网关来说,他可以连接PSTN网络和以太网,这就相当于VOIP,把不同电话中的模拟信号通过网关而转换成数字信号,而且加入协议再去传输。在到了接收端的时候再通过网关还原成模拟的电话信号,最后才能在电话机上听到。

        对于以太网中的网关只能转发三层以上数据包,这一点和路由是一样的。而不同的是网关中并没有路由表,他只能按照预先设定的不同网段来进行转发。网关最重要的一点就是端口映射,子网内用户在外网看来只是外网的IP地址对应着不同的端口,这样看来就会保护子网内的用户。




五、TCP/IP


    1.TCP/IP每一层的作用

        1) 网络访问层(Network Access Layer)

            在TCP/IP参考模型中并没有详细描述,只是指出主机必须使用某种协议与网络相连。

        2) 互联网层(Internet Layer)
            是整个体系结构的关键部分,其功能是使主机可以把分组发往任何网络,并使分组独立地传向目标。这些分组可能经由不同的网络,到达的顺序和发送的顺序也可能不同。高层如果需要顺序收发,那么就必须自行处理对分组的排序。互联网层使用因特网协议(IP,Internet Protocol)。TCP/IP参考模型的互联网层和OSI参考模型的网络层在功能上非常相似。

        3) 传输层(Tramsport Layer)
            使源端和目的端机器上的对等实体可以进行会话。

         在这一层定义了两个端到端的协议:传输控制协议(TCP,Transmission Control Protocol)和用户数据报协议(UDP,User Datagram Protocol)。

        TCP是面向连接的协议,它提供可靠的报文传输和对上层应用的连接服务。为此,除了基本的数据传输外,它还有可靠性保证、流量控制、多路复用、优先权和安全性控制等功能。

        UDP是面向无连接的不可靠传输的协议,主要用于不需要TCP的排序和流量控制等功能的应用程序。

        4) 应用层(Application Layer)

        包含所有的高层协议,包括:虚拟终端协议(TELNET,TELecommunications NETwork)、文件传输协议(FTP,File Transfer Protocol)、电子邮件传输协议(SMTP,Simple Mail Transfer Protocol)、域名服务(DNS,Domain Name  Service)、网上新闻传输协议(NNTP,Net News Transfer Protocol)和超文本传送协议(HTTP,HyperText Transfer Protocol)等。

        TELNET允许一台机器上的用户登录到远程机器上,并进行工作;

        FTP提供有效地将文件从一台机器上移到另一台机器上的方法;

        SMTP用于电子邮件的收发;

        DNS用于把主机名映射到网络地址;

        NNTP用于新闻的发布、检索和获取;

        HTTP用于在WWW上获取主页。



    2.IP地址分类

      (1)简介
             IP地址是指互联网协议地址,是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP地址编址方案将IP地址空间划分为A、B、C、D、E五类,其中A、B、C是基本类,D、E类作为多播和保留使用,为特殊地址。

             每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。A~E类地址的特点如下:

                    A类地址:以0开头,第一个字节范围:0~127;
                    B类地址:以10开头,第一个字节范围:128~191;
                    C类地址:以110开头,第一个字节范围:192~223;
                    D类地址:以1110开头,第一个字节范围为224~239;
                    E类地址:以1111开头,保留地址
       (2)详解
        A类地址1字节的网络地址 + 3字节主机地址,网络地址的最高位必须是“0”
        一个A类IP地址是指, 在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话,A类IP地址就由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”。A类IP地址中网络的标识长度为8位,主机标识的长度为24位,A类网络地址数量较少,有126个网络,每个网络可以容纳主机数达1600多万台。
        A类IP地址的地址范围1.0.0.0到127.255.255.255(二进制表示为:00000001 00000000 00000000 00000000 - 01111110 11111111 11111111 11111111),最后一个是广播地址。A类IP地址的子网掩码为255.0.0.0,每个网络支持的最大主机数为256的3次方-2=16777214台。
        
        B类地址: 2字节的网络地址 + 2字节主机地址,网络地址的最高位必须是“10”

        一个B类IP地址是指,在IP地址的四段号码中,前两段号码为网络号码。如果用二进制表示IP地址的话,B类IP地址就由2字节的网络地址和2字节主机地址组成,网络地址的最高位必须是“10”。B类IP地址中网络的标识长度为16位,主机标识的长度为16位,B类网络地址适用于中等规模的网络,有16384个网络,每个网络所能容纳的计算机数为6万多台。

        B类IP地址地址范围128.0.0.0-191.255.255.255(二进制表示为:10000000 00000000 00000000 00000000—-10111111 11111111 11111111 11111111),最后一个是广播地址。B类IP地址的子网掩码为255.255.0.0,每个网络支持的最大主机数为256的2次方-2=65534台。

      
         C类地址: 3字节的网络地址 + 1字节主机地址,网络地址的最高位必须是“110”

        一个C类IP地址是指,在IP地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码。如果用二进制表示IP地址的话,C类IP地址就由3字节的网络地址和1字节主机地址组成,网络地址的最高位必须是“110”。C类IP地址中网络的标识长度为24位,主机标识的长度为8位,C类网络地址数量较多,有209万余个网络。适用于小规模的局域网络,每个网络最多只能包含254台计算机。

        C类IP地址范围192.0.0.0-223.255.255.255(二进制表示为: 11000000 00000000 00000000 00000000 - 11011111 11111111 11111111 11111111)。C类IP地址的子网掩码为255.255.255.0,每个网络支持的最大主机数为256-2=254台。

      
        D类地址:多播地址,用于1对多通信,最高位必须是“1110”

        D类IP地址在历史上被叫做多播地址(multicast address),即组播地址。在以太网中,多播地址命名了一组应该在这个网络中应用接收到一个分组的站点。多播地址的最高位必须是“1110”,范围从224.0.0.0到239.255.255.255。

        
        E类地址:为保留地址,最高位必须是“1111”

        (3)特殊地址
                【1】网络地址:IP地址由网络号和主机号(包括子网号)组成,网络地址即:主机号全为0,代表整个网络;
                【2】广播地址:广播地址又称为直接广播地址,是为了区分受限广播地址,广播地址与网络地址的主机号正好相反,在广播地址中,主机号全为1;当向某个网络的广播地址发送消息的时候,相当于给该网络的所有主机发送该消息;
                【3】组播地址:A、B、C类地址都有网络号和主机号之分,但是D、E类并没有划分网络号和主机号。D类地址作为组播地址,用来实现一对多通信,而E类地址为保留地址,供以后使用;
                【4】255.255.255.255:受限的广播地址,它与广播地址(直接广播地址)的区别在于,受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组;而广播地址既可以在本地广播,也可以跨网段广播。
例如,主机192.168.1.1/30上的直接广播数据包后,另外一个网段192.168.1.5/30也能收到该数据报,但若发送受限广播数据报,则不能收到;( 注:一般的广播地址(直接广播地址)能够通过某些路由器(当然不是所有的路由器),而受限的广播地址不能通过路由器。
                【5】0.0.0.0:常用于寻找自己的IP地址,例如在我们的RARP,BOOTP和DHCP协议中,若某个未知IP地址的无盘机想要知道自己的IP地址,它就以255.255.255.255为目的地址,向本地范围(具体而言是被各个路由器屏蔽的范围内)的服务器发送IP请求分组。
                【6】回环地址:127.0.0.0/8被用作回环地址,回环地址表示本机的地址,常用于对本机的测试,用的最多的是127.0.0.1。
                【7】A、B、C类私有地址:
                        
私有地址(private address)也叫专用地址,它们不会在全球使用,只具有本地意义。

                            A类私有地址:10.0.0.0/8,范围是:10.0.0.0~10.255.255.255

                            B类私有地址:172.16.0.0/12,范围是:172.16.0.0~172.31.255.255

                                C类私有地址:192.168.0.0/16,范围是:192.168.0.0~192.168.255.255

        

    3.IP地址与物理地址

        物理地址是数据链路层和物理层使用的地址,IP地址是网络层和以上各层使用的地址,是一种逻辑地址,其中ARP协议用于IP地址与物理地址的对应。

    4. 子网掩码( IP地址与子网掩码相与得到主机号

        随着互连网应用的不断扩大,原先的IPv4的弊端也逐渐暴露出来,即网络号占位太多,而主机号位太少,所以其能提供的主机地址也越来越稀缺,目前除了使用NAT在企业内部利用保留地址自行分配以外,通常都对一个高类别的IP地址进行再划分,以形成多个子网,提供给不同规模的用户群使用。

这里主要是为了在网络分段情况下有效地利用IP地址,通过对主机号的高位部分取作为子网号,从通常的网络位界限中扩展或压缩子网掩码,用来创建某类地址的更多子网。但创建更多的子网时,在每个子网上的可用主机地址数目会比原先减少。

        什么是子网掩码?

        子网掩码是标志两个IP地址是否同属于一个子网的,也是32位二进制地址,其每一个为1代表该位是网络位,为0代表主机位。它和IP地址一样也是使用点式十进制来表示的。如果两个IP地址在子网掩码的按位与的计算下所得结果相同,即表明它们共属于同一子网中。

        在计算子网掩码时,我们要注意IP地址中的保留地址,即“ 0”地址和广播地址,它们是指主机地址或网络地址全为“ 0”或“ 1”时的IP地址,它们代表着本网络地址和广播地址,一般是不能被计算在内的。

        子网掩码的计算:

        对于无须再划分成子网的IP地址来说,其子网掩码非常简单,即按照其定义即可写出:如某B类IP地址为 10.12.3.0,无须再分割子网,则该IP地址的子网掩码255.255.0.0。如果它是一个C类地址,则其子网掩码为 255.255.255.0。其它类推,不再详述。下面我们关键要介绍的是一个IP地址,还需要将其高位主机位再作为划分出的子网网络号,剩下的是每个子网的主机号,这时该如何进行每个子网的掩码计算。

下面总结一下有关子网掩码和网络划分常见的面试考题:

        1)利用子网数来计算

            在求子网掩码之前必须先搞清楚要划分的子网数目,以及每个子网内的所需主机数目。

            (1) 将子网数目转化为二进制来表示;

                    如欲将B类IP地址168.195.0.0划分成27个子网:27=11011;

            (2) 取得该二进制的位数,为N;

                    该二进制为五位数,N = 5

            (3) 取得该IP地址的类子网掩码,将其主机地址部分的的前N位置1即得出该IP地址划分子网的子网掩码。

                    将B类地址的子网掩码255.255.0.0的主机地址前5位置 1,得到 255.255.248.0

        2)利用主机数来计算

                    如欲将B类IP地址168.195.0.0划分成若干子网,每个子网内有主机700台:

            (1) 将主机数目转化为二进制来表示;

                    700=1010111100;

            (2) 如果主机数小于或等于254(注意去掉保留的两个IP地址),则取得该主机的二进制位数,为N,这里肯定 N<8。如果大于254,则 N>8,这就是说主机地址将占据不止8位;

                    该二进制为十位数,N=10;

            (3) 使用255.255.255.255来将该类IP地址的主机地址位数全部置1,然后从后向前的将N位全部置为 0,即为子网掩码值。

                    将该B类地址的子网掩码255.255.0.0的主机地址全部置1,得到255.255.255.255,然后再从后向前将后 10位置0,即为:11111111.11111111.11111100.00000000,即255.255.252.0。这就是该欲划分成主机为700台的B类IP地址                     168.195.0.0的子网掩码。

        3)还有一种题型,要你根据每个网络的主机数量进行子网地址的规划和计算子网掩码。这也可按上述原则进行计算。

                比如一个子网有10台主机,那么对于这个子网需要的IP地址是:

                10+1+1+1=13

            注意:加的第一个1是指这个网络连接时所需的网关地址,接着的两个1分别是指网络地址和广播地址。

            因为13小于16(16等于2的4次方),所以主机位为4位。而256-16=240,所以该子网掩码为255.255.255.240。

            如果一个子网有14台主机,不少人常犯的错误是:依然分配具有16个地址空间的子网,而忘记了给网关分配地址。这样就错误了,因为14+1+1+1=17,17大于16,所以我们只能分配具有32个地址(32等于2的5次方)空间的子网。这时子网掩码为:255.255.255.224。


    5.ARP/RARP协议

     (1)ARP协议:
            网络层的ARP协议完成了IP地址与物理地址的映射;地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。
            ARP协议工作流程:

                【1】首先,每个主机都会在自己的ARP缓冲区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系。

                【2】当源主机要发送数据时,首先检查ARP列表中是否有对应IP地址的目的主机的MAC地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送ARP数据包,该数据包包括的内容有:源主机 IP地址,源主机MAC地址,目的主机的IP 地址。
                【3】当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包,如果是,则首先从数据包中取出源主机的IP和MAC地址写入到ARP列表中,如果已经存在,则覆盖,然后将自己的MAC地址写入ARP响应包中,告诉源主机自己是它想要找的MAC地址。

                【4】源主机收到ARP响应包后。将目的主机的IP和MAC地址写入ARP列表,并利用此信息发送数据。如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。

                          广播发送ARP请求,单播发送ARP响应。

        (2)RARP协议
                逆地址解析协议,即RARP,功能和ARP协议相对,其将局域网中某个主机的物理地址转换为IP地址,比如局域网中有一台主机只知道物理地址而不知道IP地址,那么可以通过RARP协议发出征求自身IP地址的广播请求,然后由RARP服务器负责回答。

                RARP协议工作流程:

                【1】给主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;

                【2】本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;

                【3】如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
                【4】如果不存在,RARP服务器对此不做任何的响应;
                【5】源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。

    

    6.TCP对应的协议和UDP对应的协议

     TCP对应的协议:

    (1) FTP:定义了文件传输协议,使用21端口。

    (2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。

    (3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。

    (4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。

    (5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。

    UDP对应的协议:

    (1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。

    (2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。

    (3) TFTP(Trival File Tran敏感词er Protocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

    7.协议详解

        ICMP协议: 因特网控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。

        TFTP协议: 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。

        HTTP协议: 超文本传输协议,是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

        DHCP协议: 动态主机配置协议,是一种让系统得以连接到网络上,并获取所需要的配置参数手段。

        NAT协议:网络地址转换属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,

        DHCP协议:一个局域网的网络协议,使用UDP协议工作,用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作***管理的手段。

        RARP协议:RARP是逆地址解析协议,作用是完成硬件地址到IP地址的映射,主要用于无盘工作站,因为给无盘工作站配置的IP地址不能保存。工作流程:在网络中配置一台RARP服务器,里面保存着IP地址和MAC地址的映射关系,当无盘工作站启动后,就封装一个RARP数据包,里面有其MAC地址,然后广播到网络上去,当服务器收到请求包后,就查找对应的MAC地址的IP地址装入响应报文中发回给请求者。因为需要广播请求报文,因此RARP只能用于具有广播能力的网络。

    8.端口对应服务

        (1)什么是端口?
            
                注意区别硬件端口。
  • 软件端口是应用层的各种协议进程与运输实体进行层间交互的一种地址。
  • 端口号只具有本地意义,它只为标志计算机应用层中的各个进程在和运输层交互时的层间接口,在互联网不同计算机中,相同的端口号是没有关联的。
  • 两个计算机的进程相互通信,不仅需要知道对方的IP地址(为了找到对方计算机),还要知道对方的端口号(为了找到对方计算机中的应用进程)
  • 两大类:1.服务器端使用的端口号(常用熟知)2.客户端使用的端口号(短暂)。
        (2)端口对应的服务
            


    9.TCP三次握手和四次挥手

        (1)三次握手(我要和你建立链接,你真的要和我建立链接么,我真的要和你建立链接,成功):
  • 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  • 第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  • 第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
       

            (2) 四次挥手(我要和你断开链接;好的,断吧。我也要和你断开链接;好的,断吧):
  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。此时TCP链接处于半关闭状态,即客户端已经没有要发送的数据了,但服务端若发送数据,则客户端仍要接收。
  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
        

        (3) 为什么需要三次握手,两次不可以么?
                为了防止 已失效的链接请求报文突然又传送到了服务端,因而产生错误。客户端发出的连接请求报文并未丢失,而是在某个网络节点长时间滞留了,以致延误到链接释放以后的某个时间才到达Server。这是,Server误以为这是Client发出的一个新的链接请求,于是就向客户端发送确认数据包,同意建立链接。若不采用“三次握手”,那么只要Server发出确认数据包,新的链接就建立了。由于client此时并未发出建立链接的请求,所以其不会理睬Server的确认,也不与Server通信;而这时Server一直在等待Client的请求,这样Server就白白浪费了一定的资源。若采用“三次握手”,在这种情况下,由于Server端没有收到来自客户端的确认,则就会知道Client并没有要求建立请求,就不会建立链接。
                简单来说,就是在通信前客户端和服务端互相确认对方的接收和发送能力是正常的。第一次握手 --- 服务端确认客户端的发送能力和服务端的接收能力是正常的;第二次握手 --- 客户端确认服务端的发送和接收能力以及客服端的发送和接收能力是正常的;第三次握手 --- 服务端确认客户端的接收能力和服务端的发送能力是正常的;每次都是接收到数据包的一方可以得到一些结论,而发送的一方其实是没有任何头绪的,所以至少需要三次握手才能使得双方都得出双方的接发能力是正常的结论;

        (4)为什么需要四次挥手?
                【1】TCP连接是双向传输的对等的模式,就是说双方都可以同时向对方发送或接收数据。当有一方要关闭连接时,会发送指令告知对方,我要关闭连接了。
                【2】这时对方会回一个ACK,此时一个方向的连接关闭。但是另一个方向仍然可以继续传输数据,也就是说,服务端收到客户端的 FIN 标志,知道客户端想要断开这次连接了,但是,我服务端,我还想发数据呢?我等到发送完了所有的数据后,会发送一个 FIN 段来关闭此方向上的连接。接收方发送 ACK确认关闭连接。
                            注意,接收到FIN报文的一方只能回复一个ACK, 它是无法马上返回对方一个FIN报文段的,因为结束数据传输的“指令”是上层应用层给出的,我只是一个“搬运工”,我无法了解“上层的意志”。
                【3】客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。
                【4】因为服务端在 LISTEN 状态下,收到建立连接请求的 SYN 报文后,把 ACK 和 SYN 放在一个报文里发送给客户端。而关闭连接时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发。
                TIME_WAIT
                客户端接收到服务器端的 FIN 报文后进入此状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
  • 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。

  • 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。



    10.TCP和UDP的区别?各自的使用场景?

            TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议,它们之间的区别包括:
        (1)TCP是面向连接的,UDP是无连接的;
        (2)TCP是可靠的,UDP是不可靠的;
        (3)TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对多的通信模式;
        (4)TCP是面向字节流的,UDP是面向报文的;
        (5)TCP有拥塞控制机制;UDP没有拥塞控制,适合媒体通信;
        (6)TCP首部开销(20个字节)比UDP的首部开销(8个字节)要大;
            使用场景:
            TCP:当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 

在日常生活中,常见使用TCP协议的应用如:浏览器,用的HTTP;FlashFXP,用的FTP;Outlook,用的POP、SMTP;Putty,用的Telnet、SSH;QQ文件传输

            UDP:当强调传输性能而不是传输的完整性时, 要求网络通讯速度能尽量的快。如:QQ语音 QQ视频等。

    11.为什么TCP叫做数据流模式?UDP为数据报模式?

  • 所谓的“流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的,比如你通过 TCP连接给另一端发送数据,你只调用了一次 write,发送了100个字节,但是对方可以分10次收完,每次10个字节;你也可以调用10次write,每次10个字节,但是对方可以一次就收完。
  • 原因:这是因为TCP是面向连接的,一个 socket 中收到的数据都是由同一台主机发出,且有序地到达,所以每次读取多少数据都可以。
  • 所谓的“数据报模式”,是指UDP发送端调用了几次 write,接收端必须用相同次数的 read 读完。UDP是基于报文的,在接收的时候,每次最多只能读取一个报文,报文和报文是不会合并的,如果缓冲区小于报文长度,则多出的部分会被丢弃。
  • 原因:这是因为UDP是无连接的,只要知道接收端的 IP 和端口,任何主机都可以向接收端发送数据。 这时候,如果一次能读取超过一个报文的数据, 则会乱套。

    

    12.UDP和TCP的首部格式

        
    
     
        


     13.TCP短连接和长连接的区别

        (1)短连接:Client 向 Server 发送消息,Server 回应 Client,然后一次读写就完成了,这时候双方任何一个都可以发起 close 操作,不过一般都是 Client 先发起 close 操作。短连接一般只会在 Client/Server 间传递一次读写操作。
                                短连接的优点:管理起来比较简单,建立存在的连接都是有用的连接,不需要额外的控制手段。
        (2)长连接:Client 与 Server 完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。
                                在长连接的应用场景下,Client 端一般不会主动关闭它们之间的连接,Client 与 Server 之间的连接如果一直不关闭的话,随着客户端连接越来越多,Server 压力也越来越大,这时候 Server 端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致 Server 端服务受损;如果条件再允许可以以客户端为颗粒度,限制每个客户端的最大长连接数,从而避免某个客户端连累后端的服务。
        (3)长连接和短连接的产生在于 Client 和 Server 采取的关闭策略,具体的应用场景采用具体的策略。

    14.TCP粘包、拆包及其解决方法

        (1)为什么常说 TCP 有粘包和拆包的问题而不说 UDP ?

                由前两节可知,UDP 是基于报文发送的,UDP首部采用了 16bit 来指示 UDP 数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。而 TCP 是基于字节流的,虽然应用层和 TCP 传输层之间的数据交互是大小不等的数据块,但是 TCP 并没有把这些数据块区分边界,仅仅是一连串没有结构的字节流;另外从 TCP 的帧结构也可以看出,在 TCP 的首部没有表示数据长度的字段,基于上面两点,在使用 TCP 传输数据时,才有粘包或者拆包现象发生的可能。

        (2)什么是粘包、拆包?

                假设 Client 向 Server 连续发送了两个数据包,用 packet1 和 packet2 来表示,那么服务端收到的数据可以分为三种情况,现列举如下:
                   【1】第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象。
                            
                  【2】第二种情况,接收端只收到一个数据包,但是这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。

                            

                   【3】第三种情况,这种情况有两种表现形式,如下图。接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。这两种情况如果不加特殊处理,对于接收端同样是不好处理的。
                            
            
            (3)
为什么会发生 TCP 粘包、拆包?
  • 要发送的数据大于 TCP 发送缓冲区剩余空间大小,将会发生拆包。

  • 待发送数据大于 MSS(最大报文长度),TCP 在传输前将进行拆包。

  • 要发送的数据小于 TCP 发送缓冲区的大小,TCP 将多次写入缓冲区的数据一次发送出去,将会发生粘包。

  • 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

            (4)粘包、拆包解决办法

                由于 TCP 本身是面向字节流的,无法理解上层的业务数据,所以在底层是无法保证数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,归纳如下:

  • 消息定长:发送端将每个数据包封装为固定长度(不够的可以通过补 0 填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

  • 设置消息边界:服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如 FTP 协议。

  • 将消息分为消息头和消息体:消息头中包含表示消息总长度(或者消息体长度)的字段。

  • 更复杂的应用层协议比如 Netty 中实现的一些协议都对粘包、拆包做了很好的处理。


    15.TCP可靠传输的实现机制

        TCP提供一种面向连接的、可靠的字节流服务。其中,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信;而字节流服务意味着两个应用程序通过TCP链接交换8bit字节构成的字节流,TCP不在字节流中插入记录标识符。

        对于可靠性,TCP通过以下方式进行保证:

  1. 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;
  2. 对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;
  3. 丢弃重复数据:对于重复数据,能够丢弃重复数据;
  4. 应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
  5. 超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
  6. 流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。
        TCP 使用超时重传来实现可靠传输:如果一个已经发送的报文段在超时时间内没有收到确认,那么就重传这个报文段。一个报文段从发送再到接收到确认所经过的时间称为往返时间 RTT,加权平均往返时间 RTTs 计算如下:
        

    16.TCP滑动窗口机制

            窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。
            发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。
            接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
            

    17.TCP的流量控制

        流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。实际上,为了避免此问题的产生,发送端主机会时不时的发送一个叫做窗口探测的数据段,此数据段仅包含一个字节来获取最新的窗口大小信息。

    18.TCP的拥塞控制

        如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
        
        

    19.TCP拥塞控制的实现机制 --- 慢开始 、 拥塞避免、 快重传 、 快恢复

            TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
            发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。

            为了便于讨论,做如下假设:

  • 接收方有足够大的接收缓存,因此不会发生流量控制;

  • 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
            
        (1)慢开始和拥塞避免
                    发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 ...
                    注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。
                    如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
        (2)快重传和快恢复
                    在接收方,要求每次接收到报文段都应该对最后一个已收到的有序报文段进行确认。例如已经接收到 M1 和 M2,此时收到 M4,应当发送对 M2 的确认。
                    在发送方,如果收到三个重复确认,那么可以知道下一个报文段丢失,此时执行快重传,立即重传下一个报文段。例如收到三个 M2,则 M3 丢失,立即重传 M3。
                    在这种情况下,只是丢失个别报文段,而不是网络拥塞。因此执行快恢复,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注意到此时直接进入拥塞避免。
                    慢开始和快恢复的快慢指的是 cwnd 的设定值,而不是 cwnd 的增长速率。慢开始 cwnd 设定为 1,而快恢复 cwnd 设定为 ssthresh。
                        

    20.提高网络利用率

        (1)Nagle 算法
                发送端即使还有应该发送的数据,但如果这部分数据很少的话,则进行延迟发送的一种处理机制。具体来说,就是仅在下列任意一种条件下才能发送数据。如果两个条件都不满足,那么暂时等待一段时间以后再进行数据发送。
                【1】已发送的数据都已经收到确认应答。
                【2】可以发送最大段长度的数据时。
        (2)延迟确认应答
                接收方收到数据之后可以并不立即返回确认应答,而是延迟一段时间的机制。
                【1】在没有收到 2*最大段长度的数据为止不做确认应答。
                【2】其他情况下,最大延迟 0.5秒 发送确认应答。
                【3】TCP 文件传输中,大多数是每两个数据段返回一次确认应答。
        (3)捎带应答
                在一个 TCP 包中既发送数据又发送确认应答的一种机制,由此,网络利用率会提高,计算机的负荷也会减轻,但是这种应答必须等到应用处理完数据并将作为回执的数据返回为止。

    21.DDos攻击

            (1)大规模DDOS攻击事件
                    全球最大同性交友网,没错,就是GitHub!美国东部时间 2 月 28 日,GitHub 在一瞬间遭到高达 1.35Tbps 的带宽攻击。这次 DDoS 攻击几乎可以堪称是互联网有史以来规模最大、威力最大的 DDoS 攻击了。在 GitHub 遭到攻击后,事件并没有停歇,仅仅一周后,DDoS 攻击又开始对 Google、亚马逊甚至 ***hub 等网站进行了 DDoS 攻击。后续的 DDoS 攻击带宽最高也达到了 1Tbps。

            (2)什么是DDOS攻击?
                    可能我举个例子会更加形象点。我开了一家有五十个座位的重庆火锅店,由于用料上等,童叟无欺。平时门庭若市,生意特别红火,而对面二狗家的火锅店却无人问津。二狗为了对付我,想了一个办法,叫了五十个人来我的火锅店坐着却不点菜,让别的客人无法吃饭。
                    上面这个例子讲的就是典型的 DDoS 攻击,全称是 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。一般来说是指攻击者利用“肉鸡”对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。在线游戏、互联网金融等领域是 DDoS 攻击的高发行业。

            (3)如何应对DDOS攻击?
                   高防服务器

                    还是拿我开的重庆火锅店举例,高防服务器就是我给重庆火锅店增加了两名保安,这两名保安可以让保护店铺不受流氓骚扰,并且还会定期在店铺周围巡逻防止流氓骚扰。高防服务器主要是指能独立硬防御 50Gbps 以上的服务器,能够帮助网站拒绝服务攻击,定期扫描网络主节点等,这东西是不错,就是贵~

                    黑名单

                    面对火锅店里面的流氓,我一怒之下将他们拍照入档,并禁止他们踏入店铺,但是有的时候遇到长得像的人也会禁止他进入店铺。这个就是设置黑名单,此方法秉承的就是“错杀一千,也不放一百”的原则,会封锁正常流量,影响到正常业务。

                    DDoS 清洗

                    DDos 清洗,就是我发现客人进店几分钟以后,但是一直不点餐,我就把他踢出店里。DDoS 清洗会对用户请求数据进行实时监控,及时发现DOS攻击等异常流量,在不影响正常业务开展的情况下清洗掉这些异常流量。

                    CDN 加速,我们可以这么理解:为了减少流氓骚扰,我干脆将火锅店开到了线上,承接外卖服务,这样流氓找不到店在哪里,也耍不来流氓了。在现实中,CDN 服务将网站访问流量分配到了各个节点中,这样一方面隐藏网站的真实 IP,另一方面即使遭遇 DDoS 攻击,也可以将流量分散到各个节点中,防止源站崩溃。

                    是针对容易遭受大流量 DDoS 攻击的电商、金融、游戏等类型的客户专门推出的付费增值服务。DDoS 高防节点拥有强大的流量攻击防护能力,并且支持 TCP/UDP 等多种协议,可防护 SYN Flood,ACK Flood 等多种类型的攻击。用户接入服务后,防护平台会识别并将攻击流量引流至高防节点,确保用户业务的可持续使用。

        (3)DDos攻击有哪些?
               【1】 ICMP Flood

                        ICMP(Internet控制报文协议)用于在IP主机、路由器之间传递控制消息,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。通过对目标系统发送海量数据包,就可以令目标主机瘫痪,如果大量发送就成了洪水攻击。

                【2】UDP Flood

                        UDP协议是一种无连接的服务,在UDP Flood 中,攻击者通常发送大量伪造源IP地址的小UDP包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100k bps的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。

                上述传统的流量型攻击方式技术含量较低,伤人一千自损八百,攻击效果通常依赖受控主机本身的网络性能,而且容易被查到攻击源头,单独使用的情况已不常见。于是,具有四两拔千斤效果的反射型放大攻击就出现了。

                【3】NTP Flood

                        NTP是标准的基于UDP协议传输的网络时间同步协议,由于UDP协议的无连接性,方便伪造源地址。攻击者使用特殊的数据包,也就是IP地址指向作为反射器的服务器,源IP地址被伪造成攻击目标的IP,反射器接收到数据包时就被骗了,会将响应数据发送给被攻击目标,耗尽目标网络的带宽资源。一般的NTP服务器都有很大的带宽,攻击者可能只需要1Mbps的上传带宽欺骗NTP服务器,就可给目标服务器带来几百上千Mbps的攻击流量。

因此,“问-答”方式的协议都可以被反射型攻击利用,将质询数据包的地址伪造为攻击目标地址,应答的数据包就会都被发送至目标,一旦协议具有递归效果,流量就被显著放大了,堪称一种“借刀杀人”的流量型攻击。

                        

                    【4】SYN Flood
                         这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。建立TCP连接,需要三次握手——客户端发送SYN报文,服务端收到请求并返回报文表示接受,客户端也返回确认,完成连接。
                        SYN Flood 就是用户向服务器发送报文后突然死机或掉线,那么服务器在发出应答报文后就无法收到客户端的确认报文(第三次握手无法完成),这时服务器端一般会重试并等待一段时间后再丢弃这个未完成的连接。一个用户出现异常导致服务器的一个线程等待一会儿并不是大问题,但恶意攻击者大量模拟这种情况,服务器端为了维护数以万计的半连接而消耗非常多的资源,结果往往是无暇理睬客户的正常请求,甚至崩溃。从正常客户的角度看来,网站失去了响应,无法访问。
                        

                        【5】CC 攻击
                            CC攻击是目前应用层攻击的主要手段之一,借助代理服务器生成指向目标系统的合法请求,实现伪装和DDoS。我们都有这样的体验,访问一个静态页面,即使人多也不需要太长时间,但如果在高峰期访问论坛、贴吧等,那就很慢了,因为服务器系统需要到数据库中判断访问者否有读帖、发言等权限。访问的人越多,论坛的页面越多,数据库压力就越大,被访问的频率也越高,占用的系统资源也就相当可观。
                            CC攻击就充分利用了这个特点,模拟多个正常用户不停地访问如论坛这些需要大量数据操作的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的请求,网络拥塞,正常访问被中止。这种攻击技术性含量高,见不到真实源IP,见不到特别大的异常流量,但服务器就是无法进行正常连接
                            
                

                            之所以选择代理服务器是因为代理可以有效地隐藏自己的身份,也可以绕开防火墙,因为基本上所有的防火墙都会检测并发的TCP/IP连接数目,超过一定数目一定频率就会被认为是Connection-Flood。当然也可以使用肉鸡来发动CC攻击,攻击者使用CC攻击软件控制大量肉鸡发动攻击,肉鸡可以模拟正常用户访问网站的请求伪造成合法数据包,相比前者来说更难防御。

                            CC攻击是针对Web服务在第七层协议发起的攻击,在越上层协议上发动DDoS攻击越难以防御,上层协议与业务关联愈加紧密,防御系统面临的情况也会更复杂。比如CC攻击中最重要的方式之一HTTP Flood,不仅会直接导致被攻击的Web前端响应缓慢,对承载的业务造成致命的影响,还可能会引起连锁反应,间接攻击到后端的Java等业务层逻辑以及更后端的数据库服务。

                            由于CC攻击成本低、威力大,知道创宇安全专家组发现80%的DDoS攻击都是CC攻击。带宽资源严重被消耗,网站瘫痪;CPU、内存利用率飙升,主机瘫痪;瞬间快速打击,无法快速响应。


                        【6】DNS Query Flood

                              DNS作为互联网的核心服务之一,自然也是DDoS攻击的一大主要目标。DNS Query Flood采用的方法是操纵大量傀儡机器,向目标服务器发送大量的域名解析请求。服务器在接收到域名解析请求时,首先会在服务器上查找是否有对应的缓存,若查找不到且该域名无法直接解析时,便向其上层DNS服务器递归查询域名信息。

通常,攻击者请求解析的域名是随机生成或者是网络上根本不存在的域名,由于在本地无法查到对应的结果,服务器必须使用递归查询向上层域名服务器提交解析请求,引起连锁反应。解析过程给服务器带来很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。
                            
                                根据微软的统计数据,一台DNS服务器所能承受的动态域名查询的上限是每秒钟9000个请求。而一台P3的PC机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的DNS服务器瘫痪,由此可见DNS服务器的脆弱性。

                        【7】混合攻击
                                在实际情况中,攻击者只求达到打垮对方的目的,发展到现在,高级攻击者已经不倾向使用单一的攻击手段作战了,而是根据目标系统的具体环境灵动组合,发动多种攻击手段,既具备了海量的流量,又利用了协议、系统的缺陷,尽其所能地展开攻势。
                                对于被攻击目标来说,需要面对不同协议、不同资源的分布式的攻击,分析、响应和处理的成本就会大大增加。
                                

        (4)DDos肉鸡是神马?

                  “肉鸡”可谓是DDoS攻击的核心大杀器,作为一个要发起DDoS攻击的黑客来说,没有肉鸡就是没有枪,裸奔不好使的。D放眼肉鸡江湖,来源各异,品种丰富。攻击者没点套路怎么当“鸡主”?况且搞个鸡,那都是小菜一碟。

                    
                        【1】什么是肉鸡?
                            所谓的肉鸡,就是指发动DDOS等相关网络攻击的设备,DDOS是指通过不断的高并发的http请求造成服务器堵塞甚至瘫痪,那么要达到破坏范围如此之广的效果,这些肉鸡哪里来的呢?互联网终端设备,包括电脑、服务器、手机,等等,现在越来越多的汽车、智能家居、穿戴设备接入了互联网,而所以这一切这些都可以成为潜在的 DDOS攻击者,细思极恐。
                        【2】肉鸡哪里来的?
                                养鸡、买鸡、抓鸡那都是司空见惯的,做为一个资深的搞鸡专业户,社会这么发达,智能化、工业化程度这么高,肉鸡的品种也要多引进嘛。千万不要只局限于PC鸡、服务鸡,说到底,只要是联网的设备都有可能成为肉鸡,比如:你每天都在撸的手鸡,再有逼格一些的物联鸡、工控鸡、车载鸡,以及我们常见的路由鸡,这些统统都可以成为被攻击者控制的肉鸡。

                                比如你的手机,那么多免费软件,你不会真的就认为都是免费的吧?偶尔几个专业养机的你也能理解对不对?哪天软件商有困难了借你的网络带宽用用也是合情合理的,毕竟养机千日,用机一时。每次发布新的0 Day漏洞,全世界的网络流量都要上升几十个百分点,干嘛的呢?漫山遍野跑的都是抓肉鸡的专业人,抓肉鸡的人太多,僧多肉少。

                                一 个软件,一个应用,都可以让你的电脑成为别人的肉鸡。所以,知道为何攻击量可以这么大了吧?因为我们身边的所有可以连接网络的设备都有可能成为黑客用来DDos攻击的肉鸡啊!
                        【3】肉弹冲击
                            养这么多鸡难道是闲得蛋疼或者是好玩?当然不是了!

                           某一天“鸡主”手头紧张,想捞点钱出去潇洒潇洒(勒索);又或者眼红农场对面那家人生意贼好(行业竞争),这时候这时候手上十多万甚至几十万的肉鸡就派上用场了。向目标发动肉鸡占领(DDoS攻击),一般有3步:

                                第1步:搜集目标,刺探军情。比如:搜集目标家有多少人,都使用一些什么设备鸡,家庭情况怎么样,值不值得攻击,然后找个机会顺便潜入目标家拿到开门的最高权限;

                                第2步:确定攻击时间段。当目标一家人都在家或者有很多客人上门的时候是发动攻击的最佳时间段;

                                第3步:发动肉鸡攻击。经过前2步的精心准备后,“鸡主”把这些肉鸡全引向盯梢已久的目标家门口,打开门,让肉鸡如洪水般涌入目标家里。
                                
            
                        经过以上3步,便完成了一次完整的攻击过程。这时候,目标家门内外被肉鸡围住、塞满,地上拉得全是鸡屎,噪音扰人,主人赶鸡乏力,客人无从登门。如果这些肉鸡不离开,有人再想进门简直那与登天(拒绝服务达成)。这时候“鸡主”的攻击就已经成功了,而且还会根据实际情况再放一些肉鸡进来,顺便还威胁主人家,不给钱就不撤鸡,最后老实又不想惹事的主人家只有出钱息事宁人了。
                                


    22.Get和Post的区别

        GET与POST是我们常用的两种HTTP Method,二者之间的区别主要包括如下五个方面:
  1. 从功能上讲,GET一般用来从服务器上获取资源,POST一般用来更新服务器上的资源;
  2. 从REST服务角度上说,GET是幂等的,即读取同一个资源,总是得到相同的数据,而POST不是幂等的,因为每次请求对资源的改变并不是相同的;进一步地,GET不会改变服务器上的资源,而POST会对服务器资源进行改变;
  3. 从请求参数形式上看,GET请求的数据会附在URL之后,即将请求数据放置在HTTP报文的 请求头中,以?分割URL和传输数据,参数之间以&相连。特别地,如果数据是英文字母/数字,原样发送;否则,会将其编码为application/x-www-form-urlencoded MIME字符串(如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII);而POST请求会把提交的数据则放置在是HTTP请求报文的请求体 中。
  4. 就安全性而言,POST的安全性要比GET的安全性高,因为GET请求提交的数据将明文出现在URL上,而且POST请求参数则被包装到请求体中,相对更安全。
  5. 从请求的大小看,GET请求的长度受限于浏览器或服务器对URL长度的限制,允许发送的数据量比较小,而POST请求则是没有大小限制的。、


    23.从输入网址到获得页面的过程以及设计的各层协议?

    过程:
  1. 浏览器查询DNS,获取域名对应的IP地址:具体过程包括浏览器搜索自身的DNS缓存、搜索操作系统的DNS缓存、读取本地的Host文件和向本地DNS服务器进行查询等。对于向本地DNS服务器进行查询,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析(此解析具有权威性);如果要查询的域名不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析(此解析不具有权威性)。如果本地域名服务器并未缓存该网址映射关系,那么将根据其设置发起递归查询或者迭代查询;
  2. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
  3. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求;
  4. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器;
  5. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源;
  6. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面。
    协议
    应用层:HTTP、DNS、(DNS解析域名为目的IP,通过IP找到服务器路径,客户端向服务器发起HTTP会话)

    传输层:TCP、 (HTTP会话会被分成报文段,添加源、目的端口;TCP协议进行主要工作)

    网际层:IP、(ARP)、ICMP、(为数据包选择路由,IP协议进行主要工作)

    链路层:PPP、(ARP)(发送IP数据包到达服务器的地址,ARP协议将IP地址转成MAC地址)



    24.Http和Https的区别


        Http协议运行在TCP之上,明文传输,客户端与服务器端都无法验证对方的身份;Https是身披SSL(Secure Socket Layer)外壳的Http,运行于SSL上,SSL运行于TCP之上,是添加了加密和认证机制的HTTP。二者之间存在如下不同:
  • 端口不同:Http与Https使用不同的连接方式,用的端口也不一样,前者是80,后者是443;
  • 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
  • 开销:Https通信需要证书,而证书一般需要向认证机构购买;
        Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。

    25.对称加密和非对称加密

        对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;
        非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。由于非对称加密的方式不需要发送用来解密的私钥,所以可以保证安全性;但是和对称加密比起来,它非常的慢,所以我们还是要用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去。

    26.HTTP(超文本传输协议)

        (1)简介
                    HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个基于TCP/IP通信协议来传递数据,默认端口号为80。

        (2)HTTP工作原理

                    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。
        (3) HTTP 请求/响应的步骤
                    1、客户端连接到Web服务器

                            一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn

                    2、发送HTTP请求

                            通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

                    3、服务器接受请求并返回HTTP响应

                            Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

                    4、释放连接TCP连接

                            若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

                    5、客户端浏览器解析HTML内容

                           客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

        (4)HTTP消息结构

                    HTTP是基于客户端/服务端(C/S)的架构模型。客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,请求报文的一般格式

                    

        (5)常见状态码(状态码告知从服务器端返回的请求结果
  •  2开头状态码

    2xx (成功)表示成功处理了请求的状态代码
200 (成功) 服务器已成功处理了请求。 通常。
  • 3开头状态码

    3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
  • 4开头状态码

    4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理
1:400 (错误请求) 服务器不理解请求的语法。
 
2:403 (禁止) 服务器拒绝请求。

3:404 (未找到) 服务器找不到请求的网页。
  • 5开头状态码

   5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错
500 (服务器内部错误) 服务器遇到错误,无法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

重点:200,304,403,404,500


    27.HTTP1.0和HTTP1.1的区别

        (1)HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理

                HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

                HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent  connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).

                在1.0时的会话方式:
             1. 建立连接
             2. 发出请求信息
             3. 回送响应信息
             4. 关掉连接

             HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。

            请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。  HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。

        (2)HTTP 1.1增加host字段

                在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。

                 HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。

        (3)100(Continue) Status(节约带宽)

                HTTP/1.1加入了一个新的状态码100(Continue)。客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。100 (Continue) 状态代码的使用,允许客户端在发request消息body之前先用request header试探一下server,看server要不要接收request body,再决定要不要发request body。

         (4)HTTP/1.1中引入了Chunked transfer-coding来解决上面这个问题,发送方将消息分割成若干个任意大小的数据块,每个数据块在发送时都会附上块的长度,最后用一个零长度的块作为消息结束的标志。这种方法允许发送方只缓冲消息的一个片段,避免缓冲整个消息带来的过载。

        (5)HTTP/1.1在1.0的基础上加入了一些cache的新特性,当缓存对象的Age超过Expire时变为stale对象,cache不需要直接抛弃stale对象,而是与源服务器进行重新激活(revalidation)。

    28.HTTP长连接和短连接

        在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

         而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

Connection:keep-alive 

        在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

         HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

    29.DNS域名系统

        (1)什么是DNS?
            DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。你可以把它想象成一本巨大的电话本。举例来说,如果你要访问域名math.stackexchange.com,首先要通过DNS查出它的IP地址是151.101.129.69。DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名的指定类别。基于UDP服务,端口53. 该应用一般不直接为用户使用,而是为其他应用服务,如HTTP,SMTP等在其中需要完成主机名到IP地址的转换。DNS就是这样的一位“翻译官”,它的基本工作原理可用下图来表示:
            

        (2)DNS域名空间结构
                域名系统作为一个层次结构和分布式数据库,包含各种类型的数据,包括主机名和域名。DNS数据库中的名称形成一个分层树状结构称为域命名空间。
                    

            根域:DNS域名使用中规定由尾部句点'.'来指定名称位于根或者更高层次的域层次结构。

            顶级域:用来指示某个国家、地区或者组织。采用三个字符,如com -> 商业公司,edu -> 教育机构,net -> 网络公司,gov -> 非军事政府机构等等。

            二级域:个人或者组织在Internet使用的注册名称。采用两个字符,如:cn -> 代表中国,jp -> 日本,uk -> 英国,hk -> 香港等等。

            主机:主机名处于域名空间结构中的最底层,主机名和域名结合构成FQDN,主机名是FQDN最左端的部分。

        (3)DNS获取流程
                    DNS是应用层协议,事实上他是为其他应用层协议工作的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为IP地址。
                    具体过程如下:
                    ①用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了。
                    ②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,比如http://www.baidu.com/,并将这个主机名传送给DNS应用的客户端。
                    ③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工作)。
                    ④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址。
                    ⑤一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接。


    30.路由选择协议

        路由选择协议的任务就是要确定数据报在源与目的地之间采用的路径。路由选择协议分为:静态的和动态的。Internet中使用的是动态路由选择协议,在Internet的概念中,将整个互联网划分为许多个小的自治系统(AS)。AS的最主要的特征:一个AS对其他AS表现出的是一个单一 和一致的路由选择策略。

        由于AS的存在,路由选择协议又分为两种:

  • 内部网关协议(IGP):即在一个AS内部使用的路由选择协议,而这与互联网中其他AS选用什么路由协议无关。比如:RIP,OSPF
  • 外部网关协议(EGP):若源主机和目的主机不再同一个AS中,就需要使用一种协议将路由选择信息传递到另一个AS中,这就是EGP。比如:BGP。

    31.重传机制

            网络万一阻塞了呢?发出去的请求包在规定时间内没有收到ACK,不管是请求包丢失,还是ACK包丢失,还是网络延迟,总之,这里都是需要有个重传机制的。TCP的重传机制有两种:超时重传快速重传

       (1) 超时重传

          说白了就是在请求包发出去的时候,开启一个计时器,当计时器达到时间之后,没有收到ACK,则就进行重发请求的操作,一直重发直到达到重发上限次数或者收到ACK。

        (2)快速重传

            还有一种机制就是快速重传,当接收方收到的数据包是不正常的序列号,那么接收方会重复把应该收到的那一条ACK重复发送,这个时候,如果发送方收到连续3条的同一个序列号的ACK,那么就会启动快速重传机制,把这个ACK对应的发送包重新发送一次。

    32.URL、URI、URN

        (1)URI:统一资源标志符(Universal Resource Identifier, URI),表示是一个网络资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行定位的。

                            组成部分:访问资源的命名机制,存放资源的主机名,资源自身的名称

        (2)URL:是Uniform Resource Locator,表示是一个地址,URL是URI的子集,所有的URL都是URI,但不是每个URI都是URL,还有可能是URN

        (3)URN:统一资源名称 (Uniform Resource Name, URN),是URI两种形式之一。唯一标识一个实体的标识符,但是不能给出实体的位置

            三者之间的关系:
        


    33.IP地址,域名、DNS、URL之间的联系

        IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的。写法:十进制的形式,用“.”分开,叫做“点分十进制表示法”,如:127.0.0.1。IP地址采用二进制的形式表示的话很长,比较麻烦,为了便于使用,IP地址经常被写成十进制的形式。

        域名:ip是数字标识,使用时不好记忆和书写,因此在将IP地址符号化,每一个符号化的地址都与特定的IP地址对应。用字符型地址代替数字型的IP地址,这个字符型地址就被称为域名。

以百度为例:
            
            

            域名:www.baidu.com。只有1个。

            ip:119.75.218.70或119.75.217.109或......,即ip可以有多个,共同指向百度的域名。
        关系:

        (1)1台计算机只有1ip(一对一),即1ip就是1台计算机

        (2)1个域名对1个或多个ip(计算机):百度域名www.baidu.comip有119.75.218.70或119.75.217.109或......假如百度域名总共有10ip,则就对应10台计算机,即多个计算机(ip)可以共同指向1个域名,也即119.75.218.70指向www.baidu.com,而119.75.217.109也指向www.baidu.com......

                但是,域名就相当于人名,ip就相当于这个人。一个人可以有多个名字,但1个名字只能代表1个人(排除同名同姓),否则就乱套了。所以,1个域名,在实际应用中,只对1ip。如:百度部署了100台服务器,即百度域名对应100个ip。如果使用ip来访问百度,难道就可以让某人用100个不同的ip都能访问百度主页吗? 这不乱了吗。因此,需要用到反向代理。比如淘宝就用的Tengine,百度用的BWS,还有的用的nginx等等

               
                这样可以让所有的ip映射到一个www.baidu.com。这样我们访问www.baidu.com的时候,就会由百度的负载均衡服务器来分配一台服务器给用户访问,也就是说,虽然百度域名对应多个ip,这些ip都可以访问百度,但百度只允许用户通过1个ip访问,即只能通过一台服务器访问百度,至于我们访问的是哪一台就不重要了

        (3)1台计算机上面可以有好多个服务,也就是一个ip地址对应了好多个域名。即一台计算机(ip)可以访问百度域名,还可以是360域名等,但这台ip访问不同域名的时候,只能通过百度给定的1个ip访问百度,360给定的1个ip访问360

        (4)通过ip访问百度的流程:输入ip→访问IP地址→完成访问的内容→返回信息(输入的ip就是dns给你返回一个ip地址)

        (5)通过域名访问百度的流程:输入域名→域名解析服务器(dns)解析成ip地址→访问IP地址→完成访问的内容---返回信息。即比(4)多了先将域名转为ip这一步

        DNS域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。域名的最终指向是IP

        URL统一资源定位符(英语UniformResourceLocator的缩写)俗称为网址(链接)。网址格式为:协议://域名或IP[:端口]/路径/文件名[参数=值]。结构中,协议://域名或IP是必需的,[]部分是可选的。如果端口与协议默认值不同,则需包含端口,省略则默认80端口。路径有时可省略。

        
以此博客为例:https://i.cnblogs.com/EditPosts.aspx?postid=11395178

        1、协议:该URL的协议部分为“https”,表示网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符。常用协议:

                        http——超文本传输协议资源
                        https——用安全套接字层传送的超文本传输协议
                        ftp——文件传输协议
                        file——本地计算机上的文件
        2、域名:该URL的域名部分为 “ i.cnblogs.com ” 。一个URL中,也可以使用IP地址作为域名使用。如百度域名www.baidu.com也可用ip地址119.75.218.70
                        域名的最右边就是顶级域名,常见的比如:

                        ①.com 表示商业机构:百度  www.daidu.com

                        ②.org 表示非盈利性组织:中国青年志愿者网  www.zgzyz.org.cn

                        ③.gov 表示政府机构:国务院  www.gov.cn

                        ④.edu 表示教育及科研机构:北理工  www.bit.edu.cn

                    用来表示国家顶级域名的比如:.cn 表示中国。.us 表示美国。.jp 表示日本,像 topbook.cc 就表示科科斯群岛的国家顶级域名。

                    另:在地址栏输入一个网址的时候,协议部分是不用输入的,浏览器会自动补上默认的 HTTP 协议。比如 直接输入域名www.baidu.com,这是一个网站独一无二的网络名字。其中的www指万维网。

                    互联网、因特网、万维网三者的关系是:互联网包含因特网,因特网包含万维网,凡是能彼此通信的设备组成的网络就叫互联网。所以,即使仅有两台机器,不论用何种技术使其彼此通信,也叫互联网。

        3、端口:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。该URL省略了端口,即 i.cnblogs.com:80
        4、虚拟目录:第一个“/”为根目录,从域名后的第一个“/”开始到最后一个“/”之间。虚拟目录也不是一个URL必须的部分。该URL没有虚拟目录。但https://www.python123.io/student/courses/934/groups的虚拟目录为student/courses/934
        5、文件名:从域最后一个“/”开始到“?”(没?就到#。两者都有就到?)之间。如果没有“?”和“#”,则一直到最后,都是文件名部分。该URL的文件名为EditPosts.aspx。文件名也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名index.htm
        6、参数:从“?”开始到“#”之间,又称搜索部分、查询部分。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。该URL没有参数。但http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name的参数部分为“boardID=5&ID=24618&page=1”。其中boardID=5、ID=24618、page=1都是参数
        7、锚:从“#”开始到最后,都是锚部分。锚部分也不是一个URL必须的部分。该URL没有锚。而http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name的锚部分是“name”。,其右面的字符就是该位置的标识符(一般情况下,锚链接会用到)

         拓展:

            查询域名对应的IP:以百度为例

            在cmd中,输入:ping www.baidu.com,回车即可

            不能输入:ping https://www.baidu.com/,即输入的是域名,不是URL



    34.Session、Cookie 与 Application

                Cookie和Session都是客户端与服务器之间保持状态的解决方案,具体来说,cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
         (1) Cookie

                Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie,而客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器,服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

        (2)Session

                同样地,会话状态也可以保存在服务器端。客户端请求服务器,如果服务器记录该用户状态,就获取Session来保存状态,这时,如果服务器已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用;如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,并将这个sessionid在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用 cookie机制 ,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器;若浏览器禁用Cookie的话,可以通过 URL重写机制 将sessionid传回服务器。

        (3)Session 与 Cookie 的对比
  1. 实现机制:Session的实现常常依赖于Cookie机制,通过Cookie机制回传SessionID;
  2. 大小限制:Cookie有大小限制并且浏览器对每个站点也有cookie的个数限制,Session没有大小限制,理论上只与服务器的内存大小有关;
  3. 安全性:Cookie存在安全隐患,通过拦截或本地文件找得到cookie后可以进行攻击,而Session由于保存在服务器端,相对更加安全;
  4. 服务器资源消耗:Session是保存在服务器端上会存在一段时间才会消失,如果session过多会增加服务器的压力。
        (4)Application

                Application(ServletContext):与一个Web应用程序相对应,为应用程序提供了一个全局的状态,所有客户都可以使用该状态。


    35.SQL注入

        SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
         SQL注入攻击的总体思路
  1. 寻找到SQL注入的位置
  2. 判断服务器类型和后台数据库类型
  3. 针对不通的服务器和数据库特点进行SQL注入攻击
        
SQL注入攻击实例

        比如,在一个登录界面,要求输入用户名和密码,可以这样输入实现免帐号登录:

用户名:&nbs***bsp;1 = 1 --
密 码:

    用户一旦点击登录,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了。这是为什么呢?下面我们分析一下:从理论上说,后台认证程序中会有如下的SQL语句:String sql = “select * from user_table where username=’ “+userName+” ’ and password=’ “+password+” ‘”; 因此,当输入了上面的用户名和密码,上面的SQL语句变成:SELECT * FROM user_table WHERE username=’’or 1 = 1 – and password=’’。分析上述SQL语句我们知道, username=‘ or 1=1 这个语句一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用。这样,上述语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
     
应对方法
  1. 参数绑定:使用预编译手段,绑定参数是最好的防SQL注入的方法。目前许多的ORM框架及JDBC等都实现了SQL预编译和参数绑定功能,攻击者的恶意SQL会被当做SQL的参数而不是SQL命令被执行。在mybatis的mapper文件中,对于传递的参数我们一般是使用#和KaTeX parse error: Expected 'EOF', got '#' at position 11: 来获取参数值。当使用#̲时,变量是占位符,就是一般我们…时,变量就是直接追加在sql中,一般会有sql注入问题。
  2. 使用正则表达式过滤传入的参数

    36.XSS攻击

        XSS是一种经常出现在web应用中的计算机安全漏洞,与SQL注入一起成为web中最主流的攻击方式。XSS是指恶意攻击者利用网站没有对用户提交数据进行转义处理或者过滤不足的缺点,进而添加一些脚本代码嵌入到web页面中去,使别的用户访问都会执行相应的嵌入代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

        XSS攻击的危害
  • 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  • 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  • ***企业重要的具有商业价值的资料
  • 非法转账
  • 强制发送电子邮件
  • 网站挂马
  • 控制受害者机器向其它网站发起攻击
        原因解析
  • 主要原因:过于信任客户端提交的数据!
  • 解决办法:不信任任何客户端提交的数据,只要是客户端提交的数据就应该先进行相应的过滤处理然后方可进行下一步的操作。
  • 进一步分析细节:客户端提交的数据本来就是应用所需要的,但是恶意攻击者利用网站对客户端提交数据的信任,在数据中插入一些符号以及javascript代码,那么这些数据将会成为应用代码中的一部分了,那么攻击者就可以肆无忌惮地展开攻击啦,因此我们绝不可以信任任何客户端提交的数据!!!
    
XSS 攻击分类

        (1). 反射性XSS攻击 (非持久性XSS攻击)

                漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS攻击包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击),例如,正常发送消息:

http://www.test.com/message.php?send=Hello,World!
															
  • 1

                接收者将会接收信息并显示Hello,World;但是,非正常发送消息:

http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script>!
															
  • 1

                接收者接收消息显示的时候将会弹出警告窗口!

        (2). 持久性XSS攻击 (留言板场景)

                XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。也就是说,每当用户使用浏览器打开指定页面时,脚本便执行。与非持久性XSS攻击相比,持久性XSS攻击危害性更大。从名字就可以了解到,持久性XSS攻击就是将攻击代码存入数据库中,然后客户端打开时就执行这些攻击代码。

<input type=“text” name=“content” value=“这里是用户填写的数据”> 
															
  • 1

                正常操作流程是:用户是提交相应留言信息 —— 将数据存储到数据库 —— 其他用户访问留言板,应用去数据并显示;而非正常操作流程是攻击者在value填写:

<script>alert(‘foolish!)</script> <!--或者html其他标签(破坏样式。。。)、一段攻击型代码--> 
															
  • 1

                并将数据提交、存储到数据库中;当其他用户取出数据显示的时候,将会执行这些攻击性代码。

        修复漏洞方针

            漏洞产生的根本原因是 太相信用户提交的数据,对用户所提交的数据过滤不足所导致的,因此解决方案也应该从这个方面入手,具体方案包括:

  • 将重要的cookie标记为http only, 这样的话Javascript 中的document.cookie语句就不能获取到cookie了(如果在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击);
  • 表单数据规定值的类型,例如:年龄应为只能为int、name只能为字母数字组合。。。。
  • 对数据进行Html Encode 处理
  • 过滤或移除特殊的Html标签,例如: <script>, <iframe> , < for <, > for>, &quot for
  • 过滤JavaScript 事件的标签,例如 “οnclick=”, “onfocus” 等等。

            需要注意的是,在有些应用中是允许html标签出现的,甚至是javascript代码出现。因此,我们在过滤数据的时候需要仔细分析哪些数据是有特殊要求(例如输出需要html代码、javascript代码拼接、或者此表单直接允许使用等等),然后区别处理!


    37.TCP的11种状态转移

        

       38. TIME_WAIT状态的作用

              1、可靠地实现TCP的连接终止。
                    在终止TCP连接时有4个报文需要交换,其中最后一个ACK报文是由客户端发往服务器。假设这个ACK报文在网络中被丢弃了,那么服务器端收不到这个确认ACK,服务器端会向客户端再次发送FIN。这就是为什么TIME_WAIT状态持续2倍的最长报文段生存时间:1MSL时间留给最后的ACK确认报文段到达服务器端,1MSL时间留给服务器端再次发送的FIN。
              2、确保老的重复的报文段在网络中过期失效,这样建立新的连接时将不再接受它们。
                    TCP协议采用的是出错重传,也就是会生成重复的报文,并且根据路由器的选择,这些重复的报文可能在连接终止后才到达,如果客户端/服务器端收到这个老的报文会把它误认为一个同一连接的新的报文,然后对这个报文进行处理,这样就会出现错误。从状态转换图我们可以看到从TIME_WAIT到连接终止,中间有2MSL,这个时间足以让老的重复的报文段过期失效。





















        
    







            



全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务