HTTP协议

HTTP协议

定义

HyperText Transfer Protocol,超文本传输协议 or 超文本转移协议。
用于分布式、协作、超媒体信息系统的应用层协议。
最广泛的应用是用于从WWW服务器传输超文本到本地浏览器

产生原因

HTTP其实是为REST而生的,它能够表达状态和状态转移,这就是它位于应用层而非传输层的原因,所以说HTTP中的Transfer被翻译成“转移”更为恰当
HTTP在中国大陆被翻译为“超文本传输协议”,因为“transfer”在此有“传输”的含意。但HTTP定制者之一的Roy Fielding博士在其论文[1](6.5.3节)中使用“transfer”表达的是“(表述状态的)转移”(Representational State Transfer),而不是“传输”。这是因为英语单词“transfer”在不同语境下的多义性,请勿误解。 另一方面看,不管在大陆还是港台地区,应用层协议名字中的“transfer”习惯上都被译为“传输”,1991年,Tim Berners-Lee发明设计HTTP的最初目的很单纯,就是为了传输含有超链的文本,最初版本的HTTP只能传输纯文本页面,只有一个GET方法,并不适用于构建各种应用系统,这里HTTP(超文本传输协议)与FTP(文件传输协议)、NNTP(网络新闻传输协议) 、SMTP(简单邮件传输协议)相比,并无特别之处。HTTP流行之后,Roy Fielding2000年论文提出的Representational State Transfer,是HTTP(也可以是其他传输协议)之上构建各种应用系统的一种架构风格,其中的“State Transfer(状态转移)”并未改变“Hypertext Transfer(超文本传输)”的原始含义,由此看“超文本传输协议”的译法并无不妥。

特点

  • 支持客户/服务器模式。
    在一条通信线路上必定有一端是客户端,另一端是服务器端。
    请求从客户端发出,服务器端响应请求并返回。也就是说,请求肯定是先从客户端开始建立通信的,服务器端在没有接收请求之前不会发送响应。
  • HTTP是无连接:
    限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
    早期,每个客户端(即浏览器)与服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因此 HTTP 的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
    然而,随着一台服务器同一时间处理的请求越来越多,如果依然采用原来的方式,将会在建立和断开连接上花费大部分时间HTTP1.1提出了持久连接的方法。所谓的持久连接,就是任意一端只要没有明确提出断开连接,则保持TCP连接状态
    Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。
  • HTTP是媒体独立的
    允许传输任意类型的数据对象,通过 Content-Type 标识
  • HTTP是无状态
    每个请求都是独立的,Keep-Alive 没能改变这个结果。缺少状态意味着如果后续处理需要前面的信息,则它必须重传。

通信过程

  • 浏览器自动解析URL获取域名
    HTTP URL包含了用于查找某个资源的足够信息,基本格式如下:http://host[“:”port][abs_path],其中HTTP表示桶盖HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
  • 浏览器向DNS获取URL中域名部分对应的IP地址
    浏览器地址栏中输入"HTTP://www.xxx.com/"并提交之后,首先它会在DNS本地缓存表中查找,如果有则直接告诉IP地址。如果没有则要求网关DNS进行查找,如此下去,找到对应的IP后,则返回会给浏览器。
  • 浏览器主动和服务器之间建立一个TCP套接字连接
    当获取IP之后,就开始与所请求的Tcp建立三次握手连接
  • 浏览器发送http请求
  • 服务器接收http请求返回http响应
  • 服务器关闭TCP链接
    一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接
    如果浏览器或者服务器在其头信息加入了这行代码, TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接,可以节省为每个请求建立新连接所需的时间,还节约了网络带宽。
    Connection:keep-alive
    
  • 浏览器渲染显示对应内容

请求报文和响应报文

  • 请求报文Request:从客户向服务器发送请求报文。
    在这里插入图片描述

    • 请求行(开始行)
      方法: get、post等,指定请求的资源按期望产生某种行为(http协议支持的方法
      URL: 要访问的资源
      协议版本: 所使用的http版本

    • 请求头部(首部行)
      可以有多行,也可以不使用。用来说明服务器要使用的附加信息(如Cookie

      常见的请求头:

      • User-Agent:Mozilla/5.0 (平台) 引擎版本 浏览器版本号
        • 作用:告诉服务器客户端代理(即浏览器)的相关信息。如浏览器版本信息。
        • 应用:可以在服务器端获取该头的信息,解决浏览器的兼容性问题。
      • Referer:URL
        • 作用:告诉服务器,当前请求从哪个URL来
        • 应用:
          • 防盗链:
            盗链就是指某个连接请求的资源不是自己应该获取的(如没有版权)
            服务器可以通过Referer判断连接来源是否合法,合法再返回响应资源。
          • 统计:
            服务器可以用来统计某个来源URL的访问次数
    • 空行
      必须的,即使第四部分的请求数据为空,也必须有空行。

    • 请求数据(实体主体)
      使用get命令时方法为空,当为post方法时,应包含用户在表单中输入的值

  • 示例:

      POST /login.html	HTTP/1.1
      Host: localhost
      User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
      Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
      Accept-Encoding: gzip, deflate
      Referer: http://localhost/login.html
      Connection: keep-alive
      Upgrade-Insecure-Requests: 1
      
      username=zhangsan
    
  • 响应报文:从服务端到客户的回答。
    在这里插入图片描述

    • 响应行(状态行,开始行)
      • 协议版本:http版本
      • 状态码:三位数(http状态码含义),如200
      • 状态码描述:如ok
    • 响应头部(首部行)
      可以多行,也可以没有。用来说明客户端要使用的一些附加信息。
      可用首部字段
    • 空行
      必须的。
    • 响应正文(实体主体)
      报文的主体,即请求的对象本身,如HTML页面。

常见问题

http的缓存机制

在这里插入图片描述
http的缓存机制
强制缓存 对比缓存
浅谈Web缓存机制

http断点续传

图解HTTP断点续传
在这里插入图片描述

http常用状态码

  • http状态码含义
状态码含义
1xx指示信息:表示请求已接收,继续处理
2xx成功:表示请求已被成功接收、理解、接受
3xx重定向:要完成请求必须进行更进一步的操作
4xx客户端错误:请求有语法错误或请求无法实现
5xx服务器端错误:服务器未能实现合法的请求
  • http常见状态码
状态码 状态描述含义
200 OK客户端请求成功
304未修改(表示客户机缓存的版本是最新的,客户机应该继续使用它。)
400 Bad Request客户端请求有语法错误,不能被服务器所理解
401 Unauthorized请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden服务器收到请求,但是拒绝提供服务
404 Not Found请求资源不存在,eg:输入了错误的URL
500 Internal Server Error服务器发生不可预期的错误
503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常

http常用首部字段

http常用首部字段

Get和Post的区别

由表及里理解get和post的区别
客户端的区别

  • get提交,将信息封装到了请求消息的请求行, 提交的信息都显示在地址栏中,提交数据量有限制,对于敏感的数据信息不安全
  • post提交,将信息封装到了请求体中,提交的信息不显示地址栏中(地址栏中只有网页地址),提交数据量没有限制,且对于敏感信息安全

    URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。

getpost
GET后退按钮/刷新无害POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)
GET书签可收藏POST为书签不可收藏
GET能被缓存POST不能缓存
GET历史参数保留在浏览器历史中POST参数不会保存在浏览器历史中。
GET编码类型application/x-www-form-urlPOST编码类型encodedapplication/x-www-form-urlencoded 或 multipart/form-data,为二进制数据使用多重编码

GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中)
?分割URL和传输数据,参数之间以&相连,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,其中%XX中的XX为该符号以16进制表示的ASCII。如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。

在服务端的区别

  • 如果将中文提交到tomcat服务器,服务器默认会用iso8859-1进行解码会出现乱码
    • get和post的通用方法:
      通过iso8859-1进行编码,在用指定的中文码表解码。即可。
    • post的专用方法
      直接使用服务端request的对象的setCharacterEncoding方法直接设置指定的中文码表就可以将中文数据解析出来。这个方法只对请求体中的数据进行解码。

在应用上的区别

  • GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。对同一URL的多个请求应该返回同样的结果。所以表单提交,建议使用post。(除非既没有敏感信息,又不需要提交大量数据,还不需要中文解码,就可以用get)

不同HTTP协议间的区别

不同HTTP协议间的区别

HTTP 与 HTTPS 的区别

  • 什么是HTTPS
    HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
  • HTTP 与 HTTPS 的主要区别
    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

80端口和8080端口的区别

80/8080/3128/8081/9080等都是 HTTP协议代理服务器常用端口号。

  • 80端口是系统默认的web服务端口,是在输入网站的时候其实浏览器(非IE)已经帮你输入协议了,所以你输入http://baidu.com,其实是访问http://baidu.com:80
  • 8080是一般自定的端口,一般用于web服务,属于自行设定。apache-tomcat默认跑8080端口。

服务端和客户端都需要校验吗

服务器和客户端均需设置校验,原因如下:

  • 如果在客户端进行增强型的校验(只要有一个组件内容是错误,是无法继续提交的。只有全对才可以提交),服务端收到数据后,为了安全性,仍需要校验。(因为客户端的校验可能没有执行,但不影响数据传送,从而发生错误,所以仍需校验)

验证码就是为了防止客户端暴力注册

  • 如果服务端做了增强型的校验,客户端还需要校验,因为要提高用户的上网体验效果,减轻服务器端的压力。

即服务器那边做了增强型校验,而客户端不做校验,那么客户端在发送的时候,每次都需要服务器校验再返回告知信息错误,相比客户端直接校验会很耗时,而且服务器压力也会很大,所以需要现在客户端校验。

触发浏览器和服务器交互的3种方式

  • 地址栏输入url地址。get—只是访问,没有提交数据
  • 超链接。 get—只是访问,没有提交数据
  • 表单。 get 和 post — 可能访问并提交数据

参考文献

https://blog.csdn.net/tanyujing/article/details/9189767 http协议通信过程
https://my.oschina.net/u/1989055/blog/473190 http协议通信过程
http://xdwangiflytek.iteye.com/blog/1343395 —HTTP常用状态码
https://juejin.im/entry/58d7635e5c497d0057fae036 详细解析 HTTP 与 HTTPS 的区别
https://iask.sina.com.cn/b/2802348.html 80端口和8080端口的区别
https://www.zhihu.com/question/26698345 80端口和8080端口的区别
https://blog.csdn.net/ccpat/article/details/79413433 请求报文和响应报文的结构图
https://www.jianshu.com/p/80e25cb1d81a http请求报文和响应报文详解
https://www.zhihu.com/question/28586791 get和post的区别
https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE http-wiki
https://www.jianshu.com/p/30744fbd1f01 无连接 无状态
http://www.ituring.com.cn/article/1817 关于http的中文翻译 - 图灵社区

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值