应用层基础之HTTP
开始之前先做个说明,这只是计网的最基础的部分,大多数是学习计算机网络自顶向下方法和图解网络这两本书的笔记,HTTPS大多参考了图解网络,大家可以参考这两本书获得更多细节。另外,如果想了解更多的HTTP的信息,可以参考经典的《HTTP权威指南》。我这里只是为了巩固基础,毕竟马上要面试了。。。
首先要了解HTTP是web的应用层协议,它是web的核心。
概念
HTTP:超文本传输协议。
超文本:指的就是不仅限于文字,还可能是图片,文件,程序或者视屏等数据;
传输:所谓传输就是A可以发送请求到B,B可以应答给A,是双向的,但是也允许中间有中转的连接。
协议:要做出某种事情需要遵守的约定和规范。
非持续连接和持续连接
非持续连接(短连接):每个请求响应对经过一个单独的TCP连接发送。
缺点:
- 必须为每一个请求的对象建立和维护一个全新的连接,这样一台Web服务器可能同时服务于很多客户的请求,增加Web服务器的负担。
- 每一个对象都要经过两倍RTT交付时延。RTT:一个短分组从客户到服务器然后返回客户所花费的时间。
持续连接(长连接):多个请求响应对可经相同的TCP连接发送。
优势:
服务器发送响应后保持TCP连接打开,在相同的客户和服务器之间,后续的请求和响应报文能够通过相同的连接发送。当然,如果一条连接经过一定时间间隔仍未被使用,HTTP服务器就关闭该连接。
HTTP报文格式
HTTP常见字段
先看下典型的HTTP请求和响应报文:
HTTP请求报文:
GET/somedir/page.html HTTP/1.1
Host:www.someschool.edu
Connection:close
User-agent:Mozilla/5.0
Accept:*/*
...
- 请求行。有三个字段,方法字段,URL字段,HTTP版本字段。
- 首部行。Host字段:客户端发送请求,用来指定服务器的域名。Connection:客户端告诉服务器是否使用TCP长连接,close:告诉服务器不要使用持续连接,Keep-Alive:要求服务器使用TCP长连接,**User-agent:**指定向服务器发送请求的浏览器的类型。Accept:客户端可以接受哪些数据格式
- 实体主体。
HTTP响应报文:
HTTP/1.1 200 OK
Connection:close
Server:Apache
Contennt-Length:6821
Content-Type:text/html
...
- 状态行。服务器会通过相应的状态码来告诉客户端发生了什么事情。
- 首部行。Server:表明报文是由哪台服务器产生的。Contennt-Length:服务器返回数据的长度,Contennt-Type:表明服务器返回什么数据。
- 实体体。
请求报文中方法字段
- GET:请求从服务器获取资源,实体体为空,
- POST:向URI指定的资源提交数据,数据放在实体体中。URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。
- HEAD:类似于GET,但是并不返回请求对象。
- PUT:用户上传对象到指定的Web服务器上指定的路径。
- DELETE:允许用户或者应用程序删除Web服务器上的对象。
主要记录下GET和POST。
碰见个面试题问:GET和POST方法都是安全并且幂等的吗?
先理解安全:请求方法不会破坏服务器上的资源,
幂等:多次执行相同的操作,结果都是相同的。
很明显GET是安全幂等的,而POST会提交数据,修改服务器上的资源,所以不是安全的,并且每次提交的资源也可以不一样,也不是幂等的。
响应报文中常见响应状态码
状态码我个人觉得记住常见的即可,更多是现查现用。状态码的作用就是web服务器告诉客户端发生了什么事。有五大类状态码,如下:
- 1**:提示信息,表示目前是协议处理的中间状态,还需要后续的操作。
- 2**:成功,报文已经收到并被正确处理。例如:200:成功处理了请求。204:请求处理成功,但是没有数据实体返回,
- 3**:重定向。资源位置发生变动,需要客户端重新发送请求。例如:300:多种选择,针对请求,服务器执行多种操作。 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了。301:永久重定向,请求的资源已经不在了,需要用新的URL访问,302:临时重定向:请求的资源还在,但是需要暂时用另外一个URL来访问。304:缓存重定向:资源未修改,上次请求的网页未修改过,即客户端的缓存资源是最新的,要客户端使用缓存。
- 4**:客户端错误。例如:400:服务器不理解请求。403:请求被服务器拒绝了,404:服务器未找到资源,408:服务器等待请求时超时,如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接。
- 5**:服务端错误。例如:500:服务器内部错误, 501: 客户端发起的请求超出服务器的能力范围,502:(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应,503:服务器很忙,暂时无法响应。504:(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求,505:服务器不支持请求报文使用的HTTP协议版本。
HTTP特性
HTTP1.0
使用短链接,性能开销大。
HTTP1.1
- 优点:简单,灵活和易于扩展,应用广泛和跨平台。
- 双刃剑:无状态传输(可利用cookie解决),明文传输。
- 缺点:不安全。
- 性能:长连接,管道网络传输,队头阻塞(区别于HTTP1.0)。
管道网络传输:同一个TCP连接里面,客户端可以发起多个请求,只要第一个请求发送出去了,不用等其回来就可以发送第二个请求出去,可以减少整体响应时间。
队头阻塞:顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会导致客户端一直收不到响应数据。
HTTP2.0
- HTTP2.0是基于HTTPS的
- 头部压缩:如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分
- 二进制格式:HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧.
- 多路复用:HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应
HTTP3.0
基于UDP的协议
HTTPs
SSL/TLS
基于http下的一个安全传输层。一种用于加密和验证应用程序和Web服务器之间发送的数据的协议。
HTTP和HTTPs的区别
- HTTP是超文本传输协议,信息明文传输,存在安全风险问题。HTTPS解决了HTTP不安全的缺陷,在TCP和HTTP之间加了SSL/TLS安全协议,使得报文能够加密传输。
- HTTP经过TCP三次握手就可以进行报文传输,HTTPS在TCP三次握手之后还需进行SSL/TLS握手过程,然后进行加密报文传输
- HTTP端口号是80,HTTPS端口号443
- HTTPS需要向CA申请数字证书来保证服务器的身份是可信的
HTTPS解决了HTTP的哪些问题
三个问题
- 窃听风险
- 篡改风险
- 冒充风险
HTTPS怎么解决上述三个问题的
HTTPS通过加入了SSL/TLS协议,实现了信息加密,校验机制和身份证书来确保通信安全。具体通过下面三个方式。
1. 混合加密:
对称加密和非对称加密结合的方式。
- 为什么用混合加密:对称加密只使用一个密钥,运算速度块,密钥必须保密,无法做到安全的密钥交换;非对称加密使用两个密钥,公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但是速度慢。
- 混合加密的过程:在通信建立前采用非对称加密的方式交换会话密钥,后续不再使用非对称加密,通信过程中全部使用对称加密的会话密钥的方式加密明文数据。
2. 摘要算法:
摘要算法用来实现数据完整性,能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险。
说明数据是完整的过程:
- 客户端通过摘要算法算出明文的指纹
- 将指纹和明文一同加密成密文发给服务器
- 服务器解密后,用相同的摘要算法算出发过来的明文和指纹
- 比较客户端携带的指纹和当前算出的指纹,指纹相同说明数据完整
3. 数字证书:
如何保证公钥不被篡改?
- 服务器将自己的公钥注册到CA
- CA用自己的私钥将服务器的公钥数字签名并颁发数字证书:服务器的公钥+CA的数字签名
- 客户端拿到服务器的数字证书后,数字证书可信,公钥就是可信的,使用CA的公钥确认服务器的数字证书的真实性
- 客户端从数字证书获取服务器公钥后,使用它对报文进行加密发送
- 服务器用私钥解密
SSL/TLS协议基本流程(https加密的过程)
- 客户端向服务器索要并验证服务器的公钥
- 双方协商生产会话密钥,会话密钥是对称加密,服务器公钥只用来加密对话密钥本身。
- 双方采用会话密钥进行加密通信
SSL/TLS协议详细流程(HTTPS建立连接)
- 客户端向服务端发送加密通信请求,也就是ClientHello请求
- 服务端收到客户端请求后,向客户端发出响应,也就是ServerHello,客户端收到服务器的响应后,首先通过CA公钥确认服务器的数字证书的真实性(CA通过自己的私钥对服务器的公钥加密,客户端只要有CA的公钥就可以对数字证书解密),如果证书没有问题,客户端会从数字证书中取出服务器的公钥,这时候服务器端还保存着唯一的私钥。
- 客户端使用服务器给的公钥对双方通信的对称密钥进行加密,并且发送给服务端
- 服务器利用自己唯一的私钥对客户端发来的对称密钥进行解密。
- 双方进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。
参考:HTTPS
参考:https://www.cnblogs.com/cjwxf/p/6186287.html
https://blog.csdn.net/hzw05103020/article/details/47276005
https://www.cnblogs.com/wxisme/p/6212797.html
书本:<<计算机网络自顶向下方法>>
<<图解网络>>
<<TCP/IP网络编程>>