初识网络协议:HTTP和HTTPS

HTTP和HTTPS都是应用层的协议,也是我们经常看得到的。它们两个的区别,体现在下图。

HTTP协议传输的数据都是未加密的,都是明文。所以不安全,信息容易被窃取。

HTTPS协议传输的数据是经过加密的,是安全的,所以有个“锁”。

HTTP协议:

HTTP是基于TCP协议的,在发送HTTP请求之前会先建立起TCP连接。建立TCP连接需要三次握手,断开需要四次挥手,开销还是比较大的,所以得让建立起来的TCP连接能够被复用。目前使用的HTTP协议大部分都是1.1,在1.1的协议里,默认是开启了Keep-Alive的,这样建立的TCP连接,就可以被复用了。

HTTP请求格式:

第一部分:请求行

在请求行中,URL就是要访问的网站地址,版本为1.1,方法就是GETPOST之类的。

第二部分:首部字段

首部字段都是key: value的形式,如Content-Type: application/json; charset=UTF-8。Content-Type是指正文的格式。

Cache-Control: no-store, no-cache, must-revalidate。Cache-Control是用来控制缓存的,当客户端发送的请求中包含max-age指令时,如果判定缓存层中,资源的缓存时间数值比指定时间的数值小,那么客户端可以接受缓存的资源;当指定max-age值为0,那么缓存层通常需要将请求转发给应用集群。

HTTP请求的发送:

HTTP是基于TCP协议的,所以它使用面向连接的方式发送请求,通过stream二进制流的方式传给对方。到了TCP层,它会把二进制流变成一个个的报文段发送给服务器。在发送每个报文段的时候,都需要对方有一个回应ACK,来保证报文可靠地到达了对方。如果没有回应,那么TCP这一层会进行重新传输。

TCP层发送每一个报文的时候,都需要加上自己的IP地址(源地址)和目标地址,将这两个信息放到IP头里面,交给IP层进行传输。

IP层需要查看目标地址和自己是否在同一个局域网。如果是,就发送ARP协议来请求这个目标地址对应的MAC地址,然后将源MAC和目标MAC放入MAC头,发送出去即可;如果不在同一个局域网,就需要发送到网关,还是需要发送ARP协议,来获取网关的MAC地址,然后将源MAC和网关MAC放入MAC头,发送出去。

网关收到包发现MAC符合,取出目标IP地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的MAC地址,将包发给下一跳路由器。

当路由器终于到达目标局域网时,发送ARP获取目标MAC地址,将包发出去。

目标机器发现MAC地址符合,就将包收起来;发现IP地址符合,根据IP头中的协议,知道自己上一层是TCP协议,于是解析TCP的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存返回一个ACK,如果不是就丢弃。

TCP头里面还有端口号,HTTP的服务器正在监听这个端口号。于是,目标机器自然知道是HTTP服务器这个进程想要这个包,于是将包发给HTTP服务器。HTTP服务器的进程看到,会根据请求作出响应,发送给客户端。

HTTP返回格式:

与请求格式不一样的是第一部分状态行

常见的状态码有200(OK),404(找不到资源),500(服务器内部错误)。

构建好了返回的HTTP报文,就交给TCP层,TCP层再交给IP层,把上面请求的发送反过来跑一边而已。

HTTP 1.1在应用层以纯文本的形式进行通信,每次都需要带完整的HTTP头,每次一去一回,在实时性、并发性上都存在问题。所以在此基础上便有了HTTP 2.0。

HTTP 2.0会对HTTP的头进行一定的压缩,将原来每次都要携带的大量key value在两端建立一个索引表,对相同的头只发送索引表中的索引。另外,HTTP 2.0协议将一个TCP的连接中,切分成多个流,每个流都有自己的ID。HTTP 2.0还将所有的传输信息分割为更小的消息和帧,对它们采用二进制格式编码。常见的有Header帧,用于传输Header的内容。再就是Data帧,用来传输正文实体。多个Data帧属于同一个流。

通过这两种机制,HTTP 2.0的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打乱顺序发送,然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

HTTPS协议:

HTTPS和HTTP不同就不同在传输的信息是加密的。

加密有两种,对称加密非对称加密

对称加密就是加密和解密的密钥是相同的,优点是效率高,性能好,缺点是不够安全,密钥容易被截取。

非对称加密就是加密使用的密钥和解密使用的密钥是不同的,一把是公开的公钥,一把是私有的私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。优点是相对于对称加密更加安全,缺点是性能不高。

假如客户端使用公钥加密,然后服务端用私钥解密,那么服务端当然知道客户端在说什么。可是如何安全地响应给客户端呢?用私钥加密?不行的,公钥人人都有,随便谁都可以破解的。用公钥加密?别傻了,私钥只有服务端有,其他无论谁都不好解密的。那这样看来,一对公钥私钥是不够的,客户端也需要自己的公钥和私钥,并且客户端需要把自己的公钥给服务端。

这样一来客户端给服务端发送信息的时候,用服务端的公钥加密,而服务端给客户端发送信息的时候,用客户端的公钥加密。这样一来,双方都只能用自己独有的私钥来解密,即使信息被黑客截取他也无法破解。

可是问题来了,如何将非对称加密的公钥给对方?一种是放在一个公网的地址上,让对方下载;另一种就是在建立连接的时候传给对方。

这两种方法有相同的问题,那就是,作为一个普通网民,怎么才能鉴别被人给你的公钥是对的,会不会有人冒充服务端,给你一个假的公钥,然后和你正常互通,这看起来没有任何问题。

这时候就需要权威部门的介入了,这个权威部门会给你颁发证书。证书里面有公钥、证书的所有者、证书的发布机构和证书的有效期。

HTTPS协议的总体思路是这样的:非对称加密在性能上不如对称加密,那么我就将这两者结合起来,公钥私钥主要用于传输对称加密的密钥,而真正的双方大数据量的通信都是通过对称加密进行的。

HTTPS客户端和服务端加密解密过程:

  1. 首先服务端得申请证书certificate,证书里面有公钥等相关信息。
  2. 浏览器发送client_hello给服务端,并包含一个随机数random1
  3. 服务端回复server_hello,并且包含一个随机数random2,同时回复certificate,携带着服务端的公钥。
  4. 浏览器收到certificate后会先校验证书,再根据random2生成premaster_secrectmaster_secrect
  5. 浏览器使用服务端回复的证书公钥将premaster_secrect加密并且发送给服务端。
  6. 服务端使用自己的私钥解密得到premaster_secrect,此时服务端和客户端都拥有random1random2premaster_secrect这三个数,所以服务端根据相同的算法,求出了相同的master_secrect,即对称密钥。
  7. 有了对称密钥,客户端发送Change Cipher Spec(指示客户端从现在开始发送的消息都是加密过的)给服务端,再发送Encrypted Handshake Message给服务端用于数据与握手校验。某端要验证Encrypted Handshake Message,必然需要先解密Encrypted Handshake Message(因为他是用共享秘钥加密的),如果验证失败,也可能是两端秘钥协商不成功。但是不管怎么样,无论是秘钥协商不成功还是数据被人篡改,都需要断开连接,即让握手失败。
  8. 服务端也向客户端发送Change Cipher SpecEncrypted Handshake Message

参考资料:《趣谈网络协议》、大型网站的HTTPS实践(二)——HTTPS加密算法介绍

原文地址:https://www.cnblogs.com/74percent/p/12394805.html

时间: 2024-08-02 14:43:39

初识网络协议:HTTP和HTTPS的相关文章

初识网络协议:如何上网

大多数人只知道拉一根网线,往有网卡的电脑上一插,什么也不需要做,就可以上网了. 其实在你看不见的地方,有很多事情发生了. 首先,ipconfig后你会发现,你被分配了一个IP地址,IP地址上面是网卡的MAC地址,系统还给你配置好了子网掩码和默认网关. MAC地址是一个网卡的物理地址,用十六进制,6个byte表示.网卡自打生产出来,就带有号称全局唯一的MAC地址.不过MAC地址是一个局域网才有效的地址,所以只要局域网唯一就好了. 默认网关(Gateway),默认网关的地址一定和源IP地址是同一个网

初识网络协议:什么是容器

容器(Container)的思想是要变成软件交付的集装箱.而集装箱最重要的就是“打包”和“标准”两大特点.所谓打包,就是将所有的货物打包在一起,然后放到集装箱里面:所谓标准,就是集装箱的尺寸全部都是一样的. 对于容器而言,打包就是将货物封装起来,使货物之间互不干扰,相互隔离.隔离主要使用了两种技术,namespace和cgroup. 命名空间(namespace) 命名空间是用来解决在不同的空间里面,类名相同引起的冲突.这在很多编程语言里面都很常见,比如PHP. 在Linux下也是这样的,很多的

(转) HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手.TCP/IP协议基础.加密学) 原文:http://blog.csdn.net/itermeng/article/details/78517364 原文地址:https://www.cnblogs.com/liujiacai/p/8325931.html

TCP/IP网络协议初识

目录 一.什么是协议? 二.什么是TCP/IP协议? 三.TCP/IP为什么这么多协议? 四.TCP/IP协议为什么分层? 五.TCP/IP协议如何入门? 六.TCP/IP 的分层: 七.各协议层打包和拆包过程: 八.浏览器访问网页的整个流程: 九.举例:网上购物的请求流程 一.什么是协议? 协议就是两个或多个对象之间为了某个或多个需求而设置的约定,即在什么时间,遇到什么情况该做什么. 举例: 小强和小明约定周末一起去玩小霸王游戏机,但是如果遇上停电就去掏鸟窝. 二.什么是TCP/IP协议? T

初识网络编程

初识网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好.但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了. 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等.我们可以在我们的电脑上和别人聊

一、初识网络编程

一.初识网络编程 1.协议模型 1.1.OSI模型 OSI(Open System Interconnect)开放系统互联参考模型,是在网络历史的早期,国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)共同出版的开放系统互联的七层参考模型,它把网络分为七层. 1.2.TCP/IP协议簇模型的演变 ISO制定的OSI参考模型的过于庞大复杂,招致了许多批评,为此后续的TCP/IP模型得到了广泛的应用. TCP/IP是一系列模型的集合,早期的TCP/IP模型是四层结构,后来借鉴OSI的七层

看江湖老炮用尽洪荒之力解读网络协议(下)

作者言:老炮总结的有些协议比喻也不是很恰当,毕竟网络协议是一门科学,而江湖规矩是口口相传的道义:如果把此文当成一份凉菜,"老炮如是说"的话语只能做为一点调味,具体调的好不好,老炮也恍惚,老炮只是用心在调,咸了淡了您多包涵,欢迎品尝.上篇叙述了网络协议的上三路,本篇介绍网络协议的下四路.下面看一位老炮如何解读这些网络协议(下)传输层传输层是整个协议层次结构的核心,是惟一负责总体数据传输和控制的一层.它属于OSI模型7层的中间层,网络层只是根据网络地址将源结点发出的数据包传送到目的结点,而

Android之Http通信——1.初识Http协议

Android之Http通信--1.初识Http协议 引言: 今天是六一儿童节,先在这里给各位超龄儿童说声节日快乐哈~( ╯□╰ ),小猪也象征性地给群里的小朋友们派了红包-嗯,忙碌的五月最终过去了,做毕设,写论文,拍毕业照,答辩,辞职.各种各样的事,也算忙完了,好吧.小猪如今又在一家新的公司上班了.第三间公司了.你们肯定会认为小猪三心二意是吧,毕竟才差点儿相同毕业就换了那么多家公司,然后可能问我."小猪你什么时候跳第四间公司",哈哈,应该不会了哈,怎么说呢,事实上我还是非常专一的,毕

Wireshark网络抓包(三)——网络协议

一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通过以太网发生IP数据包时,先封装第三层(32位IP地址)和第二层(48位MAC地址)的报头: 但由于发送数据包时只知道目标IP地址,不知道其Mac地址,且不能跨越第二.三层,所以需要使用地址解析协议. ARP工作流程分请求和响应: 在dos窗口内"ping"某个域名抓取到的包: 二.IP协