天天看点

《网络基础》

通信

计算机间的通信基础

得知通信机器的IP地址后,需要先进行一次ARP(广播)通信,确定对方的MAC地址(网卡地址)后才能使用ICMP协议来传输数据

  • 广播是在同一个网段内传播的
  • 网卡地址为FFFF,FFFF,FFFF(主机ID全1)即为广播状态
  • 在与其他计算机进行通信前,会先判断目标主机与自己是否处于同一网段,如果不处于同一网段,则将由路由器进行转发

数据通信模拟

1)局域网:pc1——————集线器/交换机——————pc2

  • 可用网线(数字信号)进行通信
  • 网线不可超过100米

2)广域网:pc1——————调制解调器——————调制解调器——————pc2

  • 网线(数字信号)传输范围短,可以使用电话线或光纤(模拟信号)进行传输数据,利用调制解调器转换为对应的数字信号

连接方式

1)处于同一网段(连接的设备处于同一广播域):

  1. 网线直连
    • 所用为交叉线(同种机器互联方式)
    • 两台机器互联
  2. 同轴电缆
    • 半双工通信(同网线间不能同时发送数据)
    • 易冲突,不安全,容易瘫痪
  3. 集成器
    • 半双工通信
    • 易冲突,不安全
  4. 网桥
    • MAC地址表,可记录机器的MAC地址(两台机器互通时)
  5. 交换机
    • MAC地址表

      当交换机的MAC地址表达到存储上限时,若再收到数据包,会向除源端口外的所有端口发送数据包(泛洪)

    • 全双工通信

2)路由器:可以让不同网段的主机进行传输数据,会隔绝广播域

  • 若两台不同网段的主机要想进行数据传输,需要利用

    网关

  • 发送数据的主机发现与接收数据的主机网段不相同时,发送端会根据配置的网关,进行广播,获取路由器网关的MAC地址,再将数据传输给路由器
  • 路由器没有直连到目标主机上,会

    下一跳

    到另一台路由器上(由配置的网关地址决定)

网络分层

Ⅰ、物理层

数据格式:比特流

Ⅱ、数据链路层

简介

​ ①数据格式:帧

​ ②传输协议:CSMA/CD、PPP

1)链路:从一个节点到另一节点的一段线路上,中间

无其他交换节点

。传输数据时,需要用对应的通信协议控制数据的传输

  • 广播信道(主机间通信穿过集线器等):

    CSMA/CD协议

    CSMA/CD协议:载波侦听多路访问/冲突检测(检测是否有线路在发送数据,防止数据冲突)
    • 使用CSMA/CD协议的网络称为

      以太网

      ,传输

      以太网帧

      以太网帧格式:

      Ethernet V2标准

      、IEEE802.3标准
    • 为确保能检测到正在发送的帧是否产生了冲突,要求以太网帧至少为

      64字节

      (足够长的话信号冲突后返回才能确保是发送的帧)
    • 目前的交换机已使用全双工通信,不再使用CSMA/CD协议,但仍使用

      以太网帧传输数据

      。因此,使用交换机组建的网络,依然称为

      以太网

  • 点对点信道(2个路由器间组成的信道):

    PPP协议

数据链路层的3个基本:封装成帧、透明传输、差错检验

​ ①封装成帧:

帧首部 + 帧的数据部分 + 帧尾部

== 帧长

  • 帧首部:首部+帧开始符
  • 帧的数据部分:IP数据包(上一层)、规定MTU(每种协议规定的所能传输的帧的最大数据长度,以太网为1500字节)
  • 帧尾部:FCS+帧结束符

​ ②透明传输:当数据内出现了SOH(帧开始符)、EOT(帧结束符)、ESC,需要进行转义(填充ESC字节)

​ ③差错检验:根据数据部分和首部计算出一个FCS值,每次接收数据前检验其值是否与发送前的一样,若不一样则丢弃

1)Ethernet V2帧:

以太网帧:

首部 + 数据 + FCS(4字节)

  • 首部由

    目标MAC地址

    (6字节)、

    源MAC地址

    (6字节)、

    传输协议类型

    (2字节)构成
  • 以太网帧至少64字节,所以数据长度至少为:64-6-6-2-4字节(

    46

  • 当数据部分(

    网络层首部+数据部分

    (== 42字节))的长度小于46字节时,会在数据后加一些字节进行填充,在接收时会将添加的字节丢弃
  • 链路层

    中以太网帧前会插入8字节(为前同步码(7字节)+帧开始定界符(1字节)),无帧结束定界符
  • 无帧开始符和结束符

    ,以太网以曼彻斯特编码,接收端接收帧过程发现没有信号跳变,即帧结束

2)PPP协议:

首部 + 数据 + 尾部

  • 首部包含

    帧开始符

    (0x7E)、

    Address字段

    (0xFF,形同虚设,因为不需要源MAC地址、目标MAC地址)、

    Control字段

    (0x03,无用)、

    PPP内部协议

  • 尾部包含

    FCS

    帧结束符

    (0x7E)
  • 当数据内出现7E(帧开始与结束符)、7D时,需要进行转义(将7E替换为7D5E,将7D替换为7D5D)

网卡

  • 属于物理层和数据链路层
  • 每接收一个帧时,会先进行差错校验,若差错校验失败,则丢弃数据包
  • 抓包抓到的帧无FCS部分,因为抓到的为通过了校验的帧
  • MAC地址即为网卡的物理地址

Ⅲ、网络层

简介

​ ①数据格式:包

​ ②传输协议:IP、ARP、ICMP

  • 网络层数据包(IP数据包、Packet)由

    首部

    +

    数据部分

    组成

数据:多数时候是由传输层传递下来的数据段

首部:固定部分(

20字节

)+ 可变部分,最多

60字节

​ ①固定部分:

  • 版本

    (4位):IPv4(0b0100)、IPv6(0b0110)
  • 首部长度

    (4位):二进制转十进制后

    ×4

    才是首部的长度

    0b0101:20(最小长度)、0b1111:60(最大长度)

  • 区分服务

    (8位):用于提高网络的服务质量(如优先服务)
  • 总长度

    (16位):

    首部

    +

    数据长度

    才是总长度,最大值为65535字节
    • 由于下一层的帧的数据部分长度不能超过1500字节,因此(总长度)过大的IP数据包,需要分为

      才能传输给数据链路层
    • 每一片都独立拥有自己的网络层首部
  • 标识

    (16位):数据包的ID,有一个计数器专门记录数据包的ID,每当发出一个数据包,ID数就+1
    • 当数据包过大而进行分片时,同一个数据包下的所有片的标识都是一样的
  • 标志

    (3位):片的状态
    • 第1位:保留
    • 第2位:

      1

      代表不允许分片, 代表允许分片
    • 第3位:

      1

      代表不是最后一片, 代表是最后一片
  • 片偏移

    (13位):当前字节距离字节0的长度,即为字节的偏移量
    • 片偏移

      ×8

      才是真正的偏移量(为防止偏移量过大,存储时会将原本的偏移量先进行压缩(

      /8

      ))
    • 每一片的长度一定为8的整数倍
  • 生存时间

    (8位):每个路由器在转发前会先将

    TTL-1

    ,一旦发现TTL变为0,则路由器会返回错误报告
    • 利用ping命令可推测出传递数据间经历的路由器个数
  • 协议

    (8位):表明封装的数据使用的协议
    • ICMP(1(十进制))、IGMP(2)、IP(4)、TCP(6)、EGP(8)、IGP(9)、UDP(17)、IPv6(41)、ESP(50)、OSPF(89)
  • 首部检验和

    (16位):用于校验首部是否有误
  • 源IP地址

    (32位)
  • 目标IP地址

    (32位)

​ ②可选部分:

  • 可选字段

    (长度可变)
  • 填充

IP

  • 网络间的通信协议
  • IP地址组成部分:

    网络号(网络ID)

    +

    主机号

    (主机ID)
子网掩码

常与IP地址一同使用,由若干个0和1组成,子网掩码的唯一作用就是为了区分IP地址的网络号和主机号,1的个数为

子网掩码的长度

,也是

IP地址的网络号位数

,0则代表为

IP地址的主机号位数

网段
  1. 子网掩码与IP地址按位与

    &

    即是IP地址的网络地址,也称为网段,同一网段间的主机能够

    相互通信

    ,不同网段间的主机需要通过路由器的

    网关

  2. 同一网段的计算机网络ID相同
  3. 同一网段的连接个数为:

    主机ID数-2

    (主机ID全0:网段占用,全1:广播地址)
网关与路由器
  1. 连接不同网络地址的设备,路由器为代表之一,当两台处于不同网段间的设备要进行通信时,发送端会将数据发送给与其网关配置相同的设备(路由器),再由该设备将数据转发出去
  2. 若有多个网段的设备需要跳转,可使用

    默认网关

    0.0.0.0

IP地址分类
  • 根据子网掩码可划分为ABCDE类
  • 根据使用区域划分为公网IP和私网IP
  • 根据其状态可分为静态IP和动态IP
0000 0000(一)0000 0000(二)0000 0000(三)0000 0000(四)

(一)划分

1)A类:默认子网掩码是:

255.0.0.0

/8

  • 网络ID必须以

    0开头

    (二进制),占8bit,主机ID占24bit

​ ①网络ID:0不能用,127作为保留网段(127.0.0.1为本地环回地址,即本机地址),所以可用于分配主机的范围:1~126

​ ②主机ID:(个数)256* 256 * 256 -2

2)B类:默认子网掩码为:

255.255.0.0

/16

  • 网络ID必须以

    10开头

    ,占16bit,主机ID占16bit

①网络ID:可用于分配主机的范围(一):128~191 (二):0~255

②主机ID:(个数)256 * 256 -2

3)C类:默认子网掩码:

255.255.255.0

/24

  • 网络ID必须以

    110开头

    (二进制),占24bit,主机ID占8bit

​ ①网络ID:可用于分配主机的范围(一):192~223 (二、三):0~255

​ ②主机ID:(个数)256 -2

4)D类:以1110开头,多播地址,无子网掩码,(一)取值范围为:224~239

5)E类:以1111开头,保留今后使用,(一)取值范围为:240~255

  • 只有A、B、C类地址才能分配给主机
  • 主机ID全为0,代表为主机所在的网段
  • 主机ID全为1,表示主机所在网段的全部主机(广播),会为所有处于同一网段的主机发送数据
  • IP处于哪类地址,与子网掩码(

    /xx

    )无关,与网络ID有关,网络ID确定,其子网掩码为:

    网络ID所属的类的子网掩码+对主机ID的子网划分

(二)子网掩码划分

  • 为节约IP地址的浪费,可将主机ID划分为子网掩码(用二进制形式理解)

1)等长子网划分:子网掩码相同

将192.168.1.0 /24划分出两个子网段:192.168.1.0 /25和192.168.1.128 /25

此为C类网段(192.168.1.0),在此网段的基础上将最后8bit的第一位划分为子网掩码部分,此刻的子网掩码就有25bit(全0为网段,全1为广播),为255.255.255.128

(二进制位)0为一类网段,可分配的IP地址为1~126(126台),

(二进制位)1为另一类网段,可分配的IP地址为129~254(126台)

2)变长子网划分:划分为不等长的子网,子网掩码不相同

3)超网:将连续的网段合并成一个更大的网段

  • 必须是连续的网段
  • 子网掩码往左移后(合并后),最终合成的网段必须处于同一网段

ARP

  • 地址解析协议,将IP地址解析为MAC地址(通过IP地址获取MAC地址)
  • 每台主机都会有自己的ARP缓存列表,记录IP地址和MAC地址之间的对应关系
  • 两台主机间要进行通信,必须知道对方的MAC地址
  • 全球唯一性
  • 相同MAC地址存在时,不会传输数据
  • 由48位二进制(12位十六进制,二进制的

    1111

    为十六进制的

    F

    )构成
  • RARP:逆地址解析协议
    • 使用与ARP相同的报头结构
    • 作用与ARP相反,是将MAC地址转换为IP地址
    • 已被BOOTP(DHCP前身)、DHCP取代

ICMP

  • 互联网控制消息协议
  • 通常用于返回错误信息(如TTL值过期、目的不可达等)
  • ICMP的错误信息总是包含了源数据的信息并返回给发送者

Ⅳ、传输层

简介

​ ①数据格式:段

​ ②传输协议:TCP、UDP

​ ③处于传输层的数据段一般在传输层就划分好,不会再传输给网络层进行划分

  • 原因:若在网络层划分数据,若在传输过程中丢包,则接收方将数据段合并起来时,并不能合并为一个完整的数据段,此时便不会发送ACK(确认号),发送方在超过一段时间后还未收到响应,则会重新将整个传输层数据(可靠传输仅在传输层存在)重新发送给网络层,让网络层进行划分,极大影响了重发的性能

UDP

无连接,不可靠传输,首部占用空间小,传输速率快,资源消耗小,应用层协议

DNS

  • 组成部分:

    伪首部

    (12字节) +

    首部

    (8字节) +

    数据部分

    • 首部包含

      源端口

      (2字节)、

      目的端口

      (2字节)、

      长度

      (2字节)、

      检验和

      (2字节)
      • 长度:

        首部长度

        +

        数据长度

        ,但其存在可有可无,仅为保证首部是32位对齐(

        传输层数据长度=网络层总长度-网络层首部长度-传输层首部长度

    • 伪首部仅在进行校验和时起作用,

      不会传输给网络层

    • 伪首部包含

      源IP地址

      (4字节)、

      目的IP地址

      (4字节)、 (1字节)、

      17

      (1字节,代表所用协议)、

      UDP长度

      (2字节)
  • 端口:端口占2字节,因此端口号取值范围为

    0~65535

    ,客户端的源端口是临时开启的随机端口,一旦数据传输完毕,就会关闭,下次开启时是随机的端口号,利用防火墙可关闭某些端口来提高安全性

TCP

结构

面向连接,可靠传输,首部占用空间大,传输速率慢,资源消耗大,应用层协议

HTTP

HTTPS

FTP

SMTP

DNS

  • 组成部分:

    伪首部

    (12字节)+

    首部

    (20~60字节)+

    数据部分

1)首部

  • 源端口

    目的端口

  • 序号

    seq

    ,4字节):在传输过程中每个字节都会有一个编号,在

    建立连接后

    ,序号表示:这次

    传给对方

    的TCP数据部分的

    第一个字节

    的编号
  • 确认号

    ack

    ,4字节):

    建立连接后

    ,确认号表示:期望对方下一次

    传过来

    的TCP数据部分的

    第一个字节

    的编号
  • 数据偏移

    (4位):取值范围为0x01010x1111,二进制转十进制后`×4`即为`首部长度`(因此首部长度为2060字节)
  • 保留

    (6位):目前全为0,保留使用(有些会只有3位大小,其余3位划分为标志字段,但值依然为0)
  • URG

    (标志字段,1位):当URG=1时,紧急指针字段才会生效
  • ACK

    (标志字段,1位):当ACK=1时,确认号字段才会有效
  • PSH

    (标志字段,1位)
  • RST

    (标志字段,1位):当RST=1时,表明连接出现差错,需要释放连接,然后重新建立连接
  • SYN

    (标志字段,1位):当SYN=1时,表明这是一个建立连接的请求,当对方同意建立连接,会回复SYN=1,ACK=1
  • FIN

    (标志字段,1位):当FIN=1时,表明数据发送完毕,请求释放连接
  • 窗口

    (2字节):含有流量控制功能,告知对方下一次允许发送的数据大小(字节)
  • 检验和

    :与UDP检验和效果相同,计算:

    伪首部

    +

    首部长度

    +

    数据部分

    ,伪首部仅在计算检验和时其作用,

    不会传输给网络层

  • 紧急指针

    (2字节):表明段中含有紧急数据,应优先尽快传递
  • 选项

    (长度可变,可选):可包含SACK等
  • 填充

    (可选)
四大特性

可靠传输

  • 停止等待ARQ协议:发送后一个数据后,等待响应,超时后会自动重传
    • 在超过一段时间或发送一定次数后还未成功获取响应ack(确认号),则会发送RST(reset报文)断开连接
  • 连续ARQ协议+滑动窗口协议:同时向客户端发送多个数据(根据客户端的接收窗口决定),等待响应,根据

    确认号

    字段来判断数据是否接收成功,若数据包丢失,会使用

    SACK

    (选择性确认)来重发数据
    • TCP数据包用

      发送窗口

      发送数据时,若中间的数据包丢失,会返回丢失数据包的

      确认号

      的响应,ARQ协议默认会在收到确认号后重传 该丢失数据包

      确认号

      往后

      接收窗口

      大小的数据包,这样会导致重复发送已有的数据包
      • SACK(位于首部可选字段中)会在响应时,告诉对方哪些数据包丢失,哪些数据包已收到(SACK信息)

        King=5

        :占1字节,值为5表明这是SACK

        Length

        :占1字节,表明SACK共占多少字节

        Left Edge

        :占4字节,左边界

        Right Edge

        :占4字节,右边界
      • 左边界和右边界合起来(左闭右开)就是已成功接收到的数据包
      • 一对边界占用

        8

        字节,TCP可选字段最多40字节,因此SACK最多携带

        4组

        边界信息(4×8+2=34字节)
    • 滑动窗口:即发送数据和接收数据后,窗口向后移动,继续以原窗口大小发送数据

流量控制

  • 如果接收方的缓冲区满了,发送方还在发送数据,则接收方会将收到的数据包丢弃,造成网络资源的浪费,因此使用流量控制(让发送方发送数据速率不要太快,使接收方来得及接收处理)
    • 通过 发送的数据包的首部所给的窗口字段信息 来控制发送方的发送速率(即发送窗口大小不能超过接收窗口大小)
    • 当发送方接收到的窗口大小信息为0时,发送方会停止发送数据(可能是接收方的缓存区大小已满)
    • 为防止 接收方已从窗口大小信息为0 转为 能接收信息的状态,但做出响应时接收方未能收到响应,因此,发送方在接收到接收方窗口大小信息为0后,会开启一个计时器,在一定时间后,自动询问接收方的窗口大小信息,若依旧为0时重置计时器

拥塞控制

  • 当过多的数据注入到网络中,链路吞吐量(链路允许数据通过的最大量)不足数据通过时,链路就会发生拥塞,并自动丢弃过载的数据包
  • 拥塞控制是一个

    全局性过程

    ,即由所有的机器共同降低 影响网络传输性能的因素
  • MSS

    :每个段的

    数据部分

    的大小(建立连接时确定大小,最大为

    1460字节

    cwnd

    :拥塞窗口

    rwnd

    :接收窗口

    swnd

    :发送窗口
    • 发送窗口的大小由 拥塞窗口及接收窗口间的

      最小的

      那个决定
  • 拥塞控制方法:
    • 慢开始

      (慢启动):cwnd(拥塞窗口)初始值较小,随着数据包被接收方接收响应(收到ack)后,cwnd的大小以指数级成倍增长
    • 拥塞避免

      :规定一个

      ssthresh

      阈值(慢开始的阈值),当cwnd达到阈值后,将以

      加法增大

      (窗口以线性方式缓慢增大,防止网络过早出现拥塞)。当网络出现拥塞(数据丢包)后,ssthresh阈值将减小,同时进行

      乘法减小

      (cwnd恢复为初始值),再重新进行

      慢开始

      (当网络频繁出现网络拥堵时,ssthresh阈值会下降加快)(TCP Tahoe版本,已淘汰)
    • 快速重传

      (快重传):在连续

      3次

      收到接收方发的

      确认号

      信息(总共收到

      4次

      确认信息),即发送端会立即重传该确认号所对应的数据包(而不会等发送端发完数据、接收方开始发送确认号,或重传计时器到期后,才进行数据重传)
    • 快速恢复

      (快恢复):在拥塞避免中体现,当网络出现拥塞(收到3个重复的确认,执行

      快重传

      )后,ssthresh阈值将减小,同时进行乘法减小(cwnd缩小到

      新的ssthresh阈值处

      ),再重新以

      加法增大

      的形式缓慢增加swnd的大小,此过程称为

      快恢复

      (TCP Reno版本)

建立连接

序号与确认号
  • 序号、确认号:

    相对值

    ,在

    第一次握手

    第二次握手

    时会分别告诉对方自身真实的序号

①客户端:

第一次握手

--> TCP数据部分占

0字节

(建立连接,不发送数据)

  • SYN=

    1

    (发起建立连接请求),ACK= (确认号字段不生效)
  • seq为0(客户端表面未发送任何数据,但会告诉服务器自身真实的序号)

    ack为0(确认号字段未生效)

②服务器:

第二次握手

--> TCP数据部分占

0字节

(响应连接,不发送数据)

  • SYN=

    1

    (响应建立连接请求),ACK=

    1

    (确认号字段生效)
  • seq为0(服务器表面未发送任何数据,但会告诉客户端自身真实的序号)

    ack为1(服务器希望下一次能收到来自客户端的1数据)

③客户端:

第三次握手

--> TCP数据部分占

0字节

(响应连接,不发送数据)

  • SYN= (连接正式建立),ACK=

    1

    (确认字段生效)
  • seq为1(客户端发送给服务器它希望收到的1数据)

    ack为1(服务器暂未做出响应,依然希望收到1数据)

④客户端:

发送HTTP协议

--> TCP数据部分占

k字节

(客户端发送请求数据)

  • SYN=0,ACK=1
  • seq为1(服务器暂未做出响应,客户端发送给服务器它希望收到1数据)

    ack为1(服务器暂未做出响应,依然希望收到1数据)

⑤服务器:

响应数据

--> TCP数据部分占

b1字节

(服务器响应,连续发包)

  • SYN=0,ACK=1
  • seq为1(服务器第1次响应,发送给客户端b1个字节中的第一个)

    ack为k+1(服务器已收到客户端请求数据所发送的k个字节,希望收到第k+1个字节)

⑥服务器:

响应数据

--> TCP数据部分占

b2字节

(服务器响应,连续发包)

  • SYN=0,ACK=1
  • seq为b1+1(服务器第2次响应,发送给客户端b2个字节中的第一个)

    ack为k+1(客户端暂未做出响应,服务器已收到客户端请求数据所发送的k个字节,希望收到第k+1个字节)

⑦服务器:

响应数据

--> TCP数据部分占

b3字节

(服务器响应,连续发包)

  • SYN=0,ACK=1
  • seq为b1+b2+1(服务器第3次响应,发送给客户端b3个字节中的第一个)

    ack为k+1(客户端暂未做出响应,服务器已收到客户端请求数据所发送的k个字节,希望收到第k+1个字节)

⑧服务器:

响应数据

--> TCP数据部分占

b4字节

(服务器响应,连续发包)

  • SYN=0,ACK=1
  • seq为b1+b2+b3+1(服务器第4次响应,发送给客户端b4个字节中的第一个)

    ack为k+1(客户端暂未做出响应,服务器已收到客户端请求数据所发送的k个字节,希望收到第k+1个字节)

⑨客户端:

收到数据,做出响应

--> TCP数据部分为

0字节

(客户端接收数据,响应服务器,并申请下一个数据)

  • SYN=0,ACK=1
  • seq为k+1(客户端发送给服务器它希望收到的k+1数据(其实只是响应,并没有真正发送数据))

    ack为b1+b2+b3+b4+1(客户端共收到服务器4次响应所发送的所有数据,希望收到下一个数据)

⑩服务器:

响应数据

--> TCP数据部分占

xx字节

(服务器响应,连续发包)

  • SYN=0,ACK=1
  • seq为b1+b2+b3+b4+1(服务器发送给客户端它希望收到的下一个数据)

    ack为k+1(服务器并没有真正收到客户端发送的k+1的数据,希望客户端发送k+1的数据)

三次握手连接状态
  • CLOSED

    :客户端处于关闭状态,发送SYN报文后转入SYN-SENT状态(与服务器进行第一次握手,发送连接请求)
  • LISTEN

    :服务器处于监听状态,等待客户端的SYN报文,收到客户端的SYN报文并向客户端发送服务器的SYN报文后转入SYN-RCVD状态(与客户端进行第二次握手,确认连接请求)
  • SYN-SENT

    :客户端已发送SYN报文并等待接收服务器发送SYN报文,在接收到服务器的SYN报文并向服务器发送ACK确认报后(与服务器第三次握手,确认连接),进入ESTABLISHED状态
  • SYN-RCVD

    :服务器已收到SYN报文,请求客户端发送确认连接的ACK报文,当收到客户端发送的ACK报文后,进入ESTABLISHED状态
  • ESTABLISHED

    :表示连接已建立
四次挥手连接状态
  • ESTABLISHED

    :客户端与服务器处于连接状态,客户端发送FIN报文后进入FIN-WAIT-1状态(第一次挥手,客户端发送连接释放请求),服务器接收到FIN报文,并发送ACK确认报后进入CLOSE-WAIT状态(第二次挥手,服务器确认连接释放请求)
  • FIN-WAIT-1

    :客户端发送FIN报文后并等待服务器的ACK确认报,当收到服务器的ACK确认报后,进入FIN-WAIT-2状态
  • CLOSE-WAIT

    :服务器向客户端发送ACK确认报,客户端接收后,即关闭了客户端向服务器发送数据的连接通道,但此刻服务器向客户端发送数据的连接通道尚未关闭,当服务器想关闭通道时,向客户端发送FIN报文后,进入LAST-ACK状态(第三次挥手,服务器发送连接释放请求)
  • FIN-WAIT-2

    :客户端释放了与服务器的传输通道后,等待服务器发送FIN报文申请释放连接请求,在收到服务器发送的FIN报文后,发送ACK确认报,转入TIME-WAIT状态(第四次挥手,客户端确认连接释放请求)
  • LAST-ACK

    :服务器在发送请求关闭连接的FIN报文后,等待客户端发送ACK确认报,接收到客户端发送的ACK确认报后,转入CLOSED状态
  • TIME-WAIT

    :在收到服务器发送的请求关闭连接的FIN报文后,发送ACK确认报,随后进入一段时间的等待状态,在2MSL时间内若无再收到服务器的FIN报文后,即进入CLOSED状态,若收到FIN报文,则重置时间并重新发送ACK确认报
    • 2MSL:MSL指的是数据包发送到另一方所用的时间,超出此时间后,数据包会失效。2MSL是因为数据包发送后响应,2MSL内必定会接收到数据包或数据包已丢失
  • CLOSING

    :特殊情况,当客户端向服务器发送FIN报文的同时,服务器刚好也向客户端发送FIN报文,表示双方同时想关闭连接

总结

细节分析

①前两次握手:

  • SYN都为1(建立连接,发送请求)
  • 数据部分长度为0(只发送建立连接请求,无发送数据)
  • TCP头部一般为

    32字节

    (固定20字节+可选12字节)
    • 可选部分:MSS(数据部分的大小)、是否支持SACK(重传记录)、Window Scale(窗口缩放系数)等信息

②三次握手原因:

  • 防止server服务器端一直等待发送资源,造成浪费

由于客户端发送请求时,可能有网络延迟,在发送后的某个时间点到达,客户端会因为没收到响应,再发一个请求,此请求先到达,在数据传输完毕后断开连接,此刻服务器端收到了晚到达的请求,会与客户端建立连接(只有两次握手就建立了连接),但客户端无发送数据,服务器端一直等待客户端发送数据,因此造成资源的浪费。

③多次握手失败处理:

  • 若此刻服务器端的状态为SYN-RCVD(等待第三次握手状态),若短时间内无收到客户端发送的ACK确认报,会重新第二次握手
  • 若多次第二次握手后仍没有收到客户端发送的ACK确认报,则服务器端会发送RST包,强制断开连接

④四次挥手原因:

由于TCP是全双工模式,因此前2挥手只是表明客户端已经没有数据要发送给服务器,关闭了将数据传输给服务器的通道,但服务器向客户端传输数据的通道并未关闭,因此又需要2次挥手,关闭服务器向客户端发送数据的通道

⑤客户端发送ACK确认报后需要等待一段时间后再关闭连接的原因:

  • 若客户端发送的ACK确认报丢失,服务器会一直等待,甚至多次发送FIN报文,浪费资源
  • 若客户端发送ACK确认报后立即关闭连接,有可能因为ACK确认报丢失,客户端等待一段时间后重发FIN确认报,此刻刚好有新的客户端程序被分到了一样的端口号,该程序接收到服务器发送的FIN报文后,就会执行断开连接的操作

⑥出现3次挥手的原因:

  • 客户端向服务器发送释放连接请求,服务器在收到FIN报文后,也想关闭连接,于是原本应发送的ACK确认报被该为发送FIN报文,从FIN-WAIT-1直接进入TIME-WAIT状态(少了第2次挥手)

⑦短连接与长连接:

  • 短连接:发送一次数据后即关闭连接
  • 长连接:一直发送数据,保持连接不断开

Ⅴ、应用层

简介

​ ①数据格式:报文、用户数据

​ ②传输协议:FTP、HTTP、SMTP、DNS、DHCP等

1)域名:域名要进过DNS服务器解析为对应的IP地址才能由路由器转发接收

  • 路由器使用IP地址而不使用域名的原因:IP地址固定只占

    4字节

    ,节省了资源的消耗
  • 域名

    从右往左

    依次是:顶级域名(TDL)、二级域名、三级域名 . . .

    ①顶级域名:

    • 通用顶级域名(gTLD):

      com(公司)、net(网络机构)、org(组织机构)、edu(教育机构)、gov(政府部门)、int(国际组织)等

    • 国家及地区顶级域名(ccTLD):

      cn(中国)、jp(日本)、uk(英国)

    • 新通用顶级域名(New gTLD):

      vip、xyz、top、club、shop等

DNS

DNS说明
  • 第一次解析完成之后会有缓存,即再次访问域名时不会进行DNS解析
  • 可基于UDP协议,也可基于TCP协议,服务器占用53端口
  • 所有的DNS服务器记录了

    DNS根域名服务器

    的IP地址以及

    下一级DNS服务器

    的IP地址

客户端会先访问最近的一台DNS服务器(即客户端自己配置的DNS服务器),若本机的DNS服务器无目标域名对应的IP地址的缓存,会请求DNS根域名服务器,根域名服务器会将他的下一级IP地址返回给客户端,客户端通过该IP去请求对应的DNS服务器,直到找到有目标域名的DNS服务器为止

CDN
  • 内容分发网络
  • 利用最靠近客户端的服务器,快速将一些静态资源发送给客户端
  • 若最靠近客户端的CDN服务器(

    CDN边缘节点

    )未含有客户端想要的资源,会访问它的

    父层节点

    ,若到最后还未找到所需资源,会将请求转发到

    源站

    ,源站将资源按请求路径原路返回时,对应的CDN缓存服务器会将该资源

    备份

    后再返回

在使用了CDN后,客户端先将要访问的域名发送给

DNS服务器

,DNS服务器若发现该域名含有CDN站点,会将域名直接发送给

CDN DNS服务器

,通过CDN DNS服务器将IP发送给客户端。客户端收到IP后,会去访问

CDN全局负载均衡系统

,CDN全局负载均衡系统会将IP发送给

CDN区域负载均衡系统

进行分析,最后返回目标IP给CDN全局负载均衡系统,CDN全局负载均衡系统再返还给客户端目标IP,客户端通过目标IP访问

CDN缓存服务器

DHCP

动态主机配置协议,用于动态给主机分配IP地址

  • DHCP协议基于UDP协议,客户端是68端口,服务器是67端口
  • DHCP服务器会从IP地址池中,挑选一个IP地址

    出租

    给客户端一段时间,到期后会回收IP
  • 家用路由器即可充当DHCP服务器
  • 借助DHCP中继代理实现跨网段分配IP地址
  • 在客户端申请的IP地址快过期时,会自动向DHCP服务器发送REQUEST信息申请续约
分配IP地址

DISCOVER

:客户端发送广播包给服务器(源IP

0.0.0.0

,目标IP

255.255.255.255

,目标MAC

FF:FF:FF:FF:FF:FF

OFFER

:服务器(可以多个服务器)返回客户端可以租用的IP地址,包含租用期限、子网掩码、网关、DNS信息等

REQUEST

:客户端选择好IP地址(OFFER)后,发送广播包进行回应

ACKNOWLEDGE

:被选中的服务器发送ACK确认报给客户端

HTTP

  • 超文本传输协议(设计的原目的是为了接收HTML页面),由

    URI

    来标记某个资源的路径(

    URL

    是具体的资源路径)
ABNF(标准)

格式

  • 对HTTP的标准规范

HTTP-message=start-line

*(header-field CRLF)

CRLF

[message-body]

  • (行)start-line:

    request-line

    status-line

    request-line:method SP request-target SP HTTP-version CRLF
    • HTTP-version:HTTP-name / DIGIT.DIGIT
    • HTTP-name:%48.54.54.50(HTTP)
    status-line:HTTP-version SP status-code SP reason-phrase CRLF
    • status-code:3DIGIT
    • reason-phrase:*(HTAB或SP或VCHAR或obs-text)
  • (头)header-field:field-name : OWS field-value OWS

    field-name:token(键)

    field-value:*(field-content或obs-fold)

    OWS:*(SP/HTAB)

  • (体)message-body:*OCTET
  • *

    :表示可有0个或多个,2* 代表至少2个,3 * 6表示3到6个
  • ()

    :表示为一个整体
  • []

    :可选内容
  • CRLF

    :互联网标准换行
  • SP

    :空格
  • DIGIT

    :数字0~9
  • HTAB

    :横向制表符
  • OCTET

    :8位数据
  • ;

    :注释

表单文件上传

(头)

Content-Type:multipart/form-data;boundary=xxx

(体)mutipart-body:

1*encapsulation

close-delimiter

encapsulation:delimiter body-part CRLF
  • delimiter:-- boundary CRLF(分隔符)
  • body-part(值)
close-delimiter:-- boundary – CRLF(结束符)
格式(非标准)

(一)请求报文

请求行:

方法

+

空格

+

URL

+

空格

+

版本

+

CR(回车)

+

LF(换行)

请求头:

首部字段名

+

:

+

空格

+

+

CR

+

LF

. . .(可有多个)

CR

+

LF

请求体(

get

方法无请求体)

(二)响应报文

响应行:

版本

+

空格

+

状态码

+

空格

+

短语

+

CR

+

LF

响应头:

首部字段名

+

:

+

空格

+

+

CR

+

LF

. . .(可有多个)

CR

+

LF

响应体

请求方法

GET

:常用于读取的操作,请求参数直接跟在URL后面(但URL长度是有限制的)

POST

:常用于添加、删除、修改等操作,请求参数可以跟在URL后面,也可以存放在请求体中(基本无大小限制)

HEAD

:请求得到与GET相同的响应,但无响应体(常用于下载文件前先确定文件大小)

OPTIONS

:获取目标资源所支持的通信选项(比如服务器支持的请求方法)

PUT

:用于对已存在资源进行整体覆盖

PATCH

:用于对资源进行部分修改(资源不存在时会创建新的资源)

DELETE

:用于删除指定的资源

TRACE

:请求服务器回显其收到的请求信息(常用于HTTP请求的测试诊断)

CONNECT

:可以开启一个客户端与所请求资源间的双向沟通的通道,可以用来创建隧道(可以用来访问采用了SSL(HTTPS)协议的站点)

头部字段

请求头字段

:有关要获取资源或客户端本身信息的消息头

响应头字段

:有关响应的补充信息,如服务器本身(版本、名称等)的消息头

实体头字段

:有关实体主体的更多信息,如主体长度(Content-Length)或其MIME类型

通用头字段

:同时适用于请求和响应信息,但与消息主体无关的消息头

  • ,

    表示分隔符,

    q=xx

    是权重值,即优先级,默认为1.0(最大)

(一)请求头字段

User-Agent

:浏览器的身份标识字符串(附有系统信息等)

User-Agent : Mozilla/5.0 (X11; Linux x86; rv: 12.0) Gecko/20100101 Firefox/21.0

Host

:服务器域名、端口号

Host : localhost : 80

Date

:发送消息的日期时间

Date : Tue , 15 Nov 1994 08 : 12 : 31 GMT

Referer

:表示转到此页面的前一个网页(由哪个网页转到此网页的,可用来做资源的访问限制,比如从其他网址过来的不能访问,由特定网址过来才能访问)

Referer : https 😕/ www . baidu . com(上一个网址是百度)

Content-Type

:表达请求体的数据类型(告诉服务器要如何处理请求)

Content-Type : multipart / form-data(上传文件表单类型)

Content-Length

:请求体的长度(字节为单位)

Content-Length : 348

Accept

:能够接受的响应内容类型(Content-Types)

Accept : text / plain

Accept-Charset

:能够接受的字符集

Acceot-Charset : utf-8

Accept-Encoding

:能够接受的编码方式列表

Accept-Encoding : gzip , deflate

Accept-Language

:能够接受的响应内容的自然语言列表

Accept-Language : en-US

Range

:仅请求某个实体的一部分,字节偏移从0开始(可用于多线程下载等)

Range : bytes=500-999(获取第500字节到第999字节)

Origin

:表明发起跨域资源共享请求的来源(常与响应头Access-Control-Allow-Origin使用,用来判断该来源是否可以访问资源)

Origin : https 😕/ www . baidu . com(表明是从该连接转过来的,请求跨域资源共享)

Cookie

:之前由服务器通过Set-Cookie发送的Cookie

Cookie : $Version=1 ; Skin=new ;

Connection

:浏览器想要优先使用的连接类型

Connection : keep-alive(表示长连接)

Cache-Control

:用来指定在这次请求/响应中所有缓存机制都必须遵守的规则

Cache-Control : no-cache

(二)响应头字段

Date

:发送该消息的日期时间

Date : Tue , 15 Nov 1994 08 : 12 : 31 GMT

Last-Modified

:所请求的对象的最后修改日期

Last-Modified : Tue , 15 Nov 1994 12 : 45 : 26 GMT

Server

:服务器名字

Server : Apache / 2.4.1 (Unix)

Expires

:指定一个时间,超过该时间则认为该响应已过期

Expires : Thu , 01 Dec 1994 16 : 00 : 00 GMT

Content-Type

:表达响应体的数据类型(告诉浏览器如何处理响应)

Content-Type : text / html ; charset=utf-8(解析并展示html页面)

Content-Encoding

:内容所使用的编码类型

Content-Encoding : gzip

Content-Length

:响应体的长度(字节为单位)

Content-Length : 348

Content-Disposition

:可以让客户端下载文件并使用指定的文件类型和文件名

Content-Disposition : attachment ; filename =" fname.txt "(该响应内容为可下载文件,且文件类型为txt,文件名为fname)

Accept-Ranges

:服务器支持哪些种类的部分内容范围(常与请求头Range一同使用)

Accept-Ranges : bytes

Content-Range

:该信息属于完整的信息中的哪一部分

Content-Range : bytes 2101-47021/47022

Access-Control-Allow-Origin

:指定哪些网站可以跨域参与到资源共享过程中(常与请求头Origin一同使用,判断该跨域请求是否可以通过)

Access-Control-Allow-Origin : *(表明所有的网站过来的都可以获取资源)

Set-Cookie

:返回一个Cookie让客户端保存

Set-Cookie : UserID=JohnDoe ; Max-Age=3600 ; Version=1

Location

:用来指明请求重定向的新地址或在创建了某个新资源时使用

Location : http 😕/ www . w3 . org(在客户端收到服务器发送的 302 响应码后,会重新发送一次请求,访问该 Location 地址)

Connection

:对客户端所使用的连接类型

Connection : close(短连接)

Cache-Control

:向从服务器到包括客户端在内的所有缓存机制告知,他们是否可以缓存该对象,单位为秒

Cache-Control : max-age = 3600
状态码
  • 信息响应:100~199

    成功响应:200~299

    重定向:300~399

    客户端错误:400~499

    服务器错误:500~599

  • 后台开发程序员可设置返回给客户端的状态码(如Java中调用

    Response.setStatus()

100 Continue

:请求的初始部分已被服务器收到,且服务器没有拒绝,客户端应该继续发送剩余的请求,如果请求已完成,忽略该响应

常作为客户端发送请求体前的请求,若服务器拒绝该请求(常见于没有包含服务器所需的请求头等),就可以起到节约资源的作用(因为没有发送请求体)

200 OK

:请求成功标志

302 Found

:请求的资源被暂时移动到了由Location头部指定的URL上

请求的资源路径已移动,服务器返回302后,客户端会根据头部Location找到它所指定的URL的地址,发送新的请求访问该URL(请求重定向)

304 Not Modified

:表明客户端所申请的资源服务器并未进行修改,可直接使用客户端自身所缓存的内容

Ctrl

+

F5

可强制刷新缓存

400 Bad Request

:语法无效,服务器无法理解该请求

常见于请求格式错误,或请求内不包含服务器所需内容,开发人员主动抛出

401 Unauthorized

:缺乏目标资源要求的身份验证凭证

常见于一些一来就需要登录才能访问的情况

403 Forbidden

:服务器有能力处理该请求,但拒绝授权访问

404 Not Found

:服务器无法找到所请求的资源

405 Methed Not Allowed

:服务器

禁止

了使用当前HTTP方法的请求

406 Not Acceptable

:服务器无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应

即客户端所能接受的字符集或编码方式,服务器无法提供

408 Request Timeout

:服务器想将没有在使用的连接关闭

若设置了长连接的话,会一直保持着连接,但一些服务器会在一些空闲连接上发送此信息,即使客户端没有发送任何请求断开连接

500 Internal Server Error

:所请求的服务器遇到意外并阻止其执行请求

501 Not Implemented

:请求的方法

不被服务器支持

,因此无法处理请求

  • 502 Bad Gateway

503 Service Unavailable

:服务器尚未处于可以接受请求的状态

常见于服务器停机维护或已超载

跨域

浏览器有个

同源策略

,规定了在默认情况下,

AJAX

(CORS,跨域资源共享)请求只能发送给同源的URL

  • 同源指的是3个相同:

    协议

    +

    域名(IP)

    +

    端口

  • 跨域请求:

    $()

  • img、script、link、iframe、video、audio等标签不受同源策略的约束
  • CORS的实现需要

    客户端

    服务器

    同时支持
    • 客户端一般都支持
    • 服务器需要返回对应的响应头(如

      Access-Control-Allow-Origin

      ),告知浏览器这是否是一个允许跨域访问的资源
  • 浏览器有可能是已经获取到了资源的,但没有Access-Control-Allow-Origin的响应头,因此没有权限显示
Cookie与Session
  • Cookie:会在客户端(浏览器)存储一些数据,并存储到本地硬盘上,服务器通过Set-Cookie返回Cookie交给客户端去存储
    • 发送请求时的路径接受了Cookie,其所有的

      子路径

      在发送请求时,会自动带上Cookie请求头
    • 当没有设置Cookie的过期时间时,默认在浏览器关闭时就会失效
  • Session:可以在服务器内临时存储一些数据,用

    JSESSIONID

    标志,并存入Cookie中,当之后的请求中带有JSESSIONID相同的Cookie,就可以读取存放在服务器内的数据
    • Session默认的有效时间为30分钟
    • 调用

      request.getSession().invalidate()

      可销毁Session

基于Java代码分析Cookie与Session的关系:

  1. 当客户端在没有Cookie信息的情况下发送请求
  2. 服务器收到请求后调用

    request.getSession()

    创建一个Session对象,并随机生成一个名为JSESSIONID的唯一ID值,再通过响应头

    Set-Cookie :JSESSIONID = 唯一ID值

    返回给客户端
  3. 客户端收到该响应头后,立即创建一个Cookie对象
  4. 在之后该

    路径

    或该路径下的

    子路径

    的每次请求中,都会带上包含该Cookie的请求头

    Cookie:JSESSIONID = 唯一ID值

  5. 客户端收到请求后依旧调用

    request.getSession()

    ,在Cookie中获取到了唯一ID值,就会根据唯一ID值在服务器内存中寻找之前已创建的Session对象,获取Session对象中存放的数据
  6. 当客户端删除Cookie时,又回到了无Cookie的状态,此刻若向服务器发送请求,则会重新创建一个Session对象
缓存
  • 缓存对象一般是:GET请求、静态资源(HTML、CSS、JS、图片等)
  • Ctrl+F5可重置刷新缓存(重新发送请求)
  • Pragma:作用类似于Cache-Control(已淘汰)

    Expires:缓存的过期时间(GMT格式)(已淘汰)

    Cache-Control:设置缓存策略

    • no-storage:不缓存数据到本地
    • public:允许用户、代理服务器等缓存数据到本地
    • private:只允许用户缓存数据到本地
    • max-age:缓存有效的时间,单位秒
    • no-cache:每次需要发送请求(无响应体)给服务器询问缓存是否有发生变化,再决定如何使用缓存

      服务器有可能返回304 Not Modified(目标文件未发生变化)

  • 优先级:Pragma > Cache-Control > Expires

响应头:

  • Last-Modified:资源最后一次修改的时间
  • ETag:资源的唯一标识(根据文件内容计算出来的摘要值)
优先级:ETag > Last-Modified

请求头:

  • If-None-Match
    • 若上次的响应头中含有ETag,则会将ETag的值作为请求头的值
    • 当服务器发现资源的最新摘要值与If-None-Match的值不匹配,则会返回最新的资源(200 OK)
    • 当发现值相同时,则说明资源未发生变化,因此不会返回具体的资源(304 Not Modified)
  • If-Modified-Since
    • 若上次的响应头中未含有ETag,但有Last-Modified,则会将Last-Modified的值作为请求头的值
    • 若服务器发现资源的最后一次修改时间晚于If-Modified-Since,则会返回最新的资源部(200 OK)
    • 当发现时间相同或早于时,则说明资源未发送变化,因此不会返回具体的资源(304 Not Modified)

Last-Modified与ETag对比:

  1. Last-Modified只能精确到秒,因此若有资源能在1秒内被修改,则客户端将无法获取到最新的资源
  2. 若有些资源被修改后,又改了回来,此时修改时间发生了变化,但内容并未发生变化,会导致相同的资源却重复发送,没有使用缓存机制
  3. ETag只以资源内容为判断标准,若资源未发生修改,则会使用缓存

缓存流程:

  1. 请求–>无本地缓存–>请求服务器–>获取到资源(根据Cache-Control是否为no-storage:是(不缓存到本地)否(缓存到本地))
  2. 请求–>有本地缓存–>
    • Cache-Control不为no-cach–>缓存未过期–>使用本地缓存
    • Cache-Control为no-cach
      • 响应头无ETag–>响应头无Last-Modified–>请求服务器–>获取到资源–>决定是否缓存到本地
      • 响应头为ETag–>请求头If-None-Match–>判断数据是否有被修改(有(200 OK)无(304 Not Modified))

HTTPS

  • 超文本传输安全协议
  • 又称HTTP over TLS、HTTP over SSL、HTTP Secure
  • 默认端口为443(HTTP为80)
  • 若访问HTTP的网址有HTTPS,一般会重定向到HTTPS处
  • HTTPS成本较高
SSL/TLS
  • HTTPS是在HTTP的基础上使用了SSL/TLS来加密报文,防止窃听
  • TLS:传输层安全性协议,前身即为SSL(安全套接层)
  • 位于应用层和传输层之间
HTTPS通信过程
  1. TCP的3次握手
  2. TLS的连接
  3. HTTP请求和响应

连接的目的是为了使用加密算法生产密钥,使用ECDHE算法实现步骤:

TLS连接十大步骤:

  • 省略ACK确认报
  1. (客户端–>服务器)

    Client Hello

    • TLS版本号
    • 客户端支持的加密组件(Cipher Suite)列表
      • 加密组件是指所使用的加密算法及密钥长度等
    • 一个随机数(Client Random)
  2. (服务器–>客户端)

    Server Hello

    • TLS版本号
    • 选择的加密组件
      • 从接收到的客户端加密组件列表中挑选出来的
    • 一个随机数(Server Random)
  3. (服务器–>客户端)

    Certificate

    • 服务器的证书(已受CA签名)
  4. (服务器–>客户端)

    Server Key Exchange

    • 一个参数(Server Params,用以实现ECDHE算法)
      • ECDHE是一种密钥交换算法
      • 为防止伪造,Server Params会经过服务器私钥签名
  5. (服务器–>客户端)

    Server Hello Done

    • 通知客户端,协商部分结束

前五步客户端与服务器间主要共享了:Client Random、Server Random、Server Params,客户端也拿到了服务器的公钥证书,会先检验证书的有效性,之后:

  1. (客户端–>服务器)

    Client Key Exchange

    • 一个参数(Client Params,用以实现ECDHE算法的另一个参数)

此时,客户端与服务器都拥有了ECDHE算法所需要的两个参数,客户端与服务器会用这两个参数,计算出一个新的随机密钥串:Pre-master secret,然后结合之前的两个随机数,生成一个主密钥,最后使用主密钥衍生出其他密钥、客户端发送用的会话密钥、服务器发送用的会话密钥(对称密钥)

  1. (客户端–>服务器)

    Change Cipher Spec

    • 告知服务器之后的所有通信将采用计算出来的会话密钥进行加密
  2. (客户端–>服务器)

    Finished

    • 将连接至今全部报文的整体校验值(摘要,即哈希值),加密后发送给服务器
    • 此次握手协商是否成功,将以服务器能否正确解密该报文作为判定标准
  3. (服务器–>客户端)

    Change Cipher Spec

    • 告知客户端之后的所有通信将采用计算出来的会话密钥进行加密
  4. (服务器–>客户端)

    Finished

  • 将连接至今全部报文的整体校验值(摘要,即哈希值),加密后发送给客户端
  • 此次握手协商是否成功,将以客户端能否正确解密该报文作为判定标准

HTTP/2

简介

HTTP缺点:

  1. 同一连接,只能对应一个请求
    • 针对同一个域名,大多数浏览器只允许同时存在6个并发连接
  2. 只允许客户端主动发起请求
    • 一个请求只能对应一个响应
  3. 同一个会话中的多次请求,头信息会被重复传输
    • 一般会给每个传输增加500~800字节的开销
    • 使用Cookie会增加更多的开销

为此,SPDY现世:

  • SPDY,基于TCP的

    应用层协议

    ,并强制要求使用SSL/TLS(标准不强制)
  • SPDY即为HTTP/2前身
  • SPDY非取代HTTP,仅仅是修改了HTTP请求和响应的传输方式
  • 仅增加了一个SDPY层,现有的代码无需做任何变化,仅需升级一下客户端与服务器
HTTP/2特性

数据流

:逻辑概念,代表已建立的连接内的

双向字节流

,可以承载一条或多条消息

  • 改进后的HTTP/2的所有通信都在一个TCP连接上完成,此连接可以承接任意数量的双向数据流

消息

:与HTTP请求和响应消息对应,由一系列帧组成

:在HTTP/2

应用层通信

的最小单位,每个帧都包含

帧头

(会标识出当前帧所属的数据流)

  • 因此来自不同数据流的帧可以交错发送,最后再根据每个帧头的数据流标识符重新组装好
  1. 二进制格式

    • 采用二进制格式(二进制帧)传输数据,取代了HTTP/1的文本格式
    • 在协议的解析和优化扩展方面带来了更多的优势
  2. 多路复用

    • 客户端和服务器可以将HTTP消息分解为互不依赖的帧,然后可以交错发送,最后在接收方那边将帧重新组合起来
      • 并行交错发送多个请求,请求间互不影响
      • 并行交错发送多个响应,响应间互不影响
      • 仅使用一个连接并行发送多个请求和响应,取代了HTTP/1的最多6个连接的情况
  3. 优先级

    • 优先给父数据流分配资源
    • 同级数据流间按照权重比分配资源
      • 按资源所占比例决定权重比,资源所占比例越大,权重比越高
  4. 头部压缩

    • HTTP/2使用HPACK压缩请求头和响应头信息
      • 存在一个静态表,记录上一次所发送的请求头和数据头,并对头信息进行编号。当下一次发送请求时,发现所要发的头信息已存在于静态表中,就会只发送重复的头信息的编号,以此来实现头部压缩
  5. 服务器推送

    • 服务器会对客户端的一个请求发送多个响应
      • 除了对最初请求的响应外,服务器还会向客户端额外推送后续可能所需的资源,而无需客户端请求
HTTP/3

简介

HTTP/2缺点:

  1. 对头阻塞

    • HTTP/2以TCP协议作为底层,发送数据时虽然可以

      多路复用

      ,但在接收时会按顺序将数据重新组合起来,若在发送数据时数据包丢失,则按照TCP协议的

      可靠传输

      原则,会等待发送方将数据发送过来,对头阻塞就是一个丢失、接收阻塞。
  2. 握手延迟

    • HTTP/2使用TCP协议作为底层,因此需要3次握手,若使用了TCP+TLS,则需要不断进行交互,即建立连接时间长

因此,基于UDP的QUIC协议现世:

  • 弃用了TCP协议,改用基于UDP的QUIC协议
  • 意为快速UDP网络连接
  • HTT-over-QUIC即为HTTP/3前身

HTTP/3特性

  1. UDP无对头阻塞问题,尽管发
  2. 握手

    0 RRT

    :UDP建立连接速度极快
    • RRT:即往返的时间
  3. 使用

    QUIC

    来保证数据的可靠传输
  4. 连接迁移

    • TCP基于四大要素(源IP、源端口、目标IP、目标端口)建立连接,而QUIC虽然也基于四大要素,但不以四大要素作为连接标识
    • QUIC会使用一组

      Connection ID

      (连接标识)来标识连接,即使IP或端口发生了变化,只要Connection ID未发生变化,则依旧会维持连接
    • 取代了HTTP/2的:一旦IP或端口发生变化,就会断开连接的情况

弊端:

  • CPU负载高(很多设备未针对

    UDP协议

    进行设备优化)

WebSocket

HTTP请求特点:通信只能由客户端发起,为实现推送效果,使用的是

轮询

技术

  • 轮询:浏览器每隔一段时间向服务器发送HTTP请求,服务器返回最新的数据给客户端

WebSocket:

  • 基于

    TCP

    的支持

    全双工通信

    应用层

    协议
    • 全双工通信:服务器、客户端都能主动发送信息给对方
    • TCP原本支持全双工通信,HTTP本身设计的“

      请求-应答模式

      ”限制了TCP的能力
  • 建立连接

    之后,任何一方都能

    主动

    发消息给对方
  • WebSocket和HTTP属于

    平级

    关系,都是应用层协议
  • WebSocket使用80(

    ws://

    )或443(

    wss://

    )端口,因此可以绕过大多数防火墙的限制
  • 因为WebSocket需要事先建立连接(应用层方面),使得WebSocket也成为了一种有状态的协议(会一直保持着连接状态),因此之后的通信会省略部分状态信息

建立连接:WebSocket需要

借助

HTTP协议来建立连接(握手)

  • 由客户端(浏览器)主动发起握手请求

头信息包含:

  1. Upgrade: websocket

    :表示希望升级到WebSocket协议
  2. Connection: upgrade

    :表示想要升级
  3. Sec-WebSocket-Version

    (客户端):表示支持的WebSocket版本
  4. Sec-WebScoket-Key

    (客户端):客户端随机生成的字符串
    • 服务器收到Key后,会:

      ①:在Key受加上一个

      固定

      的GUID值

      ②:将①结果进行SHA-1

      摘要计算

      ③:将②的结果进行Hex to Base64编码(十六进制)

      ④:将③的结果作为

      Sex-WebSocket-Accept

      响应头的值,返回给客户端
    • 可以尽量避免普通的HTTP请求被认为WebSocket协议升级请求

WebService

  • 一种跨编程语言和跨操作系统平台的远程调用技术

    标准

  • 可以用普通的Web API取代
  • 即要求若调用WebService服务,需要按照标准调用SOAP来获取数据

SOAP:简单对象访问协议

  • 大多数为

    HTTP+XM

    L构成
  • WebService使用该协议来封装传递数据
  • WSDL:WebService描述语言
    • 使用一个XML文档,描述了WevService接口的信息

RESTful

  • 译为“表现层状态转移”
  • 是一种互联网软件架构

    设计风格

  • 符合REST架构的Web服务,称为RESTful Web服务

标准:

  1. URL中使用名词(建议复数形式),不使用动词
  2. 使用HTTP的方法表示动作
    GET:查询 POST:创建 PUT:更新 DELETE:删除
    /users 查询所有用户 创建一个新用户 更新所有用户信息 删除所有用户
    /users/6 查询id为6的用户 405(Method Not Allowed) 更新id为6的用户信息 删除id为6的用户
  3. 一个资源连接到其他资源,使用子资源方式

    GET /users/6/cars/88

    POST /users/8/cars

  4. API版本化

    baidu.com/v1/users

    baidu.com/v2/users/66

  5. 返回JSON格式的数据
  6. 发生错误时,不要返回200状态码

HTTPDNS

  • 基于HTTP协议向DNS服务器(HTTP服务器)发送域名解析请求
  • 替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式
  • 可以避免Local DNS造成的域名劫持和跨网访问等问题
  • 常用于移动互联网中

FTP

  • 文件传输协议,基于TCP的应用层协议
  • URL格式:ftp://[user[:password]@]host[:port]/url-path

连接模式:需要客户端与服务器间建立

控制连接

数据连接

  • 控制连接(命令端口):用于传输状态信息(命令、cmd等)
  • 数据连接(数据端口):用于传输文件和目录信息(data)
  1. 主动:
    1. 客户端打开一个随机的

      命令端口

      (端口号

      大于

      1024,假设为

      N

      同时连接到服务器的

      命令端口21

    2. 客户端开启监听数据的

      数据端口N+1

      ,同时向服务器发送一个

      Port

      命令给服务器的

      命令端口21

      • 告诉服务器此刻正在监听数据的

        数据端口N+1

        ,并已经做好从该端口接收数据的准备
      • 服务器的

        命令端口21

        返回一个ACK确认报
    3. 服务器开启

      数据端口20

      ,创建和客户端

      数据端口N+1

      的连接
  2. 被动:
    1. 客户端打开一个随机的

      命令端口N

      同时连接到服务器的

      命令端口21

    2. 客户端通过

      命令端口N

      发送一个

      PASV

      命令给服务器的

      命令端口21

      ,服务器打开一个随机

      数据端口P

      ,并响应给客户端端口号
    3. 客户端

      数据端口N+1

      主动发起与服务器

      数据端口P

      的连接

SMTP、POP、IMAP

简介

发邮件使用协议:SMTP

  • 简单邮件传输协议
  • 基于TCP
  • 服务器默认使用25端口,SSL/TLS下使用465端口

收邮件使用协议:POP

  • 邮局协议
  • 基于TCP,现使用POP3
  • 服务器默认使用110端口,SSL/TLS下使用995端口

收邮件使用协议:IMAP

  • 因特网信息访问协议
  • 基于TCP,现使用IMAP4
  • 服务器默认使用143端口,SSL/TLS使用993端口
POP与IMAP

POP特点:

  1. 客户端连接服务器时,会下载服务器内所有的邮件
    • 可以设置下载完成时,立即删除还是等待一段时间后再删除服务器内的邮件
  2. 客户端的操作(如删除邮件等)不会跟服务器同步
  3. 每个客户端都是独立的,都有其自己的电子邮件副本

IMAP特点:

  1. 客户端连接服务器时,获取的是服务器上邮件的基本信息,不会下载邮件
    • 在打开邮件时,才会开始下载邮件
  2. 客户端的操作会跟服务器同步
  3. 所有的客户端看到的始终是相同的一份邮件

IPv6

  • 网际协议第6版
  • 主要是为了解决IPv4地址枯竭问题,同时对IPv4进行了一些改进
  • 使用比例增长缓慢,原因是需要设备、操作系统内核升级以便支持IPv6
  • 采用128位地址,每16bit一组,共8组,每组以

    :

    分隔开

    如:

    xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx

    也可点分十六进制写法:

    x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x

  • 每组前面连续的0可以省略

    如:

    xxxx:0xxx:0000:0000:0000:0000:0xxx:0x0x

    写成:

    xxxx:xxx:0:0:0:0:xxx:x0x

  • 可用

    ::

    表示一组0或多组连续的0,但只能出现一次,否则会造成歧义

    如:

    xxxx:0xxx:0000:0000:0000:0000:0xxx:0x0x

    写成:

    xxxx:0xxx::xxx:x0x

  • ::1

    是本地环回地址

首部格式:固定40字节

  • version

    (4bit,0110):版本号
  • Traffic Class

    (8bit):交通类别,指明数据包的类别或优先级,可以帮助路由器根据数据包优先级处理流量
    • 若路由器发生拥塞,则优先级低的数据包会先被丢弃
  • Payload Length

    (16bit):有效负载长度
    • 最大值为65535字节
    • 包括了扩展头部、上一层(传输层)数据的长度
  • Hop Limit

    (8bit):跳数限制,与IPv4数据包中的TTL相同
  • Source Address

    (128bit):源IPv6地址
  • Destination Address

    (128bit):目的IPv6地址
  • Flow Label

    (20bit):流标签
    • 指明数据包属于哪个流
    • 用数据包源地址、目的地址、流标签共同标识一个流
  • Next Header

    (8bit):下一个头部
    • 若有拓展头部,则指明下一个拓展头部的类型(编号)

网络安全

代理服务器

简介

  • 代替客户端发送请求,代替服务器发送响应,本身不产生内容

正向代理:

  • 代理的对象是客户端
  • 为客户端选择服务器
  • 能隐藏客户端的身份
  • 能通过代理服务器绕过防火墙
  • 代理服务器能限制某些设备对Internet的访问(比如某些路由器只允许代理服务器访问,而代理服务器就可以充当间接访问路由器的媒介)
  • 数据过滤(与控制Internet访问权限类似)

反向代理:

  • 代理的对象是服务器
  • 为服务器选择客户端
  • 能隐藏服务器身份
  • 安全防护
  • 负载均衡(通过代理服务器的负载均衡算法将请求分发到多个服务器上)

头部字段

Via

:追加(所有)经过的每一台代理服务器的主机名或域名

X-Forwarded-For

:追加(所有)请求方的(公网)IP地址

  • 如代理1将请求发送给代理2,此时的X-Forwarded-For为将请求发送给代理1的主机

X-Real-IP

:客户端的真实(公网)IP地址

常见网络安全问题

截获:窃听通信内容(被动攻击)

中断:中断网络通信(主动攻击)

篡改:修改通信内容(主动攻击)

伪造:伪造通信内容(主动攻击)

ARP欺骗

  • 网络层
  • 让攻击者获取局域网上的数据包甚至可以篡改数据包
  • 让网络上特定电脑之间无法正常通信
  • 让送至特定IP地址的数据被错误送到攻击者所篡改的地方

步骤:

  1. 假设C是攻击者,A是接收方,B是发送方
  2. C只要收到过A、B发送的ARP请求,就能拥有A、B的IP、MAC地址,也就能进行欺骗活动
  3. C在B接收到A的ARP响应包后,将一个ARP响应给B,响应包内的源IP为A的IP地址,源MAC被修改为C的MAC地址,此时B中的ARP表内原本A的MAC地址会被替换为C的MAC地址,B会根据目标IP的MAC地址(也就是现在的C)发送数据

防护:

  • 静态ARP
  • 监听ARP的不正常举动

DoS、DDoS

  • DoS:拒绝服务攻击,使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致用户无法正常访问
  • DDoS:使用网络上多个被攻陷的电脑作为“僵尸”(肉鸡),向特定的目标发动DoS攻击

DoS攻击分为2大类:

  1. 带宽消耗型:UDP洪水攻击、ICMP洪水攻击
  2. 资源消耗型:SYN洪水攻击、LAND攻击

防御:

  1. 防火墙:
    • 防火墙可设置规则,比如只允许或拒绝特定的通信协议、端口或IP地址,当攻击从少数不正常的IP地址发出时,可以简单的使用拒绝规则阻止一切从攻击源IP发出的通信
    • 复杂攻击难以使用,例如当80端口受到攻击时,不可能拒绝端口所有的通信,因为此规则也会阻止合法的流量进入)
    • 防火墙可能处于较后端,可能恶意流量在路由器端就已经将网络拥塞了
  2. 交换机:
    • 大多数交换机具有一定的速度限制和访问控制能力
  3. 路由器:
    • 和交换机类似
  4. 黑洞引导:
    • 将受攻击的计算机的通信全部发送至一个“黑洞”(空接口或是不存在的计算机地址)或有能力处理洪水的网络设备商处,以免网络状态受到较大影响
  5. 流量清洗:
    • 将流量送至DDoS防护清洗中心,将正常流量与恶意流量区分开来,正常的流量将会被送回客户端
SYN洪水攻击
  • 传输层
  • 攻击者发送一系列SYN请求到目标(第一次请求),并让目标接收不到ACK(第三次握手)而进行等待,消耗资源

方式:

  1. 跳过发送最后的ACK信息
  2. 第一次发送SYN时修改了源IP地址,让目标送SYN-ACK到伪造的IP地址处
LAND攻击
  • 传输层
  • 局域网拒绝服务攻击
  • 通过持续发送

    相同的源IP地址和目标IP地址

    的欺骗数据包,使目标试图与自己建立连接,消耗系统资源至崩溃
  • 有些系统存在缺陷,允许设备接收并响应来自网络、却宣称来自于设备自身的数据包,导致循环应答

防护:

  • 大多数防火墙都能拦截类似的数据包
  • 路由器进行配置,屏蔽所有源地址和目标地址相同的数据包

DNS劫持

  • 应用层
  • 又称为域名劫持,攻击者篡改了某个域名的解析结果,将该域名的IP变为指定的IP,使得原本的网址被劫持到了另一个假冒的网址处

防护:

  • 使用更靠谱的DNS服务器

HTTP劫持

  • 对HTTP数据包进行拦截处理后,插入一些指定的JS代码,比如访问某些正常的网站时,会莫名其妙弹出些弹窗广告

加密与解密

简介

encrypt:加密

decrypt:解密

plaintext:明文

ciphertext:密文

  • HTTP协议默认采取明文传输,即数据包被拦截后,很容易就能得到数据包内的数据
  • 应当对数据进行加密后,再进行传输
  • 常见的加密有:
    • 不可逆:

      单向散列函数:MDS、SHA等

    • 可逆:

      对称加密:DES、3DES、AES等

      非对称加密:RSA等

    • 其他:

      混合密码系统、数字签名、证书

单向散列函数

  • 又称为消息摘要函数、哈希函数
  • 散列值,又称为消息摘要、指纹
  • 根据消息内容计算出

    唯一

    的散列值
  • 散列值长度与消息长度

    无关

    ,无论是多大的数据,经过单向散列函数后,都会生成

    固定长度

    的散列值
  • 特点:
    1. 计算速度快
    2. 消息不同,散列值不同
    3. 单向性,即无法根据散列值计算出消息

常见的单向散列函数:

  1. MD4、MD5:产生128bit的散列值(已不安全)
  2. SHA-1:产生160bit的散列值(已不安全)
  3. SHA-2:SHA-256、SHA-384、SHA-512,散列值分别是256bit、384bit、512bit
  4. SHA-3:全新标准

常用场景:

  1. 校验数据是否已被更改
    • 将数据进行单向散列函数计算出一个唯一的散列值,再与现有的数据进行对比,若发现散列值不一样,则说明数据已被篡改(因为相同数据的散列值相同)
  2. 密码加密
    • 将数据进行单向散列函数计算出一个散列值,即使数据被拦截获取到,窃听者也无法通过散列值逆推得出密码

对称加密

  • 又称对称密码
  • 加密、解密时使用的是同一个密钥
  • 常见的对称加密算法:DES、3DES、AES
  • 将明文加密为暗文并发送给对方,并告知对方暗文的密钥
  • 存在密钥被窃听的风险
    • 解决办法:私下共享密钥、密钥分配中心、

      非对称加密

DES
  • DES是一种将64bit明文加密为64bit密文的对称加密算法,密钥长度为56bit(实质上为64bit,但每隔7bit会设置一个用于错误检验的bit)
  • 由于DES每次只能加密64bit的数据,因此当数据较大时,就要对DES加密进行迭代
  • 已能在短时间内被破解
3DES
  • 将DES重复3次所得到的密码算法,又称为3重DES、DES-EDE3
  • 即用

    3把不同

    的密钥对明文进行

    加密-->解密-->加密

    的过程
  • 处理速度不高,且安全问题逐渐暴露
AES
  • 取代DES、3DES称为新标准的算法,又称为Rijndael加密法
  • 密钥长度有128、192、256bit三种

非对称加密

  • 又称为公钥密码
  • 密钥分为加密密钥、解密密钥
    • 加密密钥一般是公开的,又称公钥
    • 解密密钥是由接受者自己保管,不会公开,又称私钥
  • 公钥和私钥是一一对应的,不能单独生成
  • 公钥加密的密文,必须使用与该公钥对应的私钥才能解密(常用于加密)

    私钥加密的密文,需要使用与该私钥对应的公钥解密(常用于数字签名)

  • 接收方将自身的公钥发送给发送方,发送方用公钥将数据加密后发送给接收方,接收方就可以用自身独有的私钥进行解密
  • 非对称加密解密速度比对称加密慢
  • 存在公钥被篡改的风险
    • 解决办法:

      证书

RSA
  • 目前使用最广泛的非对称加密算法

混合密码

  • 会话密钥:指本次通信所随机生成的临时密钥
  • 非对称加密

    加密对称加密的

    密钥

    ,可提高整体速度和安全性

步骤:

  1. 随机生成的

    会话密钥

    将明文加密为

    暗文

    (对称加密)
  2. 用接收者发送的

    公钥

    加密

    会话密钥

    (非对称加密)
  3. 将加密后的会话密钥和暗文一起发送给

    接收者

  4. 接收者先用私钥解密会话密钥,再用会话密钥解密暗文

缺点:

  • 公钥存在被篡改的风险
    • 解决方法:

      证书

证书

  • 接收者在发送给发送者公钥时,有可能被窃听者拦截,窃听者伪造出自己的公钥发送给发送方,发送方用窃听者的公钥加密内容后发送给接收方,窃听者拦截后用自身的私钥解密,获取数据
  • 证书,又称公钥证书,内含接收方的个人信息和公钥
  • 由认证机构(CA)用自身的公钥施加数字签名

步骤:

  1. 接收方将自身的

    公钥

    发送给认证机构生成证书
  2. 认证机构用自身的

    私钥

    为接收方的

    公钥

    加上

    数字签名

    并生成证书
  3. 发送方在收到接收方的证书后,会先获取认证机构的公钥,再用认证机构的

    公钥

    对证书进行验证(解密),如果该证书与CA公布的证书相同,则会认为是接收方,此刻就会用该证书中的公钥进行加密数据

证书获取步骤:

  1. 接收方将公钥发送给认证机构注册证书
  2. 认证机构生成对应证书并保存到仓库中
  3. 发送方去仓库下载对应证书做校验
  4. 现各大CA的公钥,默认已内置在浏览器和操作系统中
  5. 可以用OpenSSL构建一套属于自己的CA,称为“自签名证书”

数字签名

  • 生成签名:消息发送者用自身的私钥进行签名
  • 验证签名:信息接收者用消息发送者的公钥进行签名校验
  • 数字签名的作用:确保内容没有被篡改,对消息发送方的肯定
  • 既然为加密,则不希望别人知道我的信息,只有我能解密

    公钥加密,私钥解密

  • 既然为签名,则不希望别人冒充我发消息,只有我能签名

    私钥签名,公钥验签

步骤:

  1. 发送方将信息和自身公钥发送给接收方
  2. 发送方用自身的私钥对信息进行签名,然后发送签名给接收方
  3. 接收方在收到签名后用发送方的公钥对其进行解密,确认与其收到的信息是否一致,若信息一致则说明信息可信

缺点:

  • 私钥加密解密速度慢

    解决方法:使用单向散列函数

    1. 发送方使用单向散列函数将信息生成为对应的唯一散列值,对其进行签名后发送给接收方
    2. 接收方使用单向散列函数对信息进行计算,得出其散列值
    3. 接收方用发送方的公钥进行解密,得出其散列值,判断两个散列值是否相同

概念剖析

零碎知识点

1)网络、互联网与因特网:

  1. 网络(

    Network

    ):利用交换机将多台主机连接起来
  2. 互联网(

    internet

    ):利用交换机+路由器将多台主机连接起来
  3. 因特网(

    Internet

    ):将全世界所有的计算机连接起来

2)网络分类:

  1. 局域网(

    LAN

    • 以太网(

      Ethernet

    • 无线局域网(

      WLAN

  2. 城域网(

    MAN

  3. 广域网(

    WAN

3)ISP、服务器机房:

  1. ISP:指网络服务提供商,如移动等
  2. 服务器机房:主机通过各种ISP连接到对应ISP的服务器内

4)上网方式:

  1. 电话线入户:ADSL电话拨号上网
    • 非对称数字用户线路,提供上、下行不对称的传输宽带(上传或下载的速度不一样)
    • ①电脑连接路由器的局域网(LAN)接口

      ②路由器的广域网(WAN)接口连接猫(调制解调器,用于数字信号和模拟信号间的转换)

      ③猫的电话接口连接(外网)电话线

  2. 光纤入户:
    • ①电脑连接路由器的局域网(LAN)接口
    • ②路由器的广域网(WAN)接口连接光猫(调制解调器,用于数字信号和光信号间的转换)
    • ③光猫的PON接口连接入户光纤
  3. 无线路由器:
    • 路由器内置交换机,该交换机的一个端口连接无线AP,因此连接无线网的设备处于同一网段

5)公网IP、私网IP:

  • IP地址可分为公网IP和私网IP
  • 数据传输间需要使用NAT技术进行转换
  1. 公网IP:
    • Internet上的路由器只能下一跳到公网的路由器,不能到达私网的路由器
  2. 私网IP:
    • 局域网使用,在不同局域网内可以重复
    • 由保留的公网网段划分出来:
      1. A类:

        10.0.0.0/8

        (1个)
      2. B类:

        172.16.0.0/16

        ~

        172.31.0.0/16

        (16个)
      3. C类:

        192.168.0.0/24

        ~

        192.168.255.0/24

        (256个)

6)NAT:

  • 由于私网IP在不同局域网内可以重复,因此在进行数据传输时,需要将私网IP转换为公网IP(确保数据传输目的地无误)
  • 可由路由器完成
  • 节约公网IP资源,隐藏内部真实IP
  • NAT分类:
    • 静态转换:手动配置NAT映射表,一对一转换
    • 动态转换:定义外部地址池,动态随机转换,一对一转换
    • PAT:多对一转换,采用端口多路复用(一个公网IP可以同时被使用),利用端口号区分

7)模拟信号与数字信号:

  1. 模拟信号:连续的信号,适合长距离传输,抗干扰能力差,受干扰难复原
  2. 数字信号:离散的信号(变化差异大),不适合长距离传输,抗干扰能力强,受干扰也可修复

8)信道:信息传输的通道,一条传输介质(如网线)上可具有多条信道

  1. 单工通信:只能一个方向上传输数据,不能改变信号的传输方向,如无线电广播
  2. 半双工通信:信号可双向传输,但只能交替进行,如对讲机
  3. 全双工通信:信号可同时双向传输,如手机

9)tcpdump:Linux上的抓包工具

vpn

  • 虚拟私人网络
  • 可以在公共网络上建立专用网络,进行加密通讯
    • 客户端到VPN服务器间的数据传输过程中会进行数据加密,而VPN服务器到服务器间的数据传输过程不会进行数据加密
    • VPN加密是在原有的协议上进行的数据加密
    • 需要安装额外的VPN客户端软件
  • 可以提高上网的安全性
  • 隐藏上网者的身份
    • 在数据发送开始就进行了加密
  • 突破网站的地域限制
    • 一些网站会对不同地区的用户展示不同内容
  • 突破网络封锁(比如防火墙的限制)

与代理的区别:

  1. VPN需要安装特定的VPN客户端软件,代理不需要
  2. VPN默认会对数据进行加密,代理不会
  3. VPN比较贵

实现原理:隧道协议(工作在传输层、数据链路层)

  • PPTP(点对点隧道协议)、L2TP(第二层隧道协议)、IPsec(互联网安全协议)、SSL VPN

网络爬虫

  • 网络蜘蛛,模拟人类行为进行浏览页面,并保存数据的过程
  • 搜索引擎也使用了爬虫
  • robots.txt:存于网站根目录下,用于告诉哪些可以爬,哪些不能(只是个规范)
    • User-agent:*

      Disallow

      :允许所有爬虫

      User-agent:*

      Allow:/

      :允许所有爬虫
    • User-agent:name_spider

      Allow:

      :允许特定的爬虫
    • User-agent:*

      Disallow:/

      :拦截所有的爬虫
    • User-agent:*

      Disallow:/xxx/

      :禁止所有爬虫访问特定目录
    • User-agent:*

      Disallow:/*.php$

      :禁止所有爬虫访问特定文件类型的文件

无线网络

  • 手机等设备上会有传输信号所用的天线,通过天线将信号发送到最近的基站,基站间可能通过天线、光纤等传递信号,最后通过天线传递给对方
  • 路由器上也有类似天线的(无线AP)无线接入点

即时通信

  • 简称IM,常用XMPP、MQTT、自定义协议等

XMPP:

  • 可拓展消息与存在协议,前身时Jabber
  • 基于TCP,默认端口5222、5269
  • 特点:
    1. 使用XML格式进传输,体积较大
    2. 比较成熟的IM协议,开发者接入方便

MQTT:

  • 消息队列遥测传输
  • 基于TCP,默认端口为1883、883(带SSL/TLS)
  • 特点:
    • 开销很小,降低网络流量,信息冗杂远小于XMPP
    • 非专门的IM协议,很多功能需要自己实现
    • 被认为是最适合物联网(loT)的网络协议

流媒体

  • 又称流式媒体
  • 指将一连串多媒体数据压缩后,分段发送数据,实现即时传输的一种技术
  • 使用该技术将不必使用前先下载整个媒体文件
  • 常见协议:
    • RTP:实时传输协议,基于UDP
    • RTCP:实时传输控制协议,基于UDP,使用RTP的下一个端口
    • RTSP:实时流协议,基于TCP、UDP的554端口
    • RTMP:实时消息传输协议,默认基于TCP的1935端口
    • HLS:基于HTTP的流媒体网络传输协议

命令

ping的用法

ping /?

:查看ping的用法

ping ip地址 -l 数据包大小

:给指定ip发送指定大小的数据包

ping ip地址 -f

:不允许网络层分片

ping ip地址 -i TTL

:设置TTL的值

tracert ip地址

pathping ip地址

:跟踪数据包经过的路由器

DNS常用命令

ipconfig/displaydns

:查看DNS缓存记录

ipconfig/flushdns

:清空DNS缓存记录

nslookup 域名

:可查看域名对应的IP地址

MAC地址常用命令

arp -a (主机IP)

:查看ARP缓存

arp -d (主机IP)

:删除ARP缓存

arp -s 主机IP MAC地址

:增加一条缓存(静态缓存,时间较久)

DHCP常用命令

ipconfig/all

:查看DHCP相关的详细详细,如租约过期时间、DHCP服务器地址

ipconfig/release

:释放租约

ipconfig/renew

:重新申请IP地址、申请续约(延长租期)

OpenSSL常用命令

  • 需要安装有OpenSSL

openssl genrsa -out 私钥文件名.key

:生成私钥

openssl rsa -in 私钥文件名.key -pubout -out 公钥文件名.pem

:生成公钥

常用命令

netstat -an

:查看被占用的端口

netstat -anb

:查看被占用的端口、占用端口的程序

(需要配置)

telnet localhost 端口号

:查看是否可以访问主机的某个端口

(Xshell中使用)

telnet localhost 8080

:直接面向HTTP报文与服务器交互

继续阅读