个人成长博客

纸上得来终觉浅,绝知此事要躬行

0%

网络基础

概述

计算机网络主要由一些通用的、可编程的硬件互连而成,通过这些硬件,可以传送不同类型的数据,并且可以支持广泛和日益增长的应用。计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。

计算机网络的性能指标

  1. 速率:网络常用单位是Mbps(其中bps=bit/s)。例如100M光纤,100M/s=100Mbps=100Mbit/s=(100/8)MB/s=12.5MB/s
  2. 时延:主要有发送时延、传播时延、排队时延以及处理时延组成。发送时延=数据长度(bit)/发送速率(bit/s) ,其中发送速率受限于计算机网卡。传播时延=传播路径距离/传播速率(bit/s),传播速率受限于传播介质。排队时延,数据包在网络设备中等待被处理时间。处理时延,数据包到达设备或者目的机器被处理所需要的时间。总时延=发送时延+传播时延+排队时延+处理时延
  3. RTT:Route-Trip Time,表示的是数据报文在端到端通信中来回一次的时间,是评估网络质量的一项重要指标。通常使用ping命令查看RTT

网络层次划分

OSI开放式互联参考模型

为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了”开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。其中第四层完成数据传送服务,上面三层面向用户。OSI七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输。

TCP/IP协议

OSI由于体系比较复杂,而且设计先于实现,有许多设计过于思想,不太方便计算机软件实现,因而完全实现OSI参考模型的系统不多,应用的范围有限。而TCP/IP协议最早在计算机系统中实现,在Linux、Windows平台中都有稳定的实现,并且提供了简单方便的编程接口(API),可以在其上开发出丰富的应用程序,因此得到了广泛的应用。TCP/IP协议已成为目前互联网事实上的国际标准和工业标准。

TCP/IP协议不仅仅指的是TCP和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。TCP/IP协议在一定程度上参考了OSI的体系结构。TCP/IP协议又可以分为四层和五层模型,其中和OSI七层模型的对应关系如下:

五层模型只是OSI和TCP/IP的综合,实际应用还是TCP/IP的四层结构,使用更多的也还是四层模型。其中拿计算机A和计算机B进行通信举例,通过TCP/IP协议进行通信的模型图如下:

在数据传输的过程中,TCP/IP先自上而下,后自下而上处理数据头部:

TCP/IP协议四层模型每层主要涉及的协议有:

网络层次详解

网络各个层次的主要功能与涉及的协议如下图所示:

简而言之:

物理层

主要作用为建立、维护、断开不同设备之间的物理连接,进行原始比特流的传输(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们通常所说的数模转换与模数转换)。主要协议有,RJ45、CLOCK、IEEE802.3(中继器、集线器)。

信道

信道是往一个方向传送信息的媒体。一条通信电路包含一个接收信道和发送信道。信道又分为单工通信信道(只能往一个方向通信,没有反方向反馈的信道,有线电视、无线电收音机等)、半双工通信信道(双方丢可以发送和接收信息,但不能双方同时发送,也不能同时接收)、全双工通信信道(双方丢可以同时发送和接收信息)。物理层数据是在通信信道上传播,为了提高信道利用率,采用了分用-复用技术,分用-复用技术主要分为频分复用、时分复用、波分复用、码分复用。

数据链路层

建立逻辑连接、进行硬件地址寻址、差错校验、透明传输等功能,用MAC地址访问介质。主要协议有,PPP、FR、HDLC、VLAN、MAC(网桥、交换机)。

封装成帧

帧是数据链路层的传送单位,数据帧最大传输单元为MTU(Maximum Transmission Unit,一般最大1500字节)。发送端在网络层的一段数据前后添加特定标记形成“帧”(在数据前加帧首部,在数据后加帧尾部),接收端根据前后特定标记识别出“帧”。

数据链路层转发数据帧的步骤如下,其中数据帧的前6个字节代表目的Mac地址:

透明传输

如果数据报中也有控制字符时,则需要使用转义字符ESC来实现透明传输,如图:

差错检测

数据链路层差错检测使用,奇偶校验码和循环冗余校验码CRC来实现,错误发现但不纠正。

奇偶校验码:是一种通过增加1个冗余位使得码字中”1”的个数恒为奇数或偶数的编码方法,它是一种检错码。

循环冗余校验:一种根据传输或保存的数据而产生固定位数校验码的方法,生成的校验码会附加到数据后面。通过某种数学运算来建立数据位和校验位的约定关系的,奇偶校验码可以看为校验位为1的循环冗余校验码。循环冗余校验生成校验码运用了模“2”除法,简言之就是异或操作。循环冗余校验的步骤为:

  1. 选定一个用于校验的多项式G(x),并在数据尾部添加r个0,r为多项式最高阶,G(x)选取标准为:

    G(x)转化为多项式的位串如下:

  2. 将添加r个0后的数据,使用模“2”除法除以多项式的位串

  3. 得到的余数填充在原始r个0的位置得到可校验的位串

  4. 接收端接收的数据除以G(x)的位串,根据余数判断出错,0没有错误

网络层

进行逻辑地址寻址,实现不同网络之间的路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。主要协议有,IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP(交换机)。

网络地址转换NAT技术

当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。这种方法需要在专用网(私网IP)连接到因特网(公网IP)的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址(公网IP地址)。这样,所有使用本地地址(私网IP地址)的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

举例如下,出和入代表专有网络和公有网络互相访问的关系,通过NAT表会记录私有端口和公有端口的映射关系:

ARP协议和RARP协议

ARP协议(地址解析协议),主要是根据IP地址获取物理地址的一个TCP/IP协议。RARP协议(逆地址解析协议),顾名思义根据MAC地址获取IP地址。ARP协议和RARP协议是协调网络层和数据链路层配合工作的协议。

主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。ARP缓存是ARP协议和RARP协议运行的关键。ARP缓存表缓存了IP地址到硬件地址之间的映射关系(arp -a可查看本机ARP缓存)。ARP报文如下,注意ARP报文封装在数据帧中,但ARP还是属于网络层协议:

IP协议

设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。通过IP协议使得复杂的实际网络变为一个虚拟互连的网络。IP协议使得网络层可以屏蔽底层细节而专注网络的数据转发。IP协议解决了在虚拟网络中数据报传输路径的问题。

IP分组结构

一个IP分组由首部和数据两部分组成。首部的前20字节是所有IP分组必须具有的,也称固定首部。在首部固定部分的后面是一些可选字段,其长度是可变的。

IP首部:

  1. 版本:占4位,指的是IP协议的版本,通信双方的版本必须一致,当前主流版本是4,即IPv4,也有IPv6
  2. 首部长度:占4位,再大数值为15,表示的是IP首部长度,单位是“32位字”,单位是即4个字节,也间接说明IP首部最大长度为15*4=60字节
  3. 总长度:占16位,最大数值是65535(单位字节),表示的是IP数据报总长度(IP首部+IP数据),需要说明的数据链路层MTU最大是1500字节。当IP数据报比MTU大时,则数据链路层则会把IP数据报分片
  4. 标志,标记IP数据报是否可以分片。片偏移,则表明在分片的情况下,是第几个个偏移
  5. TTL:占8位,表明IP数据报文在网络中的寿命,每经过一个设备,TTL减1,当TTL=0时,网络设备必须丢弃该报文。TTL可以避免无限传输带来的带宽消耗
  6. 协议:占8位,表明IP数据锁携带的具体数据是什么协议的(如:TCP、UDP等)
  7. 首部校验和:占16位,校验IP首部是否出错
IP协议转发流程

路由器仅根据网络地址进行转发,逐跳(hop-by-hop)在不同设备进行转发,最终到达目的地址。具体如下,当IP数据包经由路由器转发时,如果目标网络与本地路由器直接相连,则直接将数据包交付给目标主机,这称为直接交付;否则,路由器通过路由表查找路由信息,并将数据包转交给指明的下一跳路由器,这称为间接交付。路由器在间接交付中,若路由表中有到达目标网络的路由,则把数据包传送给路由表指明的下一跳路由器;如果没有路由,但路由表中有一个默认路由,则把数据包传送给指明的默认路由器;如果两者都没有,则丢弃数据包并报告错误。

举例来说,A到C的一个路由访问在网络层的步骤:

结合上面所讲的数据链路层和物理层,再还原下A到C的流程,注意数据帧每一跳的MAC地址都在变化,IP数据报每一跳的IP地址始终不变:

网络路由协议

IP协议的转发流程有个重要的一点,路由表。路由表能够记录当前设备需要到目的地址,下一跳的地址。如下图所示:

要解决网络路由问题,需要一个好的算法。路由算法实际上是图论算法,但是因为网络环境复杂,路由算法要比图论算法要复杂。涉及一个路由算法首先算法要是正确的、完整的,算法在计算上应该尽可能的简单,同时算法可以适应网络中的变化,并且算法是稳定的公平的。

因为互联网的规模是特别庞大的并且复杂的,在设计算法之前需要对互联网进行划分。这里我们引出了自治系统(AS)的概念,一个自治系统是处于一个管理机构下的网络设备群。AS内部网络自行管理,AS对外提供一个或者多个出(入)口。这样设计路由协议的时候可以分为两个层次:

  1. 自治系统内部路由的协议:内部网关协议(RIP、OSPF)
  2. 自治系统外部路由协议:外部网关协议(BGP)

如下图,则是不同AS之间运用内部与外部网关协议协作路由示意图:

内部网关路由协议RIP
距离矢量算法DV

所谓距离矢量即是将一条路由信息考虑成一个由目标和距离(用 Metric 来度量)组称的矢量,每一台路由器从其邻居处获得路由信息,并在每一条路由信息上叠加从自己到这个邻居的距离矢量,从而形成自己的路由信息。每一个节点使用两个向量Di和Si,Di描述的是当前节点到别的节点的距离。Si描述的是当前节点到别的节点的下一节点。每一个节点与相邻的节点交换向量Di和Si的信息,每一个节点根据交换的信息更新自己的节点信息。具体如下:

RIP协议过程

RIP协议基于距离矢量算法,使用“跳数”(即metric)来衡量到达目标地址的路由距离。这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息,范围限制在15跳(15度)之内,再远,它就不关心了,标记为不可达。RIP协议每隔30s会交换一次路由信息。主要过程如下:

  1. 路由器初始化路由信息(两个向量Di和Si)
  2. 对相邻路由器X发送过来的信息,对信息内容进行修改(下一跳地址设置为X,所有距离加1)
    • 检索本地路由,将信息中新的路由插入到路由表里面
    • 检索本地路由,对于下一跳为X的,更新为修改后的信息
    • 检索本地路由,对比相同目的的距离,如果新信息的距离更小,则更新本地路由表
  3. 如果3分钟没有收到相邻路由信息,则把相邻路由设置为不可达(16跳)
RIP协议的局限性
  1. 协议中规定,一条有效的路由信息的度量(metric)不能超过15,这就使得该协议不能应用于很大型的网络,应该说正是由于设计者考虑到该协议只适合于小型网络所以才进行了这一限制。对于metric为16的目标网络来说,即认为其不可到达
  2. 该路由协议应用到实际中时,很容易出现“计数到无穷大”的现象,这使得路由收敛很慢,在网络拓扑结构变化以后需要很长时间路由信息才能稳定下来
  3. 该协议以跳数,即报文经过的路由器个数为衡量标准,并以此来选择路由,这一措施欠合理性,因为没有考虑网络延时、可靠性、线路负荷等因素对传输质量和速度的影响
内部网关路由协议OSPF
Dijkstra算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。主要算法流程如下:

  1. 初始化两个集合(S,U)(S为只有初始顶点A的集合,U为其他顶点集合)
  2. 如果U不为空,对U集合顶点进行距离的排序,并取出距离A最近的一个顶点D
    • 将顶点D纳入S集合
    • 更新通过顶点D到达U集合所有点的距离(如果距离更小则更新顶点A到该点的距离,否则不更新)
  3. 重复2的步骤直到U集合为空,算法完成
链路状态协议LS

链路状态路由协议是层次式的,网络中的路由器并不向邻居传递“路由项”,而是通告给邻居一些链路状态(链路状态指距离、时延、带宽等)。与距离矢量路由协议相比,链路状态协议对路由的计算方法有本质的差别。距离矢量协议是平面式的,所有的路由学习完全依靠邻居,交换的是路由项。链路状态协议只是通告给邻居一些链路状态,并且只有链路状态发生变化时,才发送更新信息。运行该路由协议的路由器不是简单地从相邻的路由器学习路由,而是把路由器分成区域,收集区域的所有的路由器的链路状态信息,根据状态信息生成网络拓扑结构,每一个路由器再根据拓扑结构计算出路由。

OSPF协议过程

开放式最短路径优先(Open Shortest Path First,OSPF)是广泛使用的一种动态路由协议,它属于链路状态路由协议,具有路由变化收敛速度快、无路由环路、支持变长子网掩码(VLSM)和汇总、层次区域划分等优点。在网络中使用OSPF协议后,大部分路由将由OSPF协议自行计算和生成,无须网络管理员人工配置,当网络拓扑发生变化时,协议可以自动计算、更正路由,极大地方便了网络管理。OSPF协议的核心是Dijkstra算法。

OSPF协议依靠五种不同类型的分组来建立邻接关系和交换路由信息,即问候分组、数据库描述分组、链路状态请求分组、链路状态更新分组和链路状态确认分组。OSPF协议过程如下:

RIP和OSPF协议对比
RIP协议 OSPF协议
从邻居看网络 整个网络拓扑
在路由器之间累加距离 Dijkstra算法计算最短路径
频繁、周期更新、收敛很慢 状态变化更新、收敛很快
路由间拷贝路由信息 路由间传递链路状态,自行计算路径
外部网关路由协议BGP

边际网关协议BGP,是自治系统(AS)间的路由协议,BGP交换的网络可达性信息提供了足够的信息来检测路由回路并根据性能优先和策略约束对路由进行决策。因为AS之间需要考虑除网络特性以外的一些因素(如政治、安全等),BGP协议只能够找到一条到达目的比较好的路由,AS之间通过BGP发言人来进行路由信息交换。BGP发言人可以人为配置策略。

ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。

ICMP报文是存储在IP报文的数据区的:

ICMP报文首部以及种类为:

传输层

定义传输数据的协议端口号,以及流控和差错校验。数据包一旦离开网卡即进入网络传输层。将从下层的接收的数据进行分段和传输,到达目的地后再进行传输。常常把这一层数据叫做段。主要协议有,TCP、UDP、SPX。

UDP协议详解

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP数据报直接封装的是应用层数据,面向数据报文的协议结构如下:

UDP报头由4个域组成,其中每个域各占用2个字节,具体包括源端口号、目标端口号、数据报长度、校验值。UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。首部结构图如下:

TCP详解

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。其中一个TCP连接有两端(点对点通信),并且是全双工的通信。TCP的数据报如下:

TCP首部结构设计如下:

其中:

  1. 序号:占32位,一个字节一个序号,标记数据部分首字节的序号

  2. 确认号:占32位,同样也是一个字节一个序号,标记期望收到数据的首字节序号。确认号为N:则表示N-1序号的数据已经收到

  3. 数据偏移:占4位,单位为32位字,表示数据偏离首部的距离。主要因为TCP选项导致首部大小不可预知,所以设置该字段

  4. TCP标记:占6位,每位各有不同的意义分别代表URG、ACK、PSH、RST、SYN、FIN

    标记 含义
    URG Urgent:紧急位,URG=1,表示紧急数据
    ACK Acknowledgement:确认位,ACK=1,确认号才生效
    PSH Push:推送位,PSH=1,尽快地把数据交付给应用层
    RST Rset:重置位,RST=1,重新建立连接
    SYN Synchronization:同步位,SYN=1表示连接请求报文
    FIN Finish:终止位,FIN=1表示释放连接
  5. 窗口:占16位,窗口指明允许对方发送的数据量。窗口和确认号一起使用,则能够表明能够接受的数据范围

  6. 紧急指针:URG=1时,指定紧急数据在报文中的位置

  7. TCP选项:最多40字节,支持未来的拓展用

TCP协议实现可靠传输
可靠传输

可靠传输,就是采用一系列技术来保障信息在发送方和接收方准确、精确的传输。有两种基本实现方式:

  1. 停止等待协议:停止等待协议用于通信系统中,两个相连的设备相互发送信息时使用,以确保信息不因丢包或包乱序而丢失,是最简单的自动重传请求方法。停止等待协议传输消息,如下图所示,当然会出现三种异常情况,第一种发送消息在路上就消失了,第二种确认消息在路上丢失了,第三种确认消息很久才到。停止等待协议,每发送一个消息时,都需要设置一个定时器,面对上面提到的三种情况,都是通过超时重传来避免这类不可靠的场景。停止等待协议是最简单的可靠传输协议,但是停止等待协议对信道的利用率不是很高。

  2. 连续ARQ协议:连续ARQ(Automatic Repeat reQuest)协议指发送方维持着一个一定大小的发送窗口,位于发送窗口内的所有分组都可连续发送出去,而中途不需要等待对方的确认。这样信道的利用率就提高了。而发送方每收到一个确认就把发送窗口向前滑动一个分组的位置,如下图所示。

    接收方一般都是采用积累确认的方式。这就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。

    积累确认有优点也有缺点。优点是:容易实现,即使确认丢失也不必重传。但缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。

    TCP可靠传输

    TCP的可靠传输基于连续ARQ协议来的,并通过选择重传来实现容错。TCP的滑动窗口以字节为单位,具体如下:

其中红色代表收到确认信息的字节,窗口会向后滑动两位,但是当出现如下情况时,则需要通过选择重传技术来实现可靠传输,选择重传需要重传的边界信息保存在TCP首部的TCP选项中。

TCP流量控制

流量控制指让发送方发送速率不要太快。流量控制是使用窗口来实现的。

接收方此时可以通过调整窗口大小来实现进一步数据传输,但重置大小的消息并没有重传机制,如果消息丢失,则可能造成发送方一直认为窗口为0,接收方一直等待发送方传送数据的情况,这里通过坚持定时器来解决这个问题。当接收到窗口为0的消息,则启动坚持定时器。坚持定时器,每隔一段时间发送一个窗口探测报文,从而探测窗口的变化情况。

TCP拥塞控制

一条数据链路经过非常多的设备,数据链路中各个部分都有可能成为网络传输的瓶颈。流量控制考虑点对点的通信量控制,拥塞控制考虑整个网络,是全局性的考虑。一般报文超时,可以视为拥塞。

拥塞控制的方法
  1. 慢启动算法:由小到大慢慢增加发送数据量,没收到一个报文确认,就加一,数量级呈指数级增长,当达到慢启动阈值时则停止。
  2. 拥塞避免算法:维护一个拥塞窗口的变量,只要网络不拥塞,就试探着将拥塞窗口调大,每次加1

采用拥塞控制方法的数据量增长示意图如下:

TCP三次握手

TCP三次握手流程如下:

  1. 第一次握手:建立连接时,发送方发送SYN包(seq=x)到接收方,并进入SYN_SEND状态,等待接收方确认
  2. 第二次握手:接收方收到SYN包,必须确认客户SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时接收方进入SYNC_RCVD状态
  3. 第三次握手:发送方收到接收方的SYN+ACK包,向接收方发送确认包ACK(ack=y+1),此包发送完毕,发送方和接收方进入ESTABLISHED状态,完成三次握手

通过三次握手而不是两次握手可以避免已经失效的请求报文传送到对方,引起错误:

TCP四次挥手

TCP四次挥手流程如下:

  1. 第一次挥手:发送方发送一个FIN,用来关闭发送方到接收方的数据传输,发送方进入FIN-WAIT-1状态
  2. 第二次挥手:接收方收到FIN后,发送一个ACK给发送方,确认号为收到的序号+1,接受方进入CLOSE-WAIT状态
  3. 第三次挥手:接收方发送一个FIN,用来关闭接收端到发送方的数据传输,接收方进入LAST-ACK状态
  4. 第四次挥手:发送方收到FIN后,接收方进入TIME-WAIT状态,接着发送一个ACK给接收方,确认号为收到序号+1,接受方进入CLOSED状态,完成四次挥手

在发送方第四次挥手之后,TCP连接不会立即释放,发送方会进入TIME-WAIT状态。此时需要等待两个MSL(最长报文段寿命,建议2分钟)。主要有两个目的,一个是确保发送方ACK可以到达接收方,如果2MSL时间内没有收到,则接收方会重发,第二个是确保当前连接的所有报文都已经过期。

前面已经提到了超时定时器、坚持定时器、等待计时器,另外这里补充TCP的最后一个定时器,保活定时器。保活计时器,顾名思义,保活是这个计时器的主要目的,他是为了保活TCP连接而设计的,保活定时器可以防止TCP连接的两端出现长时期的空闲,当一方出现状态变化或故障时,另一方没有察觉的情况。服务端一般都会设置一个保活定时器,每次收到对方的数据则重置这个定时器,如果定时器超时,服务端则发送探测报文段,探测客户端是否还在线,如果没有收到响应的话,那么则认为客户端已经断开连接了,因此服务端也会终止这个连接。

会话层

建立、管理、终止会话。建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,允许不同机器上的用户之间建立会话关系,并能使会话获得同步。主要协议有,NFS、SQL、NETBIOS、RPC。

表示层

数据的表示、安全、压缩。表示层是处理所有与数据表示及运输有关的问题,包括转换、加密和压缩。每台计算机可能有它自己的表示数据的内部方法,例如,ASCII码与EBCDIC码,所以需要表示层协定来保证不同的计算机可以彼此理解。主要协议有,JPEG、MPEG、ASII。

应用层

是最靠近用户的OSI层。这一层为用户的应用程序(如:电子邮件、文件传输和仿真终端)提供网络服务。主要协议有,FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS。

DNS详解

域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射一个分布式数据库,能够使人更方便地访问互联网。DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。

域名

域名由点、字母和数字组成,点分割不同的域,域名可以分为顶级域(国家:cn、us等,通用:com、net、gov等)、二级域(aliyun、qq、baidu等)、三级域(mail、www、game等)。

DNS解析顺序
  1. 浏览器缓存:当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在)
  2. 系统缓存:当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP
  3. 路由器缓存:当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存
  4. ISP(互联网服务提供商)DNS缓存:当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找
  5. 根域名服务器:当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器
  6. 顶级域名服务器:顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器
  7. 主域名服务器:主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录
  8. 保存结果至缓存:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接

DHCP协议详解

DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。DHCP封包在传输层( Transport Layer)是采用UDP协议,而当 Client传送给封包给 Server时,采用的是UDP 68 Port,从 Server传送给 Client则是使用UDP 67 Port。

HTTP协议详解

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上,并且HTTP协议底层也是TCP协议实现,所以HTTP协议也是可靠的数据传输协议。HTTP是一种无状态协议,即服务器不保留与客户交易时的任何状态。客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。HTTP是一种面向对象的协议。允许传送任意类型的数据对象。它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。当用户在一个HTML文档中定义了一个超文本链后,浏览器将通过TCP/IP协议与指定的服务器建立连接。

HTTP请求报文和应答报文

HTTP规范定义了9种请求方法,每种请求方法规定了客户和服务器之间不同的信息交换方式,常用的请求方法是GET和POST。服务器将根据客户请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。

请求报文

举例如下:

应答报文

举例如下:

状态码

状态码 含义
1xx 信息类状态码,正在处理请求
2xx 成功状态码
3xx 重定向状态码
4xx 客户端错误状态码
5xx 服务端错误状态码
HTTPS

首先介绍下SSL和TSL,SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密,采用身份验证和数据加密保证网络通信的安全和数据完整性。HTTPS协议则是通过SSL或者TLS实现的安全性。

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题

HTTPS通过SSL或者TLS数据传输流程:

  1. 浏览器将支持的加密算法信息发送给服务器
  2. 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器
  3. 浏览器验证证书合法性,并结合证书公钥加密信息发送给服务器
  4. 服务器使用私钥解密信息,验证哈希,加密响应消息回发浏览器
  5. 浏览器解密响应消息,并对消息进行验真,之后进行加密交互数据

SSL或者TLS首先通过非对称加密的方式来实现秘钥的协商, 再通过对称加密的方式来实现数据的加密。通过协议可以进行身份的验证,数据交互的时候,客户端和服务端都可以向CA机构申请证书,并且在协议握手阶段来验证彼此身份,防止第三方进行冒充。它可以保证信息的完整性,每次发送数据都会加上一个MAC摘要,并且签名。当发送数据和接收数据这个摘要信息一致的话,就表示这个信息是没有被第三方篡改过的。

HTTP协议的发展
影响HTTP的主要因素

影响一个 HTTP 网络请求的因素主要有两个:

  • 带宽:如果说我们还停留在拨号上网的阶段,带宽可能会成为一个比较严重影响请求的问题,但是现在网络基础建设已经使得带宽得到极大的提升,我们不再会担心由带宽而影响网速,那么就只剩下延迟了

  • 延迟:

    • 浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4 个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞
    • DNS 查询(DNS Lookup):浏览器需要知道目标服务器的 IP 才能建立连接。将域名解析为 IP 的这个系统就是 DNS。这个通常可以利用DNS缓存结果来达到减少这个时间的目的
    • 建立连接(Initial connection):HTTP 是基于 TCP 协议的,浏览器最快也要在第三次握手时才能捎带 HTTP 请求报文,达到真正的建立连接,但是这些连接无法复用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大
HTTP1.1
  1. 长连接:在HTTP / 0.9和1.0中,连接在单个请求/响应对之后关闭。HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新协商TCP3次握手连接。另一个积极的副作用是,通常,由于TCP的缓慢启动机制,连接随着时间的推移而变得更快
  2. 带宽优化及网络连接的使用:协议的1.1版还对HTTP / 1.0进行了带宽优化改进。例如,HTTP / 1.1引入了分块传输编码,以允许流传输而不是缓冲持久连接上的内容。HTTP流水线进一步减少了延迟时间,允许客户端在等待每个响应之前发送多个请求。协议的另一项附加功能是字节服务,即服务器仅传输客户端明确请求的资源部分
  3. 错误通知的管理:在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
  4. 缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
  5. Host头处理:在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
HTTP2.0

HTTP2.0主要基于SPDY协议。SPDY是Speedy的昵音,意为“更快”。它是Google开发的基于TCP协议的应用层协议。目标是优化HTTP协议的性能,通过压缩、多路复用和优先级等技术,缩短网页的加载时间并提高安全性。SPDY协议的核心思想是尽量减少TCP连接数。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。

HTTP1.x有以下几个主要缺点:

  1. HTTP/1.0一次只允许在一个TCP连接上发起一个请求,HTTP/1.1使用的流水线技术也只能部分处理请求并发,仍然会存在队列头阻塞问题,因此客户端在需要发起多次请求时,通常会采用建立多连接来减少延迟。
  2. 单向请求,只能由客户端发起。
  3. 请求报文与响应报文首部信息冗余量大。
  4. 数据未压缩,导致数据的传输量大

通过SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性,具体如下:

  1. 降低延迟:针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率
  2. 请求优先级(request prioritization):多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能第一时间看到网页内容
  3. header压缩:前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
  4. 基于HTTPS的加密协议传输:大大提高了传输数据的可靠性
  5. 服务端推送(server push):采用了SPDY的网页,例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了

HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是HTTP2.0 跟 SPDY 仍有不同的地方,HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS,还有就是消息头的压缩算法不同。

HTTP2.0和HTTP1.X相比的新特性

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面
  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小
  • 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能

HTTP2.0的多路复用和HTTP1.X中的长连接复用有什么区别

  • HTTP/1.0:一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接
  • HTTP/1.1:Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞
  • HTTP/2:多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行

HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我调整,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调整则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升。

-