详解HTTP——基础

162 阅读11分钟

认识HTTP

一、HTTP定义

  • 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
  • HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展

二、Web与HTTP

  • Web是一种基于超文本和HTTP的,全球性的,动态交互的,夸平台的分布式图形信息系统
  • 建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的,易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构

三、HTTP协议的前世今生

  • 1990年10月 万维网之父Tim Berners-Lee最早提出了HTTP协议
  • 1991年 HTTP0.9诞生
  • 1996年5月 HTTP1.0发布
  • 1997年1月 HTTP1.1发布
  • 2015年5月 HTTP2.0提出
  • HTTP3.0 QUIC协议(传输层协议, TCP, UDP)采用无连接,把TCP和UDP合并

四、透过TCP/IP看HTTP

  • HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集
  • 为了更好的理解HTTP协议,我们先了解下TCP/IP的相关知识

五、TCP/IP协议

  • TCP/IP协议其实是一系列与互联网相关联的协议集合起来的总称
  • 分层管理是TCP/IP协议的重要特征

六、TCP/IP协议族分层

  • TCP/IP协议族是由一个四层协议组成的系统
  1. 应用层: [一般是我们编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。如:FTP、DNS、HTTP等]
  2. 传输层: [传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能.(TCP有链接,效率低,可靠性强和UDP无连接,效率高,不可靠)]
  3. 网络层: IP[网络层用来处理网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎么的路径(传输路线)到达对方计算机,并把数据包传输给对方]
  4. 数据链路层:网络[用来处理链接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内]

七、HTTP数据传输过程

  • 发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除

微信截图_20210730094617.jpg

八、传输层——TCP三次握手

  • 使用TCP协议进行通信的双方必须先建立链接,然后才能开始传输数据。为了确保链接双方可靠性,在双方建立链接时,TCP协议采用了三次握手策略。

微信截图_20210730095133.jpg

  1. 第一次握手:客户端发送带有SYN标志的链接请求报文段,然后进入SYN_SEND状态,等待服务器端的确认
  2. 第二次握手:服务器接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客服端,此时服务器端将会进入SYN_RECY状态
  3. 第三次握手: 客户端接收到服务器的SYN+ACK报文段后,会向服务端发送ACK确认报文段,这个报文段发送完毕后,客服端和服务端都进入ESTABLISHED状态,完成TCP三次握手
  • 三次握手目的:是确认双方收发能力都是正常的 第一次握手,服务端可以确定对方的发送能力是正常的,自己的接收能力是正常的,第二次握手客户端可以确定服务器端的接收能力是正常的,发送能力也是正常的,同时自己的接收,发送能力是正常的,第三次握手服务端可以确定,对方和自己的接收,发送能力都是正常的

微信截图_20210730105940.jpg

DNS域名解析

  • 已经介绍了与HTTP协议有着密切关系的TCP/IP协议,接下来介绍DNS服务也是与HTTP协议有着密不可分的关系
  • 通常我们访问一个网站,使用的是主机名或者域名来进行访问的,因为相对于IP地址(一组纯数字)域名更容易让人记住。但是TCP/IP协议使用的是IP地址进行访问的,所以必须有个机制或服务把域名转换成IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务

引用[凶残的程序员]的博客,他的思维导图做的非常棒

# 透视HTTP协议(二) —— HTTP相关的协议

HTTP协议特点

一、 支持客户/服务器模式

  • 客户/服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务

微信截图_20210802095752.jpg 二、简单快速

  • 客户向服务器请求服务时,只需传送请求方式和路径
  • 请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同
  • 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快 三、灵活
  • HTTP允许传输任意类型的数据对象
  • 正在传输的类型由Content-Type(Content-Type是Http包中用来表示内容类型的标识)加以标记 四、无连接
  • 无连接的含义是限制每次链接只处理一个请求
  • 服务器处理完客户的请求,并收到客户的应答后,即断开链接
  • 采用这种方式可以节省传输时间 五、无状态
  • HTTP协议是无状态协议
  • 无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次链接传送的数据量增大
  • 另一方面,在服务器不需要先前信息时它的应答就较快

HTTP报文结构分析-请求报文

一、HTTP报文头

  • HTTP的报文头大体可以分为四类,分别是:
  1. 通用报文头
  2. 请求报文头
  3. 响应报文头
  4. 实体报文头
  • HTTP/1.1里一共规范了47种报文头字段

ACCEPT

作用:浏览器端可以接受的媒体类型 Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(Non Acceptable) Accept: / 代表浏览器可以处理所有类型 如果想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值;重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。当服务器提供多种内容时,将会受限返回权重值最高的媒体类型。

Accept-Encoding

作用:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip, deflate)

Accept-Language

作用:浏览器申明自己接收的语言 Accept-Language:zh-cn,zh;q=0.7,en-us,en;q=0.3 客户端在服务器有中午版本资源的情况下,会请求其返回中文版对应的响应,没有中文版时,则请求返回英文版响应

Connection

Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户再次发送Request,需要重新建立TCP连接

Host

作用:请求报文头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的 我们在浏览器中输入:www.fljf.com:8080 浏览器发送的请求消息中,就会包含Host请求报头域,如下: Host:www.fijf.com:8080

Referer

当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理

User-Agent

  • 作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
  • 很多情况下我们会通过User-Agnet来判断浏览器类型,从而进行不同的兼容设计

Content-Type

  • 作用:说明了报文体内对象的媒体类型
  text/html: HTML格式 
  text/plain: 纯文本格式
  text/xml: XML格式
  images/gif: gif图片格式
  images/jpeg: jpg图片格式
  images/png: png图片格式
  
  application/xhtml + xml: XHTML格式
  application/xml: XML数据格式
  application/atom + xml: Atop XML聚合格式
  application/json: JSON数据格式
  application/pdf: pdf格式
  application/msword: Word文档格式
  application/octet-stream: 二进制流数据(如常见得文件下载)
  application/x-www-form-urlencoded: 表单提交
  

HTTP请求方法剖析

  • HTTP/1.1常用方法
  1. GET: 方法用来请求访问已被URI识别的资源,指定的资源经服务器端解析后返回相应内容 (存在安全问题,和对URL的长度限制问题)
  2. POST:与GET功能类似,一般用来传输实体的主体,主要目的是提交请求。
  3. PUT:从客户端向服务器传送的数据取代指定的文档的内容 (http1.1存在安全漏洞)
  4. HEAD:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
  5. DELETE:删除服务器删除指定的资源(http1.1存在安全漏洞)
  6. OPTIONS:用来查询针对请求URI指定的资源支持的方法
  7. TRACE:回显服务器收到的请求,主要用于测试或诊断(http1.1存在安全漏洞)
  8. CONNECT:开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道,做代理使用(不常用,甚至不用)
  • GET和POST的区别: mp.weixin.qq.com/s/JBcnEBSX1…

  • PUT方法与POST方法最大的不同是:PUT是幂等的,而POST是不幂等的,因此,我们更多时候将PUT方法用作传输资源

状态码

  • 是用以表示网页服务器超文本传输协议响应状态的3位数字代码

微信截图_20210803092029.jpg

微信截图_20210803092202.jpg

微信截图_20210803092435.jpg

微信截图_20210803092655.jpg

微信截图_20210803092814.jpg

HTTP状态管理:Cookie与Session

  1. Cookie
  • Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就向客户端浏览器颁发一个Cookie
  • 客户端浏览器会把Cookie保存起来。当浏览器请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态

微信截图_20210803094307.jpg

微信截图_20210803095853.jpg

  1. Session
  • Session是另一种记录客户状态的机制,保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上
  • 客户端浏览器再次访问时只需要从该Session中查找客户的状态就可以了

微信截图_20210803100425.jpg

保存Session ID的方式

  • Cookie
  • URL重写
  • 隐藏表单

Session的有效期

  • Session超时失效
  • 程序调用HttpSession.invalidate()
  • 服务器进程被停止

Cookie与Session的区别

  1. 存放位置不同(Cookie在客户端,Session在服务器端)
  2. 安全性(隐私策略)的不同
  3. 有效期上的不同
  4. 对服务器压力的不同