计算机网络


  • HTTP
  • 请求报文
    • 请求行 方法、URL、HTTP版本
    • 请求头(请求首部)
      • Cookie
      • Cache-control:HTTP/1.1的产物,优先级高于Expires,可以在请求头或响应头设置,多种指令如下
        • public 可以被客户端和代理服务器缓存
        • private 只可以被客户端缓存
        • no-store 不缓存任何响应
        • no-cache 资源被缓存但立即失效,下次请求会验证资源是否过期
      • If-None-Match :将当前的Etag发送给服务器
      • If-Modified-Since :会将Last-Modified 的值发送给服务器
    • 空行
    • 请求体
  • 响应报文
    • 响应行 HTTP版本、状态码、状态码含义
    • 响应头(响应首部)
      • Expires:HTTP/1.0 的产物,受限于本地时间,如果修改了本地时间,可能会造成缓存失败
      • Etag HTTP/1.1出现
      • Last-Modified
      • Cache-control
      • Content-Security-Policy(CSP)
    • 空行
    • 响应体
  • HTTP 方法
    • GET 获取资源
    • POST 传输资源
    • PUT 更新资源
    • DELETE 删除资源
    • HEAD 获取报文首部
  • HTTP状态码

    • 1xx 提示信息——表示请求已接收,继续处理

    • 2xx 成功——表示请求已被成功接收

      • 200 OK,表示从客户端发来的请求在服务器端被正确处理
      • 204 No content,表示请求成功,但响应报文不含实体的主体部分

      • 206 Partial Content,进行范围请求

    • 3xx 重定向——要求请求必须进行更进一步的操作

      • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
      • 302 found,临时性重定向,表示资源临时被分配了新的 URL
      • 304 not modified,表示服务器允许访问资源
    • 4xx 客户端错误——请求有语法错误或者请求无法实现

      • 400 bad request,请求报文存在语法错误
      • 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
      • 403 forbidden,表示对请求资源的访问被服务器拒绝
      • 404 not found,表示在服务器上没有找到请求的资源
    • 5xx 服务端错误——服务器未能实现合法请求

      • 500 internal sever error,表示服务器端在执行请求时发生了错误
      • 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
  • 什么是持久连接

    • 在同一个TCP的连接中可传送多个HTTP请求 & 响应。应用于在请求访问 HTML 页面资源,还要请求图片资源。
  • 什么是管线化
    • 将多个HTTP请求整批发送,在发送过程中不用等待对方响应
    • 只有GET和HEAD请求可以进行管线化,而POST则有所限制。
  • get 和 post 区别
    • GET在浏览器回退时是无害的,而POST会再次提交请求。
    • GET产生的URL地址可以被加入到书签,而POST不可以。
    • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST没有。
    • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。
    • 大多数浏览器通常都会限制url长度在2K个字节,而大多数服务器最多处理64K大小的url。
  • HTTPS
  • 密码学基础
    • 对称加密:又称私钥加密,即发送方和接收方使用同一个密钥去加密和解密数据。特点是算法公开,加密解密速度快。
    • 非对称加密:又称公钥加密。加密使用一对密钥,即公钥和私钥,二者成对出现。用公钥或者私钥中的任何一个进行加密,则用另一个进行解密。优点是安全性较高,缺点是加密和解密耗时长,速度慢,只适合对少量数据进行加密。
  • HTTPS传输
    • SSL:全称是Secure Sockets Layer,即安全套接层协议。
    • TLS:全称是Transport Layer Security ,即安全传输层协议。
    • HTTPS为了兼顾安全和效率,采用混合加密机制,同时使用了对称加密和非对称加密。对数据进行对称加密,数据对称加密所需要的私钥通过非对称加密传输。
    • 需要用SSL/TLS对数据进行加密和解密,用HTTP对加密后的数据进行传输。
    • 涉及到三个密钥:客户端生成的随机密钥,用来进行对称加密。服务器端的公钥和私钥,用来进行非对称加密。
    • 一个HTTPS请求实际上包含了两次HTTP传输,大致分为7步
      • 1.客户端向服务端发起HTTPS请求,连接到服务器的443端口(客户端发起HTTPS请求,请求公钥)
      • 2.服务端返回证书(传送证书)
      • 3.客户端验证证书的合法性,如合法,那么客户端会生成一个随机值,这个随机值就是用于对称加密的私钥,称之为客户端密钥。然后利用服务器端的公钥对客户端私钥进行非对称加密,这样客户端密钥就变成密文了。至此,第一次HTTP请求结束(客户端验证证书,生成随机对称密钥,并对对称密钥进行加密)
      • 4.客户端会发起HTTPS中的第二次HTTP请求,将加密后的客户端密钥发送给服务器(客户端传送客户端密钥)
      • 5.服务器接收到客户端发来的密文,利用自己独有的服务端私钥对密文进行非对称解密,得到客户端私钥。然后利用客户端私钥对数据进行对称加密,这样数据就变成密文(服务器端解密客户端密钥)
      • 6.服务器将加密后的密文发送给客户端(服务器端传送加密数据)
      • 7.客户端收到服务器发送来的密文,利用客户端私钥对其进行对称解密,得到服务器发送过来的数据。这样,整个HTTPS传输完成(客户端解密加密数据)
    • 证书
      • 数字证书:原始信息+数字签名
      • 数字签名:原始信息(申请人的公钥、个人信息、其他信息等)经过Hash算法处理变为消息摘要,摘要经过CA的私钥加密变为数字签名
      • 验证证书(实质上是验证两个摘要是否相同)
        • 证书上的原始信息在客户端经过Hash算法处理变为消息摘要
        • 数字签名被客户端利用CA的公钥解密,得到CA创建的消息摘要
        • 验证两个信息摘要是否相同
  • HTTP 2.0
  • 概念

    • 帧——HTTP 2.0 通信的最小单元,以二进制传输代替原本的明文传输,有一个固定9字节的头部和一个指定长度的负载。sid(Stream Identifier) 31位,用作流控制,标明这一帧属于哪个流。Type 8位 定义了frame的类型。
    • 消息:一个完整的帧序列,它映射到逻辑的请求和响应消息
    • 流——已建立的TCP连接上的双向字节流,可以承载一个或多个消息
  • 线头堵塞

    • 每个TCP连接同时只能处理一个请求—响应,浏览器按FIFO原则处理请求,如果上一个响应没返回,后续请求—响应都会受阻。
    • 管线化的问题:第一个响应慢会阻塞后续响应,服务器为了按序返回响应,则需要缓存多个响应,占用更多的资源
  • 优点

    • 多路复用

    ​ HTTP2采用二进制格式传输,取代了HTTP1.x的文本格式,二进制格式解析更高效。
    ​ 多路复用代替了HTTP1.x的序列和阻塞机制,所有的相同域名请求都通过同一个TCP连接并发完 成。在HTTP1.x中,并发多个请求需要多个TCP连接,浏览器为了控制资源会有6-8个TCP连接都限制。
    ​ HTTP2中

    • 同域名下所有通信都在单个连接上完成,消除了因多个 TCP 连接而带来的延时和内存消耗。
    • 单个连接上可以并行交错的请求和响应,之间互不干扰

    • 服务器推送:推送额外的资源,而不需要客户端明确请求每一个资源

    • 头部压缩:HTTP/1.x版本中,元数据始终以纯文本形式发送,如果再使用HTTP cookie,那么头部体积将会变得很重。HTTP/2.0 使用HPACK压缩了头部

    • 二进制分帧层

TCP/IP
  • TCP的三次握手和四次挥手

    • 三次握手
      • 客户端——发送带有SYN标志的数据包–一次握手–服务端
      • 服务端——发送带有SYN/ACK标志的数据包–二次握手–客户端
      • 客户端——发送带有ACK标志的数据包–三次握手–服务端
    • 四次挥手
      • 客户端——发送一个FIN,用来关闭客户端到服务器的数据传送
      • 服务器——收到这个FIN,它发回一个ACK,确认序号为收到的序号加1 。和SYN一样,一个FIN将占用一个序号
      • 服务器——关闭与客户端的连接,发送一个FIN给客户端
      • 客户端——发回ACK报文确认,并将确认序号设置为收到序号加1
  • TCP和UDP的区别

    1.连接性:TCP面向连接;UDP是无连接的。(TCP需要三次握手,而UDP不需要握手)

    2.可靠性:TCP提供可靠的服务;UDP尽最大努力交付,即不保证可靠交付。(通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP则可能出现丢包,不保证顺序到达)

    3.面向对象:TCP面向字节流;UDP是面向报文的。( 面向报文的是指发送方的UDP对应用层交下来的数据报文,不合并不拆分,只是在其上面加上首部后就交给了下面的网络层。)。
    【 举个例子:
    发送方使用TCP协议先发送 100个字节的包1,再发送10个字节的包2;等待2秒后,接收方只需要接收一次就能能将数据(110字节)接收下来。
    发送方使用UDP协议先发送 100个字节的包1,再发送10个字节的包2;等待2秒后,接收方必须要接收两次才能将包1(100字节)和包2(10字节)分别接收。】

    4.差错拥塞控制:UDP没有差错和拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。(TCP拥塞控制,当另一端出现阻塞时,会降低发送速率)。

    5.系统开销:TCP首部开销20字节(具有报文段序号,应答序号,窗口大小等);UDP的首部开销小,只有8个字节(2个字节的源端口,2个字节的目的端口,2个字节的报文长度,2个字节的校验和)。

    6.信道:TCP的逻辑通信信道是全双工的可靠信道,即可以流入也可以流出的信道;UDP则是不可靠信道。

    7.有序性:TCP是有序的字节流;UDP则是无序的。(这是由于tcp头部存在报文段的序号,而udp没有)

  • ARP((Address Resolution Protocol 地址解析协议) 用于实现从 IP 地址到 MAC (Media Access Control 媒体访问控制)地址的映射,即询问目标IP对应的MAC地址,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响应。
  • IP地址指明了是哪个局域网,MAC地址指明了指定局域网下某台设备的地址。

  • 以太网协议解决了局域网的点对点通信,但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。

  • IP 协议可以连接多个局域网。路由器就是基于 IP 协议。局域网之间要靠路由器连接。

  • 为什么要等待2MSL( Maximum Segment Lifetime 报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间) ?客户端在发送完 ACK 后,会等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那么客户端也可以关闭连接

    • 保证TCP协议的全双工连接能够可靠关闭
      • 特殊情况,因为IP协议的不可靠性或者是其它网络原因,导致服务器端没有收到客户端最后回复的ACK。那么服务器端就会在超时之后继续发送FIN,如果客户端等待2MSL,则还可以接收到FIN。
    • 保证这次连接的重复数据段从网络中消失(确保迟来的数据报能被识别并丢弃)
      • 假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达服务器端,由于新连接和老连接的端口号是一样的,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。
  • TCP流量控制

    • 流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收,利用滑动窗口机制
    • 滑动窗口分为四个窗口:已发送并被确认,已发送未被确认、可发送、不可发送
  • TCP拥塞控制

    • 包括四部分
      • 慢启动
        • 发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。为了防止拥塞窗口过大引起网络拥塞,我们需要设置一个慢开始门限 ssthreth 状态变量。
        • 先将拥塞窗口 cwnd 设置为一个最大报文段MSS的数值,MSS开始默认为1
        • 在每收到一个对新的报文段的确认后,将拥塞窗口增加至多一个 MSS (Maximum Segment Size)的数值。 [指数增长] 比如 1 1+1=2 2+2=4 4+4=8
        • 慢启动的“慢”并不是指 cwnd 增长速率慢而是说在TCP开始发送报文时,先设置cwnd=1,使发送端开始时只发送一个报文段进行探测。
      • 拥塞避免
        • 当 cwnd > ssthreth 时,即拥塞窗口大于慢开始门限时,每经过一个往返时间RTT(Round-Trip Time)就使cwnd+1 [ 线性增长 ]
        • 当发生网络拥塞时,将出现拥塞时的发送方窗口值减半 ( 乘法减小) 设置为慢开始的新门限值ssthreth ,然后设置 cwnd=1,开始执行慢启动算法
      • 快重传
        • 发送端只要一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段,不必等待报文段的重传计时器到期
      • 快恢复
        • 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,将当时的发送窗口减半作为慢开始的新门限值。但是接下去并不执行慢开始算法(即不设置 cwnd=1),而是执行拥塞避免算法( cwnd = ssthresh )