HTTP通信过程
HTTP协议
HTTP即:超文本传输协议
有关HTTP,主要介绍以下三点:
- 请求/响应报文
- 连接建立流程
- HTTP的特点
请求/响应报文
问:HTTP的请求方式都有哪些?(被问过)
GET:请求指定的页面信息,并返回实体主体。请求会显示请求指定的资源。
POST:POST请求会 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法可能会创建新的资源或/和修改现有资源。
HEAD:HEAD方法与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
PUT:PUT将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。
DELETE:请求服务器删除指定的页面
OPTIONS:OPTIONS请求与HEAD类似,一般也是用于客户端查看服务器的性能。
TRACE:请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断。
OPTIONS 和 TRACE 一般用于调试,多数线上服务都不支持。
问:POST和PUT的区别?
- 语义不同:PUT 请求通常用于
更新或替换
服务器上的资源,而 POST 请求通常用于创建新的资源或提交数据
到服务器进行处理。 - 客户端发送的数据不同:PUT 请求需要客户端发送
完整
的资源内容,而 POST 请求可以只发送部分
资源内容。 - 响应不同:PUT 请求成功后通常返回 200 OK 状态码,而 POST 请求成功后通常返回 201 Created 状态码,并返回表示新资源的 URI。
- 幂等性不同:PUT 请求具有
幂等
性,即执行多次 PUT 请求的结果应该相同,而 POST 请求不具有幂等性
。
问:GET和POST请求方式的区别?
初级:
GET请求参数是以?分割,拼接到URL后面,POST请求参数在Body里面
GET参数长度限制在2048个字符(2K),POST一般没有该限制
GET请求不安全,POST请求比较安全
中高级:
从语义的角度来回答
语义:协议的定义规范
语法:具体实现的手法或者路径
安全性
不应该引起Server端的任何状态变化
常见的安全性请求方式有:GET HEAD OPTIONS
幂等性
同一个请求方法执行多次和执行一次的效果完全相同
常见的幂等性请求方式有:GET PUT DELETE
可缓存性
请求是否可以被缓存
常见的可缓存性请求方式有:GET HEAD
状态码
问:你都了解哪些状态码?他们的含义是什么?(被问过)
有1 2 3 4 5开头的不同状态
2开头的响应成功
4开头的一般与客户端有关
5开头的一般与服务端有关
简单列举几个常用的:
200 OK 请求成功。一般用于GET与POST请求
400 Bad Request 客户端请求的语法错误,服务器无法理解 或者 请求参数有误
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。
500 Internal Server Error 服务器内部错误,无法完成请求
连接建立流程
SYN(synchronous建立连接)
ACK(acknowledgement 确认连接)
FIN(finish结束连接)
大致分为三大模块:
建立连接:三次握手
传输数据:请求、响应
断开连接:四次挥手
HTTP的特点
- 无连接:HTTP的持久连接方式
- 无状态:Cookie/Session
持久连接
左边是非持久连接,每次请求数据需要 建立连接-传输数据-断开连接
右边是持久连接,在建立连接后的某一个时间段内,可以持续传输数据
持久连接相比非持久连接,会提高数据传输的效率。因为它不需要每次去通过三次握手建立连接和四次挥手断开连接。
time:持久连接能持续多久有效
max:这条连接最多可以允许多少条数据重用
问:怎么判断一个请求是否结束的?
就是,如何在持久连接中区分,前一个请求结束了,后一个请求开始了。
通过Content-length字段判断
在客户端向服务端请求数据后,服务端向客户端响应的时候,会传输一个Content-length字段,假如Content-length = 1024,那么,客户端检测到接收的数据已经达到Content-length长度(比如1024),则说明此次HTTP响应接收完毕。
还有一种情况:
当客户端通过POST请求向服务端请求数据,可能服务端需要多次响应,给客户端传输数据。
可以在响应字段中,通过chunked(将……分成数份)字段做标识。在最后一个响应中,chunked = 0,代表此处响应结束。
Charles抓包原理是怎样的?
Charles 花瓶图标
Wireshark 鲨鱼
利用HTTP的中间人攻击
中间人攻击,可以将客户端的请求参数进行修改;
还可以将服务端响应的数据进行修改。
iOS如何防止被抓包?
方法一:
通过检查手机有没有开代理来判断用户有没有抓包,如果开了代理的话就禁止任何网络传输
但是这种方法的缺陷在于,如果用户手机不是在抓包,而是仅开了 VPN 的话,这个方法会认为开代理从而不能正常使用我们的 App,容易误伤,所以并不是太完美。
方法二:
将服务端的公钥证书
放在客户端内,强制客户端验证与其通信的是否为服务端
具体有两种做法:
一种是证书锁定(Certificate Pinning)
缺点:公钥证书是会到期的,服务端需要差不多每年都更新自己的证书,客户端也需要记得更新证书这个事儿,因为公钥证书过期之后客户端就没有办法发起请求了。
还有一种是公钥锁定(Public Key Pinning)
证书的内容其实就是公钥、机构信息和签名。我们验证证书链的时候用到的就是公钥,本质上并不需要别的东西,所以我们只需要将公钥内置到我们的应用里,这样校验证书的时候我们用公钥去解密数据,然后和证书内置签名数据比较,结果一致我们就认为证书是有效的。
同时证书升级,本质上公钥是不变的,我们就可以不需要操心过期的问题。
但是注意有的公司服务端是申请全新证书的,所以公钥变了。这个需要注意📢
HTTPS与网络安全
问:HTTPS与HTTP有什么区别?(被问过)
1. 安全性差异
- HTTP (HyperText Transfer Protocol) 是一个不安全的网络传输协议,它以明文方式发送数据,这意味着数据在传输过程中可以被中间人攻击者读取或修改。
- HTTPS (HTTP Secure) 是HTTP的安全版本,它在HTTP的基础上通过SSL/TLS协议加密数据传输,提高了数据的安全性。这使得HTTPS在数据传输过程中能防止被窃听、篡改及伪造。
2. 端口
- HTTP默认使用端口80,而HTTPS默认使用端口443。
3. 性能
- 由于加密和解密数据需要计算资源,HTTPS在性能上通常比HTTP稍慢。但是随着现代计算能力的提升和优化,这种差距已经变得较小。
4. 使用场景
- HTTP常用于不涉及敏感信息的网站浏览,例如阅读新闻或查看非个人化的信息。
- HTTPS则广泛用于需要保护数据安全的场景,如在线购物、金融服务和任何形式的个人数据交换。
5. SSL/TLS证书
- HTTPS需要使用SSL/TLS证书来建立安全连接。这些证书由证书颁发机构(CA)颁发,不仅加密数据,还可以验证网站的身份,增加用户信任。
综上:
HTTP和HTTPS的主要区别在于安全性。HTTP不加密传输的数据,而HTTPS通过SSL/TLS加密传输,保证了数据的安全性。此外,HTTPS使用443端口,而HTTP使用80端口。虽然HTTPS在性能上可能略有下降,但随着技术进步,这种差异已经减少。今天,鉴于网络安全的重要性,许多网站都默认使用HTTPS来保护用户数据。
HTTPS = HTTP + SSL/TLS
七层网络模型
五层网络模型
TCP/UDP
Socket
问:HTTPS建立连接流程是怎样的?
注意,是HTTPS,需要回答出问安全性相关知识
问:HTTPS都使用了哪些加密手段?为什么?
建立连接过程使用非对称加密,非对称加密很耗时(保证安全)
后续的数据传输通信过程使用对称加密
什么是非对称加密?
一般在客户端使用公钥,服务端使用私钥
私钥不通过网络传输,从而保证信息的安全性
对称加密,使用的是同一把秘钥,有可能会在网络传输中,被中间人攻击,拿到秘钥,从而破解。
即使秘钥不通过网络传输,而写在客户端,也可能被逆向破解,拿到存储在客户端的秘钥。
所以,在安全性上,非对称加密比对称加密会好很多。
TCP/UDP(重点)
TCP/UDP是传输层的
TCP,传输控制协议
UDP,用户数据报协议
UDP(用户数据报协议)
特点:
无连接、尽最大努力交付(不保证可靠传输)、面向报文
功能:
复用、分用、差错检查
复用、分用
每个应用有自己专门的端口号
复用是指:不同的端口号,可以通过同一个UDP到IP地址,再经过物流层传输,将数据传输出去。
分用是指:传输来的数据,可以通过IP地址,和UDP传输到不同的端口号
差错检测
TCP(传输控制协议)
特点
面向连接、可靠传输、面向字节流、流量控制、拥塞控制
面向连接
数据传输开始之前,需要建立连接:三次握手
数据传输结束之后,需要释放连接:四次挥手
三次握手
问:建立连接为何需要三次握手,两次可以吗?
如果只有两次握手:
假如客户端向服务端第一次发送的1.SYN发生了超时
超时一段时间后,客户端启动超时重传策略,重新发送1.SYN
假如此次传输的1.SYN被服务端接收到,那么,服务端给客户端传输2.SYN和ACK,两次握手建立完成。
而此时,第一个发送的1.SYN终于被服务端接收到了,那么,服务端会将这次的1.SYN当做一个新的连接请求,相当于客户端向服务端发送了两次连接。
三次握手为何能解决这个问题?
还是假如客户端向服务端第一次发送的1.SYN发生了超时
超时一段时间后,客户端启动超时重传策略,重新发送1.SYN
假如此次传输的1.SYN被服务端接收到,那么,服务端给客户端传输2.SYN和ACK。
然后,客户端给服务端传输一个ACK,三次握手建立连接成功。
而此时,第一个发送的1.SYN终于被服务端接收到了,那么,服务端会将这次的1.SYN当做一个新的连接请求,发送给客户端。而客户端拿到服务端的ACK一看,这个我已经接收过了,不需要建立连接,就不再给服务端发送ACK。在一段时间后,服务端没有接收到客户端的ACK,那么,三次握手没有完成,也就是连接没有建立。
四次挥手
问:断开连接为何需要涉及到两方面的断开?
由于建立的连接是全双通的,也就是客户端可以向服务端发送数据;服务端也可以向客户端发送数据。因此,需要两边都将自己关闭。
为何是四次挥手?
第1次挥手由客户端向服务端发起,服务端收到信息后就能确定客户端已经停止发送数据。
第2次挥手由服务端向客户端发起,客户端收到消息后就能确定服务端已经知道客户端不会再发送数据。
第3次握手由服务端向客户端发起,客户端收到消息后就能确定服务端已经停止发送数据。
第4次挥手由客户端向服务端发起,服务端收到信息后就能确定客户端已经知道服务端不会再发送数据。
为什么不是3次挥手?
在客服端第1次挥手时,服务端可能还在发送数据。
所以第2次挥手和第3次挥手不能合并。
可靠传输
问:TCP怎样保证可靠传输的?
主要是从四方面:
无差错、不丢失、不重复、按序到达
可靠传输,在TCP层面,是通过停止等待协议来实现的
停止等待协议
无差错情况、超时重传、确认丢失、确认迟到
面向字节流
发送方发送数据,接收方接收数据
在发送方给TCP后,TCP有一个缓冲区
在TCP连接接收到数据后,TCP也有一个缓冲区
TCP的缓冲区,由TCP自己掌握
比如,发送方发了14 13两个数据,而TCP可能先缓冲进去,不进行发送。而是发送之前接收到的数据12 11 10
等到发送14 13的时候,虽然接收是一个一个接收的,但是有可能TCP将数据进行整合,以一个报文发送出去。
也有可能,发送数据量太大,TCP分两次才将数据发送出去。
也就是,不管发送方发送的数据量是多大,或者多小。TCP会根据实际情况,将数据重新进行整合,然后传输。
这,就是面向字节流
流量控制
基于滑动窗口协议来实现的
什么是滑动窗口协议?
发送窗口在发送缓存之中
接收窗口在接收缓存之中
接收窗口可以动态调整发送方的发送窗口大小
比如,接收方是服务端,现在服务端有点忙,接收不了太多数据,那么,接收窗口会调整,从而动态调整发送方的发送窗口,从而使得发送方的发送窗口变小,发送数据变小。
拥塞控制
有两个策略:
慢开始、拥塞避免
快恢复、快重传
问:请描述TCP的慢启动特点
慢开始、慢启动
一开始,发送1个,没事,再发送2个,再发送4个,8个指数级增长。
到达门限初始值16的时候,不再指数增长,改为线性增长。
线性增长一段时间后,发生了网络拥堵,则发送直接从1开始
再次指数增长,但,门限初始值设置为发送网络拥堵值的1/2
到达门限初始值后,再次进行线性增长。
这就是TCP的慢开始、慢启动特点。
DNS解析
问:你了解DNS解析吗?DNS解析的过程是怎样的?
简单来说,你搜索www.baidu.com,其实你不能够直接找到这个地址的。
你需要通过DNS服务器查询,找到www.baidu.com对应的IP地址,然后根据IP地址,查找到对应的真正地址。
问:DNS解析的查询方式有哪些?
递归查询
迭代查询
递归查询:
在递归查询中,当设备(例如电脑或者手机)向DNS服务器发起一个DNS查询请求时,如果该服务器无法直接返回查询结果,它会接着向其他的DNS服务器查询,直到获得结果再一并返回给您的设备。在这个过程中,您的设备只需要等待最终结果,而不需要关心具体的查询过程。
客户端——>本地DNS服务器——>根服务器——>顶级域服务器(.com服务器)——>权威服务器
迭代查询:
迭代查询的过程中,当设备向DNS服务器发起查询请求,如果该服务器无法直接返回查询结果,它就会返回一个能够继续查询的服务器地址给您的设备,然后设备会继续向这个地址发送新的查询请求,这样的过程重复进行直到找到结果为止。
客户端——>本地DNS服务器——>客户端——>根服务器——>客户端——>顶级域服务器——>客户端——>权威服务器
根本区别在于:递归查询把解决问题的任务全部委托给服务器;而迭代查询则是客户端自己在不同的服务器间跳转查询。
问:DNS解析存在哪些常见问题?(重中之重)
DNS劫持问题
DNS解析转发问题
DNS劫持
由于,查询DNS服务器是UDP,且明文传输
有可能被钓鱼DNS劫持,然后返回一个错误的IP地址,从而客户端访问了一个错误的网站。常见于各种。。。你懂得
问:怎么解决DNS劫持
两种:httpDNS 和 长链接
httpDNS
正常情况下,使用DNS协议走53端口
现在,用HTTP协议,走80端口
图中,http://119.29.29.29/d?dn=www.imooc.com&ip=172.18.134.108所代表的含义:
119.29.29.29是全球最大的DNS服务器
www.imooc.com是我们要访问的网络地址
172.18.134.108是我们自身的IP地址
这样,就能通过HTTP的GET请求方式来获取www.imooc.com的IP地址
长链接
问:DNS劫持与HTTP的关系是怎样的?
没关系
DNS解析是发生在HTTP建立连接之前的
且
DNS解析请求使用UDP数据报,端口号53。
与HTTP无关
DNS解析转发
假如,我们客户端想解析一个地址,发送给了移动服务器的DNS。
而移动DNS懒省事,直接去电信DNS查找
电信DNS去权威DNS查找,而权威DNS根据访问服务器的不同,给了不同的IP地址。此时,给的是电信的3.3.3.3
然后返回给移动,返回给客户端
客户端本来用的移动网,最后却访问的是电信那边返回的IP地址,这就有可能造成网速慢的问题。
那么,这个是不是也是通常翻墙或者手机卡通用流量、定向流量的解决方法呢?
Session/Cookie
两者是对HTTP协议无状态特点的补偿
比如,你访问一个商城网站,没有登录,将某件衣服加入购物车。等下次打开的时候,由于HTTP协议是无状态的,它不知道你是谁,再次打开的时候,加入购物车的衣服没了。
为了解决这个问题,就有了Session和Cookie
Cookie
Cookie主要用来记录用户状态、区分用户。
其保存在客户端
其过程大致是:
客户端第一次向服务端请求数据,服务端生成一个Cookie,响应的时候传给客户端,客户端进行保存。
等下次再次打开网站,请求数据的时候,会将客户端原有的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设置为过期,则Cookie相等于失效,等同于删除。
问:怎样保证Cookie的安全?
- 对Cookie进行加密
- 只在HTTPS上携带Cookie
- 设置Cookie为httpOnly,防止跨站脚本攻击
Session
Session也是用来记录用户状态、区分用户的
其存储在服务端
问:Session和Cookie的关系是怎样的?
Session需要依赖于Cookie机制
问:一次完整的网络请求都经历什么?具体用到了哪些协议?
让我们通过一个具体的例子来详细解析网络请求的全过程:比如,你从浏览器发起一个请求以访问www.example.com
的网页。我们将跟随这个请求穿越OSI模型的7层,看看每层都发生了什么,以及涉及到哪些协议。
0. 用户在浏览器输入www.example.com
时的初始步骤:
1. 应用层 (Application Layer)
DNS解析
- 活动:将域名
www.example.com
解析成IP地址。 - 协议:DNS (域名系统)。
- 说明:在应用层发出请求之前,需要知道目标服务器的IP地址。DNS解析是将人类可读的域名转换成机器可读的IP地址的过程。
HTTP请求
- 活动: 浏览器构造一个HTTP请求,用于获取
www.example.com
的首页。 - 协议: HTTP (超文本传输协议)。
- 说明: 这一层处理与应用程序直接交互的部分,比如你通过Web浏览器发送的请求。
2. 表示层 (Presentation Layer)
- 活动: 浏览器可能需要将请求的数据(如表单数据)转换成合适的格式,比如通过编码或加密处理。
- 协议: SSL/TLS (安全套接层/传输层安全)加密HTTP请求,成为HTTPS。
- 说明: 此层确保数据以可接受的形式传输,例如加密数据以保护信息在互联网上传输时的安全。
3. 会话层 (Session Layer)
- 活动: 建立、维护、断开与
www.example.com
的网络连接会话。 - 协议: 没有特定协议,但可以考虑如SSL/TLS在此层有作用,为HTTPS连接提供支持。
- 说明: 控制端与端的对话,管理用户会话。
4. 传输层 (Transport Layer)
- 活动: 将HTTP请求分割成多个段,准备传输。
- 协议: TCP (传输控制协议)。
- 说明: TCP提供可靠的、面向连接的数据传输服务。它将大的数据包分割成小的段,并确保每个段能可靠地达到目标。
5. 网络层 (Network Layer)
- 活动: 决定数据包发送的路径。
- 协议: IP (互联网协议)。
- 说明: IP负责将每个数据包从源地址路由到目的地址。在这个过程中,可能涉及到多个网络和设备。
在数据从网络层下发到数据链路层之前,可能还需要进行以下步骤:
ARP查询(若需要)
- 活动:若IP地址是局域网内的目标或下一跳路由器的IP地址,使用ARP(地址解析协议)获取对应的物理地址(MAC地址)。
- 协议:ARP。
- 说明:在数据可以在本地网络上传输之前,需要知道目的地的物理地址(即MAC地址)。如果ARP缓存中没有这个信息,就会发送一个ARP广播请求来查询它。
6. 数据链路层 (Data Link Layer)
- 活动: 在直接连接的节点之间传输IP数据包,处理错误校验和重传。
- 协议: Ethernet (以太网)。
- 说明: 这一层确保数据能在相邻的网络设备间准确无误地传输,例如在你的电脑和路由器之间。
7. 物理层 (Physical Layer)
- 活动: 通过物理媒介传输数据。
- 协议: 转换为通过电缆或无线介质传输的电信号或光信号。
- 说明: 这是数据传输的最底层,负责原始比特流的传送。
网络响应的回传
服务器接收到请求后,根据相同的层级结构处理响应。响应数据包同样经过物理层、数据链路层、网络层(可能还会涉及ARP),传输层,会话层,表示层,最后是应用层,再由浏览器渲染出www.example.com
的内容。
在整个过程中,可能还涉及到更多的细节和其他协议(比如NAT转换、防火墙处理规则等),具体取决于网络环境和配置。但以上是一次典型网络请求和响应过程中的关键步骤和涉及的协议。
参考视频:一次请求涉及的网络协议