网络相关知识点
网络相关知识点
前言
在日常开发中,是离不开网络的,作为一名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:处理资源,遵从的是
非安全的
、非幂等的
、不可缓存的
- GET:获取资源,需要遵从是
- 从协议定义规范来回答:
- 安全性:
- 不应该引起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的
- 无状态:就是多次发生HTTP的请求的时候,若是同一个用户,对于Server端而言,是不清楚是否为同一个用户的
- 可通过Cookie/Session技术来补偿这个特点
- 无连接:HTTP的连接建立后,会被释放掉
持久连接
我们来看一下HTTP的非持久连接和持久连接的对比:
- 那么为什么要提供持久连接方案呢:是为了提升网络请求的效率
- 持久连接涉及了哪些HTTP头部请求字段呢
- Connection:keep-alive;表明我们客户端希望采用持久连接
- time:20;表示我们的持久连接持续多少时间有效
- max:10;表示这个连接最多可以发送多少个HTTP请求和响应对
- 还有怎样判断一个持久连接是否结束呢?
- 可以从两个角度来回答:在响应报文的头部字段会提及:
- Content-length:1024;表示server端响应数据的大小;若接收到的字节数到达了
Content-length
的值,则表示这条连接的HTTP请求的响应全部接收完成 - chunked:比如当我们用POST请求时,server端返回给客户端的数据,往往需要通过多次响应来返回数据的,每次响应都有chunked字段,我们可以通过响应报文的头部字段
chunked
来判断一个请求是否结束;特点是最后一次请求的chunked
会是空的。
- Content-length:1024;表示server端响应数据的大小;若接收到的字节数到达了
- 可以从两个角度来回答:在响应报文的头部字段会提及:
- 另外有一个经常会提及的问题: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慢启动的特点
- 其实就是考察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:
- 客户端:发送的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,本文发布在戴超的技术博客,转载请注明出处