网络相关知识点

网络相关知识点

前言

在日常开发中,是离不开网络的,作为一名iOS开发人员,我们需要具备网络编程的能力。本文会从HTTP协议HTTPS与网络安全、TCP/UDP、DNS解析、Session/Cookie这些方面做些总结。

HTTP

  • 怎样理解HTTP的,里面包含了哪些内容呢
    • 含义:超文本传输协议
    • 下面主要讲:
      • 请求/响应报文
      • 连接建立流程
      • HTTP的特点

请求/响应报文

请求报文

  • 方法:比如常用的GET、POST请求方法

  • URL:请求的地址

响应报文

  • 短语:状态码的描述

  • 当被询问是什么HTTP的时候,我们就需要讲解下请求报文和响应报文的组成结构。

Q:HTTP的请求方式都有哪些?

  • GET、POST、HEAD、PUT、DELETE、OPTIONS 缺:使用场景

Q:GET和POST方式的区别

  • 第一种解答:从请求参数的位置、参数长度的限制、请求安全性来回答。
  • 第二种解答:从语义的角度。
    • 从协议定义规范来回答:
      • GET:获取资源,需要遵从是安全的幂等的可缓存的
      • POST:处理资源,遵从的是非安全的非幂等的不可缓存的
  • 安全性:
    • 不应该引起Server端的任何状态变化 常见的请求方式有:GET、HEAD、OPTIONS
  • 幂等性:
    • 同一个请求方法执行多次和执行一次的效果完全相同
    • 常见的请求方式有:GET、PUT、DELETE
  • 可缓存性:
    • 请求是否可以被缓存
    • 常见的请求方式有:GET、HEAD

状态码

  • 你都了解哪些状态码,他们的含义是什么?
    • 1xx:用于指定客户端应相应的某些动作
    • 2xx:如200,代表响应成功
    • 3xx:如301、302代表发生了网络的重定向
    • 4xx:如401、404表示客户端发起的请求有问题
    • 5xx:如501、502表示Server有异常

连接建立流程

  • 我们思考下,在建立一个HTTP的连接过程当中都有哪些步骤呢,这其中就涉及了TCP的三次握手和四次挥手过程:

  • 三次握手:
    • 客户端发送同步(连接建立)报文到Server端
    • Server端收到请求连接报文后,Server端会返回一个同步ACK的TCP报文
    • 客户端会再次回应一个确认报文
  • 四次挥手:相当于有4次交互
    • 客户端主动发起连接断开,发送一个终止FIN报文到Server端
    • Server端收到终止报文后,Server端会返回一个确认报文(此时由客户端到Server端的连接就断开了)
    • 但是Server端到客户端的方向上可能还会传递数据
    • 所以在某一时机,需要Server端向客户端发送一个终止报文,来断开Server端到客户端方向的连接
    • 最后由客户端给Server端发送一个确认报文
  • 当我们在平时回答TCP建立流程的时候,就可以从3方面来回答
    • 首先,我们需要通过TCP的三次握手来建立连接
    • 其次在这个连接上进行HTTP的请求、响应传递
    • 最后经历TCP的四次挥手来释放连接

HTTP的特点

  • HTTP都有哪些特点呢
    • 无连接:HTTP的连接建立后,会被释放掉
      • 可通过HTTP的持久连接来补偿无连接这个特点
    • 无状态:就是多次发生HTTP的请求的时候,若是同一个用户,对于Server端而言,是不清楚是否为同一个用户的
      • 可通过Cookie/Session技术来补偿这个特点

持久连接

我们来看一下HTTP的非持久连接和持久连接的对比:

  • 那么为什么要提供持久连接方案呢:是为了提升网络请求的效率
  • 持久连接涉及了哪些HTTP头部请求字段呢
    • Connection:keep-alive;表明我们客户端希望采用持久连接
    • time:20;表示我们的持久连接持续多少时间有效
    • max:10;表示这个连接最多可以发送多少个HTTP请求和响应对
  • 还有怎样判断一个持久连接是否结束呢?
    • 可以从两个角度来回答:在响应报文的头部字段会提及:
      • Content-length:1024;表示server端响应数据的大小;若接收到的字节数到达了Content-length的值,则表示这条连接的HTTP请求的响应全部接收完成
      • chunked:比如当我们用POST请求时,server端返回给客户端的数据,往往需要通过多次响应来返回数据的,每次响应都有chunked字段,我们可以通过响应报文的头部字段chunked来判断一个请求是否结束;特点是最后一次请求的chunked会是空的。
  • 另外有一个经常会提及的问题:Charles(查尔斯)抓包原理是怎样的?(中间人攻击)
    • Charles一般用来分析HTTP的请求响应分析的工具
    • 这个问题的本质是:中间人攻击

  • 中间人可以篡改客户端的请求数据
  • 中间人也可以篡改Server的响应数据

HTTPS与网络安全

  • 思考下,HTTPS和HTTP有怎样的区别?
    • 实际上:HTTPS = HTTP + SSL/TLS;HTTPS是有HTTP和SSL/TLS共同组成的
    • HTTPS比HTTP多了安全相关的SSL/TLS
  • 总结:HTTPS是安全的HTTP,他的安全性是由传输层之上,应用层之下的SSL/TLS保证的

  • HTTPS连接建立流程是怎样的?
    • 就是考察他的安全是怎样保障的

  • 我们来解释一下什么事会话秘钥
    • 会话秘钥 = random S + random C + 预主秘钥 (通过相关的算法)
  • HTTPS都使用了哪些加密手段?为什么?
    • 通过上面流程的分析,我们可以得出:
      • 连接建立过程使用了非对称加密;非对称加密很耗时
      • 后续通信过程使用对称加密;减少性能损耗

非对称加密、对称加密

  • 来看下具体流程

  • 非对称加密:若公钥加密,则私钥解密;若私钥加密,则公钥解密。

  • 对称加密:加密解密使用同一个秘钥。

TCP/UDP

TCP/UDP是我们非常需要关注的知识点,下面来看下具体概念:

UDP(用户数据包协议)

  • 我们从UDP的特点和功能两个角度来了解他:
  • 特点:
    • 无连接:我们不需要事先建立好连接,也没有释放连接的过程
    • 尽最大努力交付:就是说UDP是不保证可靠传输的
    • 面向报文:可以理解为既不合并,也不拆分

  • 功能:(实际上也是传输层的基础功能)
    • 复用、分用、差错检测

复用、分用

差错检测:简单了解下思路

TCP(传输控制协议)(重点)

  • 特点: 面向连接可靠传输面向字节流流量控制拥塞控制

面向连接

  • 数据传输开始之前,需要先建立连接
    • 三次握手
  • 数据传输结束之后,需要释放连接
    • 四次挥手
  • Q:为什么要进行三次握手呢?
    • 是为了解决连接建立超时异常的情况;
    • 当客户端发送请求建立连接超时,得不到Server端的响应报文后,会触发超时重传机制; 若重传的连接建立之后,Server端才收到第一次发送的请求报文。Server端会发送响应报文, 若无客户端的确认连接过程,则会出现两条连接; 若有客户端的确认连接过程,超时的连接,客户端是不会想Server端发送确认连接的,过段时间,Server端就会认为这是个超时连接,就不会真的建立连接
  • 四次挥手

  • 建立的连接是全双工的:概念就是双端都可以发送数据;

可靠传输

  • TCP是怎样保证可靠传输的呢?
  • 主要从无差错不丢失不重复按序到达来保证。
    • 通过TCP的停止等待协议来实现的
      • 无差错情况
      • 超时重传
      • 确认丢失
      • 确认迟到

通过滑动窗口协议来解决按序到达的,后面再详细解答

面向字节流

  • 主要看下面的流程:

  • 不管发送方一次性提交给TCP的缓冲是多大的数据,对于TCP本身来说,他会根据实际情况来进行划分,一次发送不同的字节数

流量控制(难点)

  • 是基于滑动窗口协议来实现的

  • 发送窗口的大小:一方面取决于发送方的发送缓存的大小,另一方面取决于接收方的接收窗口大小
  • 当发送窗口值过大,需要接收窗口向TCP协议报文首部修改发送窗口的值,来控制发送发的发送速率。

拥塞控制

  • 关于拥塞控制主要有两个方面的内容:
    • 慢开始、拥塞避免 策略
    • 快恢复、快重传 策略
  • 请简单描述下TCP慢启动的特点
    • 其实就是考察TCP当中拥塞控制的慢开始、拥塞避免的策略。

  • 发生网络拥塞后,需要调整门限值
  • 快恢复、快重传:是指在发生网络拥塞后,从新的门限值进行避免拥塞加法增大,而不是进行慢开始过程

DNS解析

  • 了解DNS解析么?
  • 域名到IP地址的映射,DNS解析请求采用UDP数据报,且明文传输

  • DNS解析查询方式
    • 递归查询:我去给你问一下
    • 迭代查询:我告诉你谁可能知道

  • DNS解析都存在哪些问题呢?(重要)
    • DNS劫持问题
    • DNS解析转发问题
  • Q:DNS劫持问题简单说明一下

  • 描述:客户端想DNS服务器查询某域名的IP地址,但是DNS解析请求采用UDP数据报,且明文传输的;这会存在窃听的可能,假如有一个钓鱼DNS服务器,就会劫持我们的DNS请求,然后返回我们错误的IP,进而我们访问的就是错误的Server端。

  • 怎样解决DNS劫持?
  • 有两种方案:
    • httpDNS:使用HTTP协议进行请求
    • 长连接

  • DNS劫持与HTTP的关系是怎样的?
  • 答案:没有关系
    • DNS解析时发生在HTTP建立连接之前的
    • DNS解析请求使用的是UDP数据报
  • DNS的解析转发问题

  • 小的DNS服务商为了节约资源,向其他DNS服务商发送解析请求
  • 可能会造成跨网访问,效率变慢的问题

Session/Cookie

  • 这两种方案都是对HTTP协议无状态特点的补偿,解决方案

  • 概念:Cookie主要用来记录用户状态,区分用户;状态保存在客户端

  • 生成Cookie:

  • 客户端:发送的Cookie在HTTP请求报文的Cookie首部字段中
  • 服务器端:设置http响应报文的Set-Cookie首部字段

  • 怎样修改Cookie呢?
    • 新Cookie覆盖旧Cookie
    • 覆盖规则:name、path、domain等需要与原Cookie一致
  • 怎样删除Cookie
    • 也是新Cookie覆盖旧Cookie
    • 覆盖规则也一样:name、path、domain等需要与原Cookie一致
    • 实际上可以设置Cookie的expires=过去的一个时间点或者maxAge=0,来删除
  • 怎样保证Cookie的安全?(3种方案)
    • 对Cookie进行加密处理
    • 只在https上携带Cookie
    • 设置Cookie为httpOnly,防止跨站脚本攻击

Session

  • 概念:Session也是用来记录用户状态,区分用户;状态保存在服务器端

  • Session和Cookie的区别?(存放位置不同)

  • Session和Cookie的关系是怎样的?
    • Session需要依赖Cookie机制(需要用到Cookie和Set-Cookie两个头部字段)
  • Session的工作流程

总结

  • HTTP中的GET和POST方式有什么区别?(从语义的角度:安全、幂等、可缓存)
  • HTTPS连接建立流程是怎样的?
  • TCP和UDP有什么区别?(特点和功能来回答)
  • 请简述TCP的慢开始过程?(从拥塞控制来回答)
  • 客户端怎样避免DNS劫持?(httpDNS、长连接)

最后

如果对大家有帮助,请github上follow和star,本文发布在戴超的技术博客,转载请注明出处

Loading Disqus comments...
Table of Contents