HTTP
超文本传输协议
- 请求报文
我们来看一下请求报文的格式,首先是请求行,请求行包括方法、URL、协议文本,方法常见的有GET/POST,URL就是我们的请求地址,协议文本一般是HTTP1.1版本
然后再看一下请求头,头部字段都是以key:value的形式组合在一起的,由多个首部字段名构成首部字段区域
之后是我们的实体主体,一般在GET请求中没有实体主体,而在POST请求中一般会带有实体主体
- 响应报文
首先是版本,然后是状态码,还有状态码的描述,我们称之为短语,然后下面跟请求报文一致,由此组成响应报文
HTTP的请求方式
- GET
- POST
- HEAD
- PUT
- DELETE
- OPTIONS
GET和POST方式的区别
一般大家都知道的是:
- GET请求参数是以?分割拼接到URL后面的,POST请求参数实在Body里面的
- GET参数长度限制2048个字符,POST一般没有该限制
- GET请求不太安全,POST请求比较安全
但是从语义的角度来比较的话,是这样的:
- GET:获取资源,是安全的、幂等的、可缓存的
- POST:处理资源,是非安全的、非幂等的、不可缓存的
对应的解释
1、安全性:不应该引起Server端的任何状态变化,比如说我们用GET请求多次去Server端去获取数据,不会引起Server的一个状态变化,安全性的请求包括:GET、HEAD、OPTIONS
2、幂等性:同一个请求方法执行多次和执行一次的效果完全相同,比如说我们用GET请求多次去Server端去获取数据,执行的效果是完全相同的,这里需要注意的是执行的效果,幂等性的请求包括:GET、PUT、DELETE
3、可缓存性:请求是否可缓存,我们一般在发起一个HTTP请求的过程中,传递的链路我们是不确定的,虽然说实在一条TCP连接上,但是网络路径在接触或者通过网关包括一些代理到达我们的Server端,在这上面会涉及到方方面面的内容,往往对于一些代理服务器会有缓存,而这种缓存性是官方的一种规范,即可以遵守也可以不遵守,大多数情况会遵守,所以在GET请求会有相对应的缓存,可缓存性的请求包括:GET、HEAD
状态码
1XX:通知
2XX:成功
3XX:重定向
4XX:客户端错误
5XX:服务端错误
连接建立流程
三次握手
- 首先是客户端发送一个SYN的请求报文给服务端,请求建立连接
- 当服务端收到报文后,服务端会返回给客户端一个同步ACK的报文
- 当客户端收到报文后,会返回给服务端一个ACK报文,完成三次握手
四次挥手
- 如果是客户端发起主动断开,客户端会发送一个FIN终止报文给服务端
- 服务端会返回给客户端一个ACK确认报文,这时客户端与服务端的连接就断开了,但是服务端到客户端这个方向,可能还会传递数据,在一个合适时机,服务端会向客户端请求断开连接
- 服务端想要断开连接的时候,会向客户端发送FIN终止报文
- 然后客户端会回给服务端一个确认报文,此时完成服务端与客户端的连接断开
HTTP的特点
- 无连接,补偿方案为HTTP的持久连接
- 无状态,补偿方案为Cookie/Session
HTTPS与网络安全
HTTPS = HTTP + SSL/TLS
HTTPS就是在原有HTTP基础上,在应用层下面,传输层上面插入了一个SSL/TLS协议中间层,为我们实现一个安全的网络机制,也就是说HTTPS是安全的HTTP
HTTPS连接建立流程
- 首先由客户端向服务端发送一个报文,这个报文包括三部分,一个是客户端支持的TLS版本,客户端支持的加密算法,以及一个随机数C
- 然后服务端返回一个握手报文消息,包括一个商定的加密算法,随机数S还有一个服务端的证书
- 客户端收到这条报文后,首先会验证证书,之后会组装会话秘钥,这个秘钥主要通过前面的随机数C和随机数S以及一个预主秘钥进行会话秘钥的组装
- 然后客户端会通过服务端的公钥对预主秘钥进行加密传输,之后服务端通过私钥解密得到预主秘钥,最后服务端会通过前面的随机数C、随机数S以及解密得到的预主秘钥组装会话秘钥
- 之后再由客户端向服务端发送一个加密的握手消息,服务端发送一个加密的握手消息,来验证是否加密完成
TCP/UDP
传输层协议
TCP:传输控制协议
UDP:用户数据报协议
UDP(用户数据报协议)
特点:
1、无连接
2、尽最大努力交付
3、面向报文,既不合并,也不拆分
功能包括:
1、复用
2、分用
3、差错检测
TCP(传输控制协议)
特点:
1、面向连接
2、可靠传输(无差错,不丢失,不重复,按序到达)
3、面向字节流
4、流量控制
5、拥塞控制
DNS解析
域名到IP地址的映射,DNS解析请求是采用UDP数据报,且明文
DNS解析查询方式
- 递归查询 (一层一层的查询)
- 迭代查询 (返回结果找对应查询)
DNS劫持问题
当客户端发送域名去DNS服务器去查询时,由于是UDP数据包并且明文,就会被窃听,这时如果有一个钓鱼服务器劫持了这次查询,返回给你一个错误的IP,这时你就会访问到一个错误的网页
这里还需要注意一个点:就是DNS劫持和HTTP是完全没有关系的,因为DNS解析是发生在HTTP建立连接之前,并且DNS解析请求使用的事UDP数据报,端口号53
那么如何解决DNS劫持问题呢?
- httpDNS:DNS解析请求使用的事UDP数据报,端口号53,解决方案是使用HTTP协议向DNS服务器的80端口进行请求,不会产生正常的DNS解析,也就不会出现DNS的劫持问题
- 长连接:在客户端和服务端之间建立一个长连服务,也就是一个代理服务器,在客户端和代理服务器之前建立长连通道,然后再代理服务器和服务端之间通过内网专线进行内网DNS解析,然后进行请求
DNS解析转发问题
简单一句话,就是我们客户端发送请求时,我们的DNS服务器可能为了节省资源等原因,会转发给其他的DNS服务器,会出现跨网访问,可能会慢一点
Session/Cookie
HTTP协议无状态特点的补偿
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的安全性
- 对Cookie进行加密处理
- 只在https上携带Cookie
- 设置Cookie为httpOnly,防止跨站脚本攻击
Session
也是用来记录用户状态,区分用户;状态保存在服务端 Session需要依赖于Cookie机制
至此iOS基础相关的内容暂时告一段落,写的可能并不是特别详细,也会有很多的瑕疵,也多谢各位对文章问题的指出,接下来会写一些数据结构与算法相关的内容,届时希望大家可以共同探讨,共同进步
iOS探索系列
iOS探索:UI视图之事件传递&视图响应
iOS探索:UI视图之卡顿、掉帧及绘制原理
iOS探索:Runtime之基本数据结构
iOS探索:Runtime之消息转发及动态添加方法
iOS探索:Block解析浅谈
iOS探索:RunLoop本质、数据结构以及常驻线程实现
iOS探索:网络相关