应用层基础之HTTP

应用层基础之HTTP

开始之前先做个说明,这只是计网的最基础的部分,大多数是学习计算机网络自顶向下方法图解网络这两本书的笔记,HTTPS大多参考了图解网络,大家可以参考这两本书获得更多细节。另外,如果想了解更多的HTTP的信息,可以参考经典的《HTTP权威指南》。我这里只是为了巩固基础,毕竟马上要面试了。。。
首先要了解HTTP是web的应用层协议,它是web的核心。

概念

HTTP:超文本传输协议。
超文本:指的就是不仅限于文字,还可能是图片,文件,程序或者视屏等数据;
传输:所谓传输就是A可以发送请求到B,B可以应答给A,是双向的,但是也允许中间有中转的连接。
协议:要做出某种事情需要遵守的约定和规范。

非持续连接和持续连接

非持续连接(短连接):每个请求响应对经过一个单独的TCP连接发送。
缺点

  1. 必须为每一个请求的对象建立和维护一个全新的连接,这样一台Web服务器可能同时服务于很多客户的请求,增加Web服务器的负担。
  2. 每一个对象都要经过两倍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:表明服务器返回什么数据。
  • 实体体。

请求报文中方法字段

  1. GET:请求从服务器获取资源,实体体为空,
  2. POST:向URI指定的资源提交数据,数据放在实体体中。URI,统一资源标志符(Uniform Resource Identifier, URI),表示的是web上每一种可用的资源,如 HTML文档、图像、视频片段、程序等都由一个URI进行标识的。
  3. HEAD:类似于GET,但是并不返回请求对象。
  4. PUT:用户上传对象到指定的Web服务器上指定的路径。
  5. DELETE:允许用户或者应用程序删除Web服务器上的对象。
    主要记录下GET和POST。
    碰见个面试题问:GET和POST方法都是安全并且幂等的吗?
    先理解安全:请求方法不会破坏服务器上的资源,
    幂等:多次执行相同的操作,结果都是相同的。
    很明显GET是安全幂等的,而POST会提交数据,修改服务器上的资源,所以不是安全的,并且每次提交的资源也可以不一样,也不是幂等的。

响应报文中常见响应状态码

状态码我个人觉得记住常见的即可,更多是现查现用。状态码的作用就是web服务器告诉客户端发生了什么事。有五大类状态码,如下:

  1. 1**:提示信息,表示目前是协议处理的中间状态,还需要后续的操作。
  2. 2**:成功,报文已经收到并被正确处理。例如:200:成功处理了请求。204:请求处理成功,但是没有数据实体返回,
  3. 3**:重定向。资源位置发生变动,需要客户端重新发送请求。例如:300:多种选择,针对请求,服务器执行多种操作。 客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了。301:永久重定向,请求的资源已经不在了,需要用新的URL访问,302:临时重定向:请求的资源还在,但是需要暂时用另外一个URL来访问。304:缓存重定向:资源未修改,上次请求的网页未修改过,即客户端的缓存资源是最新的,要客户端使用缓存。
  4. 4**:客户端错误。例如:400:服务器不理解请求。403:请求被服务器拒绝了,404:服务器未找到资源,408:服务器等待请求时超时,如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接。
  5. 5**:服务端错误。例如:500:服务器内部错误, 501: 客户端发起的请求超出服务器的能力范围,502:(错误网关) 服务器作为网关或代理,从上游服务器收到无效响应,503:服务器很忙,暂时无法响应。504:(网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求,505:服务器不支持请求报文使用的HTTP协议版本。

HTTP特性

HTTP1.0

使用短链接,性能开销大。

HTTP1.1

  • 优点:简单,灵活和易于扩展,应用广泛和跨平台。
  • 双刃剑:无状态传输(可利用cookie解决),明文传输。
  • 缺点:不安全。
  • 性能:长连接,管道网络传输队头阻塞(区别于HTTP1.0)。
    管道网络传输:同一个TCP连接里面,客户端可以发起多个请求,只要第一个请求发送出去了,不用等其回来就可以发送第二个请求出去,可以减少整体响应时间。
    队头阻塞:顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一同被阻塞了,会导致客户端一直收不到响应数据。

HTTP2.0

  1. HTTP2.0是基于HTTPS的
  2. 头部压缩:如果你同时发出多个请求,他们的头是一样的或是相似的,那么,协议会帮你消除重复的部分
  3. 二进制格式:HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧.
  4. 多路复用:HTTP/2 是可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应

HTTP3.0

基于UDP的协议

HTTPs

SSL/TLS

基于http下的一个安全传输层。一种用于加密和验证应用程序和Web服务器之间发送的数据的协议。

HTTP和HTTPs的区别

  1. HTTP是超文本传输协议,信息明文传输,存在安全风险问题。HTTPS解决了HTTP不安全的缺陷,在TCP和HTTP之间加了SSL/TLS安全协议,使得报文能够加密传输。
  2. HTTP经过TCP三次握手就可以进行报文传输,HTTPS在TCP三次握手之后还需进行SSL/TLS握手过程,然后进行加密报文传输
  3. HTTP端口号是80,HTTPS端口号443
  4. HTTPS需要向CA申请数字证书来保证服务器的身份是可信的

HTTPS解决了HTTP的哪些问题

三个问题

  1. 窃听风险
  2. 篡改风险
  3. 冒充风险

HTTPS怎么解决上述三个问题的

HTTPS通过加入了SSL/TLS协议,实现了信息加密,校验机制和身份证书来确保通信安全。具体通过下面三个方式。

1. 混合加密:

对称加密和非对称加密结合的方式。

  1. 为什么用混合加密对称加密只使用一个密钥,运算速度块,密钥必须保密,无法做到安全的密钥交换;非对称加密使用两个密钥,公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但是速度慢。
  2. 混合加密的过程:在通信建立前采用非对称加密的方式交换会话密钥,后续不再使用非对称加密,通信过程中全部使用对称加密的会话密钥的方式加密明文数据。

2. 摘要算法:

摘要算法用来实现数据完整性,能够为数据生成独一无二的指纹,用于校验数据的完整性,解决了篡改的风险。
说明数据是完整的过程:

  1. 客户端通过摘要算法算出明文的指纹
  2. 将指纹和明文一同加密成密文发给服务器
  3. 服务器解密后,用相同的摘要算法算出发过来的明文和指纹
  4. 比较客户端携带的指纹和当前算出的指纹,指纹相同说明数据完整

3. 数字证书:

如何保证公钥不被篡改?

  1. 服务器将自己的公钥注册到CA
  2. CA用自己的私钥将服务器的公钥数字签名并颁发数字证书:服务器的公钥+CA的数字签名
  3. 客户端拿到服务器的数字证书后,数字证书可信,公钥就是可信的,使用CA的公钥确认服务器的数字证书的真实性
  4. 客户端从数字证书获取服务器公钥后,使用它对报文进行加密发送
  5. 服务器用私钥解密

SSL/TLS协议基本流程(https加密的过程)

  1. 客户端向服务器索要并验证服务器的公钥
  2. 双方协商生产会话密钥,会话密钥是对称加密,服务器公钥只用来加密对话密钥本身。
  3. 双方采用会话密钥进行加密通信

SSL/TLS协议详细流程(HTTPS建立连接)

  1. 客户端向服务端发送加密通信请求,也就是ClientHello请求
  2. 服务端收到客户端请求后,向客户端发出响应,也就是ServerHello,客户端收到服务器的响应后,首先通过CA公钥确认服务器的数字证书的真实性(CA通过自己的私钥对服务器的公钥加密,客户端只要有CA的公钥就可以对数字证书解密),如果证书没有问题,客户端会从数字证书中取出服务器的公钥,这时候服务器端还保存着唯一的私钥
  3. 客户端使用服务器给的公钥对双方通信的对称密钥进行加密,并且发送给服务端
  4. 服务器利用自己唯一的私钥对客户端发来的对称密钥进行解密
  5. 双方进行数据传输,服务器和客户端双方用公有的相同的对称秘钥对数据进行加密解密,可以保证在数据收发过程中的安全,即是第三方获得数据包,也无法对其进行加密,解密和篡改。
    参考: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网络编程>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值