系统基础知识
TCP链接
建立TCP连接/ TCP三次握手
上一讲也说了, Socket是基于TCP/IP上的封装, 如果要了解Socket的连接, 就要从TPC/IP的连接入手.
我们日夜不分离的手机之所以能联网, 也是因为手机的底层实现了TCP/IP协议, 可以让手机通过WiFi, 4G等无线网络进行通信.
建立起一个TCP连接, 需要通过三次的验证, 我们这里称为三次握手:
- 第一次握手: 由客户端发送一个叫做SYN(SYN=J)包到服务器, 并且进入SYN_SEND状态, 然后就翘着二郎腿等服务器回应.
- 第二次握手: 服务器接收到了SYN包, 必须确认客户端的SYN(ACK=J+1), 同时也会发送一个SYN(SYN=K)包, 也就是SYN+ACK, 此时轮到服务器跷二郎腿, 并且进入SYN_RECV状态.
- 第三次握手: 接收到了服务器发来的SYN+ACK包, 并向服务器发送确认包ACK(ACK=K+1), 发完之后, 客户端和服务器就会收起二郎腿并且进入ESTABLISHED状态, 完成了三次握手
大概的情况就是酱紫:
[图片上传失败...(image-6fda29-1617589629747)]
TCP连接的三次握手 .jpg
也可以更详细一点如图:
[图片上传失败...(image-b7daff-1617589629747)]
TCP三次握手.png
这里注意一下, 在进行握手的时候, 所传送的包并不包含数据.
只有在完成三次握手之后, 客户端和服务器才会正式开始传输数据, 一般在TCP连接建立成功后, 除非有一方主动关闭连接之前, TCP连接是会一直保持下去的, 比如我们的微信, QQ这些即时聊天App.
关闭TCP连接/TCP四次挥手
刚刚说完了如何建立起TCP的连接, 现在我们来看看怎么关闭.
客户端和服务器都可以发起关闭TCP连接的请求, 但是需要通过四次验证, 我们这里称为四次挥手, 这里我们演示由客户端发起关闭TCP连接:
- 第一次挥手: 客户端会发送一个FIN的报文给服务器之后就会进入等待服务器的响应.
- 第二次挥手: 服务器接收到了FIN之后, 并确认是由客户端发起的, 同时也会发送一条ACK=X+1的报文.
- 第三次挥手: 等到客户端接受到ACK报文之后, 服务器关闭了与客户端的连接, 会发送一条FIN的报文给客户端.
- 第四次挥手: 客户端接收到了由服务器发送过来的FIN报文, 就会关闭与服务端的连接, 并且发送ACK给服务器.
关系图:
[图片上传失败...(image-3ae413-1617589629747)]
TCP四次挥手关系图.png
有人或许有疑问说为啥TCP建立连接的时候是三次握手, 而断开连接的时候却是四次挥手呢?
因为连接时服务端收到了客户端的SYN连接请求的报文后, 可以直接发送SYN+ACK报文, 其中的ACK报文是用来响应, SYN报文是用来同步的.
而当关闭连接时, 服务端收到FIN报文后, 很可能并不会马上就关闭Socket连接, 所以只能先回复一个ACK报文, 告诉客户端, 你发的FIN报文我收到了, 只有等到服务器的所有报文发送完了, 服务端才会发送FIN报文, 所以才需要四次挥手.
HTTP 和HTTPS 区别
http 和 https 区别
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
基于HTTP协议的客户/服务器模式的信息交换过程,分为四个过程:建立连接、发送请求信息、发送响应信息、关闭连接
HTTP 工作原理
如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm
1)、地址解析
2)、封装HTTP请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3)封装成TCP包,建立TCP连接(TCP的三次握手)
在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口
4)客户机发送请求命令
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
5)服务器响应
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
6)服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
服务器将响应信息传给客户端,响应体中的内容可能是一个html页面,也可能是一张图片,通过输入流将其读出,并写回到显示器上。
HTTPS 工作原理
1、客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到server的443端口。
2、服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。
这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6、服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7、传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
Charles 抓取 HTTPS 原理及流程
Charles作为一个“中间人代理”,当浏览器和服务器通信时,Charles接收服务器的证书,但动态生成一张证书发送给浏览器,也就是说Charles作为中间代理在浏览器和服务器之间通信,所以通信的数据可以被Charles拦截并解密。由于Charles更改了证书,浏览器校验不通过会给出安全警告,必须安装Charles的证书后才能进行正常访问。
下面来看具体的流程:
客户端向服务器发起HTTPS请求
Charles拦截客户端的请求,伪装成客户端向服务器进行请求
服务器向“客户端”(实际上是Charles)返回服务器的CA证书
Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
Charles拦截服务器的响应,替换成自己的证书后发送给客户端
至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
什么是中间人攻击?如何避免?
中间人攻击的定义:中间人攻击是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。
简单来说,攻击者在请求和响应传输途中,拦截并篡改内容。对于 HTTP 来说,由于设计的简单,不需要太多步骤就可以进行监听和修改报文;在这里主要是针对 HTTPS,HTTPS 使用了 SSL 加密协议,是一种非常安全的机制,目前并没有方法直接对这个协议进行攻击,一般都是在建立 SSL 连接时,利用中间人获取到 CA证书、非对称加密的公钥、对称加密的密钥;有了这些条件,就可以对请求和响应进行拦截和篡改。
中间人攻击需要截获请求响应
对于中间人攻击,有一个前提就是:需要截获到客户端与服务器通信的线路。
抓包工具一般都是用户主动将其设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。
对于其它工具则是利用 DNS欺骗、ARP投毒、劫持网关等手段,将客户端的请求重定向到攻击者的机器,以便进行网络抓包。
SSL 证书欺骗攻击
SSL 证书欺骗攻击流程大概如下:
- 截获客户端与服务器通信的通道
- 然后在 SSL 建立连接的时候,进行中间人攻击
- 将自己伪装成客户端,获取到服务器真实有效的 CA 证书(非对称加密的公钥)
- 将自己伪装成服务器,获取到客服端的之后通信的密钥(对称加密的密钥)
- 有了证书和密钥就可以监听之后通信的内容了
[图片上传失败...(image-ec427c-1617589629747)]
image
[图片上传失败...(image-5919af-1617589629747)]
image
这个避免方法就是:
- 如果客户端链接代理 不信任证书
- App 可以提前预埋证书在本地