HTTP(HyperText Transfer Protocol:超文本传输协议):简单理解:用于Web浏览器和网站服务器之间传递信息。
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL(Secure Socket Layer,安全套接字层)/TLS(Transport Layer Security,传输层安全) 来加密数据包。HTTPS 开发的主要目的【数据传输更加安全】,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
HTTPS 默认工作在 TCP 协议443端口
我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。
1、客户端发起 HTTPS 请求
就是用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。
2、服务端的配置
【生成公钥和私钥】
采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。
这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4、客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书(公钥)没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6、服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7、传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
TCP和UDP协议都工作在传输层,他们的作用就是在程序之间进行数据传输的(二进制数)。
我们日常浏览网页,观看视频等都是基于TCP协议和UDP协议的。
是基于连接的(通过三次握手,传输确认,四次挥手来保证在不可靠信道中保证可靠的连接),
为什么要三次握手,不采用两次握手?
这是为了避免已失效的请求报文突然恢复又传输到服务端 引起错误。
这是什么意思呢?
当客户端向服务端第一次握手发送SYN1(Synchronize同步)包时,由于未知的原因导致SYN包在中间某个网络节点发生了滞留,为了建立连接客户端会重新发一个SYN2包给服务端,服务端接收到SYN2包过后,服务端回复一个SYN+ACK(acknowledge character确认字符)过后建立起了连接 ,但是由于网络阻塞的SYN1包突然恢复,服务端会误认为客户端又发送了一个SYN包再次回复一个SYN+ACK,从而服务端再次进行等待状态。(客户端认为自己只建立了一个连接,而服务端会认为建立了两个连接,从而导致状态不一致),如果如果是三次握手的情况下,服务端接收不到客户端第三次发送的ACK包就不会认为连接成功【因为客户端只会认为自己发送了一次,第三次握手就只会发送一次ACK包给服务端】。
TCP协议中三次握手的作用就是解决在不可靠信道保证可靠的连接。
当传输一包数据被拆成多包数据将如何解决1-丢包问题,2-乱序问题(分成多个包传输到服务端的先后顺序不同)?
为了解决这种问题,TCP协议为每次连接建立了一个发送缓冲区,从建立连接后第一个字节序列号为0,后面每个序列号都会增加1,发送数据时,会从缓冲区取一部分数据组成发送报文,在TCP协议头中会附带序列号和长度。接收端(服务端)接收到数据过后会回复一个ACK(确认字符)【ACK=序列号+长度】,这也告诉发送端下一个包的起始序列号, 这种一问一答的方式保证了发送端发送的数据已经被接收端接收到,发送端也可以连续发送多个包的数据,接收端只用回复一次ACK就可以(因为接收端会根据序列号和长度进行重构出来完整的数据,即使发生丢包问题,接收端只需要将缺失的序列号和长度回复给发送端,发送端进行重传(丢失重传))
假如客户端主动发送连接关闭请求,会发送一个FIN(final结束)包给服务端表示自己要关闭连接,并处于终止等待1状态(第一次挥手)。服务端接收到FIN包后回复给客户端一个ACK包,并处于关闭等待状态(第二次挥手)。这时候服务端还可以继续向客户端发送未完成的数据,客户端还可以接收数据,待服务端数据发送完成给客户端过后,会发送一个FIN包给客户端,自己进入最后确认状态(Last-ACK)(第三次挥手)。客户端接收到FIN包后回复一个ACK包给服务端,自己进行超时等待状态(为什么不立即关闭呢?因为在传输最后一个ACK包给服务端时,如果ACK在信道中发生丢失,服务端没有收到ACK包会一直处于等待状态不能进行关闭,所以服务端会重发一个FIN包给客户端,客户端再次发送ACK包给服务端(并刷新超时等待时间),服务端收到ACK包立即关闭,客户端在超时等待时间过后没有收到服务端再发送的FIN包则表示服务端关闭成功,客户端就进行关闭),服务端接收到ACK包过后立即关闭(第4次挥手)。
是基于非连接的(将数据包装一下,直接发送出去就可以了,根本不在乎丢包和乱序和接收问题)。
TCP(Transmission Control Protocol):稳定可靠但效率低于UDP,不会发生丢包乱序问题,适用于数据传输要求较高的场景(发送邮件,传输文件等)。
UDP(User Datagram Protocol):稳定性差但效率高于TCP,会发生丢包和乱序问题,适用于要求实时性比较高的场景(语音通话和视频直播等)。