计网模型

  • OSI七层

    物理层、数据链路层、网络层、传输层、会话层、表示层、网络层

  • TCP/IP四层

    网络接口层、网络层(IP)、传输层(TCP、UDP)、应用层

  • 五层协议

    物理层、数据链路层、网络层、传输层、应用层

TCP三次握手

握手流程

24.png

A作为客户端,B作为服务端。SYN是同步序列编号,ACK是确认标志位。

  • B处于LISTEN,等待客户端的连接请求,A向B发送请求报文,SYN=1、ACK=0,并选择一个初始序号x,代表这是一个同步请求。
  • B收到请求报文,若同意建立连接,则B向A发送连接确认报文,SYN=1、ACK=1,且确认号是x+1,并选择一个初始序号y,这一步是对第一次握手的SYN同步进行确认。
  • A收到B的来连接确认报文后,还需A向B发出确认报文,ACK=1,确认号是y+1,序号是x+1,然后B收到A的确认报文后,连接成功建立。

为什么要三次握手

三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。

客户端发送的连接请求若在网络中长时间滞留,那么间隔很长的时间才收到服务端的连接确认。但客户端在等待一个超时重传时间后,会重新请求连接。最后这个滞留的请求还是会到达服务器。若不进行三次握手,那么服务器会打开两个连接,若进行三次握手,客户端会忽略服务器后续发来对滞留连接请求的确认报文,于是不进行对该请求的第三次握手,因此不会打开多个连接。

为什么第二次握手除了回传ACK,还要回传SYN?

回传SYN代表服务端收到了客户端的请求,证明客户端到服务端的通信是正常的,现在返回一个SYN来建立并确认服务端到客户端的通信是否正常。

回传ACK代表服务端告诉客户端收到了它的请求。

客户端发出SYN请求,服务端使用SYN–ACK进行应答这个请求,最后客户端再以ACK进行连接的最后确认,于是客户端和服务端间建立了可靠的TCP连接。

TCP四次挥手

挥手流程

25.png

A作为客户端,B作为服务端。FIN代表结束。

  • A向B发送连接释放报文,FIN=1。
  • B收到A的释放请求,随后B向A发出确认连接释放报文,ACK=1,此时TCP处于半关闭状态,B可以向A发送数据,但A不可以向B发送数据。
  • 此时A到B的连接关闭,然后我们要关闭B到A的连接,B向A发送连接释放报文,FIN=1,由于现在是半关闭状态,服务器可能又发送了一些数据,此时B进入LAST–ACK(最后确认状态),然后B向A发送确认,ACK=1,等待关闭。
  • A收到B的连接关闭请求和最后确认请求后,A进入TIME–WAIT状态,A向B发送确认报文,ACK=1,再等待2MSL后释放连接。
  • B收到A的确认连接,释放连接。

为什么四次挥手

客户端先发送FIN连接释放报文,服务端收到报文后就进入CLOSE–WAIT状态。该状态是为了让服务端发送还未传输完毕的数据,待数据传输完毕后,服务器会发送FIN连接释放报文。

而客户端收到服务器的连接释放请求后,进入TIME–WAIT状态,然后等待2MSL的时间后,进入CLOSED状态。等待的原因有两点:

  • 确保客户端的最后一个确认报文可以到达服务端。若B没有收到A的确认报文,那么A会重新发送确认连接释放报文,A等待一段时间就是为了处理这种情况。

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

TCP与UDP的区别

  • UDP
    • 无连接
    • 传输不可靠
    • 传输形式:数据报文端
    • 传输效率快
    • 耗资源少
    • 首部字节:8字节
    • 一般用于通信速度要求高的场景,即时通信,如QQ语音、视频直播等
  • TCP
    • 面向连接
    • 可靠传输
    • 传输形式:字节流
    • 传输效率慢
    • 耗资源多
    • 首部字节:20-60
    • 多用于要求通信可靠的场景,如文件传输、发送接收邮件、远程登录等场景

TCP协议如何保证可靠传输

  • 校验和:TCP校验和覆盖TCP首部与TCP数据,这是一个发送端到接收端的校验和。目的是检测数据在传输过程中的任何变化,若收到的校验和有差错,TCP会丢弃和不确认接收这个报文段。
  • 流量控制:流量控制是为了控制发送方发送速率,保证接收方来得及接收。当接收方来不及处理发送方数据时,接收方发送的确认报文中的窗口字段可用来控制发送方窗口大小,进而影响发送方的发送速率。(TCP利用滑动窗口实现流量控制)
  • 拥塞控制:网络拥塞时,减少数据的发送,降低网络拥塞程度。(维护拥塞窗口,其大小取决于网络的拥塞程度)
  • ARQ协议:实现可靠传输,基本原理是每次发送完一个分组就停止发送,等待对方进行确认后,再进行下一个分组的发送。
  • 超时重传:TCP发送报文后会启动一个定时器,等待接收端确认这个报文。若在限制时间内没有收到接收端的确认返回,TCP会重新发送这个报文段。

浏览器从输入url到展示网页发生了什么

  • 解析URl:也就是分析我们网址的请求路径

  • 浏览器封装HTTP请求报文:对URL进行分析后,浏览器确定了目标服务器以及请求路径对应的文件。随后浏览器就将这些信息封装成一个HTTP请求报文发送出去。

  • DNS域名解析获取IP地址:域名并不是目标服务器的详细地址,所以我们还要解析获取其详细的IP地址。而DNS获取地址是先去缓存查找,没有则去查询,具体步骤如下,注意DNS使用UDP协议,以下请求的转发都是基于UDP。

    • 搜索浏览器DNS缓存
    • 搜索操作系统DNS缓存
    • 缓存中都没有找到,操作系统会将域名发送到本地域名服务器,通过本地域名服务器查询DNS缓存,找到则返回(主机与本地域名服务器之间查询方式是递归查询)
    • 若本地域名服务器DNS缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询(本地域名服务器与其他域名服务器之间迭代查询,防止根域名服务器压力过大)
      • 本地域名服务器向根域名服务器发起请求,根域名是最高层次的,它不会直接指明一个IP地址,而是返回顶级域名服务器地址,逐层查询
      • 本地域名服务器向顶级域名服务器发起请求,获取权限域名服务器地址
      • 本地域名服务器向权限域名服务器发起请求,得到域名的IP地址
    • 本地域名服务器获取IP后返回给操作系统,同时自己也会缓存IP地址,方便后续查找
    • 操作系统将IP地址返回给浏览器,同时自己也会将IP地址缓存起来
    • 浏览器得到域名对应IP地址,同时把IP地址缓存起来
  • 建立TCP连接(三次握手):获取IP地址后,浏览器知道要转发的对象了,此时需要发送HTTP请求报文,这时要先通过TCP的三次握手建立浏览器与服务器间的可靠连接,保证双方都具有可靠的发送与接收能力

  • 浏览器发送HTTP请求:TCP三次握手后,浏览器与服务器间建立可靠连接,浏览器可以发送HTTP请求报文,由于这些报文较大,TCP会将HTTP报文按序号分割成若干报文段并加上TCP首部,分别进行传输。接收方在收到报文段后,按序号以原来顺序重组HTTP报文

    • 负责传输的IP协议:TCP传输报文段时,通过IP协议进行传输,IP协议在传输时,会给报文段添加IP首部封装成IP数据报然后再传输。IP首部包含源IP地址与目标IP地址。
  • 服务器响应请求:服务器收到报文段后,按序号重组一个HTTP请求报文,然后处理并返回一个HTTP响应,HTTP响应的返回过程和HTTP请求一致。

  • 断开TCP连接:浏览器与服务器不需要发送数据,TCP四次挥手断开连接。

  • 浏览器渲染界面:浏览器接收服务器返回的数据包,根据浏览器的渲染机制对数据渲染。

Cookie与Session

Cookie将数据保存在客户端(浏览器),Session将数据保存在服务器。

Session相对来说安全性更高。Cookie常用于我们网站保存账号密码或一些基本信息,Session常用于购物车,在不同页面间跟踪信息。

HTTPS(应用层)

HTTP1.0与HTTP1.1区别

长连接与短连接HTTP1.0默认使用短连接,HTTP1.1默认使用长连接。短链接即每次客户端与服务端进行HTTP操作都要建立连接,任务结束就关闭,开销大。长连接则是在响应头中加入Connection:keep-alive的标识,在规定时间内客户端与服务端的连接都不会关闭。

缓存处理。HTTP1.0主要使用header里的 If-Modified-Since,Expires 来做缓存判断的标准,HTTP1.1引入更多的缓存控制策略如 Entity tag,If-Unmodified-Since,If-Match,If-None-Match 等更多可选择的缓存头来控制缓存策略。

带宽优化及网络连接使用HTTP1.0存在带宽浪费现象,如客户端只需要某对象的部分内容,但服务器却送来了整个对象,并且不支持端点续传功能。HTTP1.1在请求头加入了range头域,它允许只请求某个资源的部分内容,对应返回码206,这样就方便了开发者进行选择,并充分利用带宽和连接。

HTTP与HTTPS的区别

  • 端口:HTTP的URL由 “http://“ 起始,其默认端口是80,HTTPS的URL由 “https://“ 起始,其默认端口是443。

  • 安全性与资源消耗:HTTP协议运行在TCP上,是明文传输,客户端和服务器无法验证对方身份。HTTPS是运行在SSL/TLS上的HTTP协议,SSL/TLS运行在TCP上,所有传输内容是加密过的,采用的是对称加密,但对称加密的密钥对服务器方的证书今次行了非对称加密。

    总结就是HTTP的安全性没有HTTPS高,但HTTPS会比HTTP消耗更多的服务器资源。

对称加密

采用单钥进行加密的方法,同一个密钥可以进行加密与解密。

优点:算法公开,加密速度快、效率高,适合长数据使用。

缺点:密钥传输不安全,易破解,且密钥管理麻烦。

非对称加密

加密与解密时分别使用两个密钥,即加密使用公钥,解密使用私钥。

优点:密钥分配简单,密钥保存量少,安全,即使传输密文被拦截,若只获取公钥,没有私钥时无法破解密文的。

缺点:算法复杂,加密效率低,速度慢。

非对称加密可以保证数据传输过程的安全,因为拦截只能获取部分密钥,无法解密,除非获取一来一回的两个加密密钥。

常用HTTP请求方法

  • GET:从服务器获取请求
  • HEAD:从服务器获取请求首部信息
  • POST:向服务器发送需要处理的数据
  • PUT:将请求的主体存储到服务器上
  • DELETE:从服务器上删除数据
  • TRACE:对可能经过代理服务器传送到服务器的报文进行追踪
  • OPTIONS:决定在服务器上可执行哪些方法