zoukankan      html  css  js  c++  java
  • HTTP协议

    一、相关

      1、互联网

            物理连接介质+互联网协议

      多台计算机通过物理链接介质(网线)传输数据,传输过程中遵循互联网协议。

      2、互联网建立目的

      打破地域限制获取数据,通过互联网可以获取到存放在不同地域的计算机上的数据。

      3、上网

      用户通过浏览器发送请求给服务端,将服务端的数据传输到用户的机器上并按一定的规则显示给用户。

      浏览器访问服务器需遵循HTTP协议。

    二、HTTP协议

    HTTP协议简介

    1、HTTP协议,全称Hyper Text Transfer Protocol(超文本传输协议) HTTP协议是用于从(WWW:World Wide Web,简万维网 )服务器传输超文本到本地浏览器的传送协议。

    2、HTTP协议工作于B/S架构上 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求Request。 Web服务器根据接收到的请求后,向客户端发送响应信息Response。

    3、HTTP协议是基于TCP/IP通信协议来传递数据的(HTML 文件, 图片文件等)

    HTTP和HTTPS的区别:

    HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),
    是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
    HTTPS协议服务端需要到ca申请一个用于证明用途类型的证书,客户端访问时会拿着服务端的证书去与ca机构保存的该证书比对,比对无误,则该网站合法。

    HTTP协议的发展

    HTTP 0.9 版本

    1、只允许客户端发送GET这一种请求

    2、不支持请求头。

    3、因没有请求头,HTTP 0.9协议只支持纯文本格式的内容。

    4、HTTP 0.9协议网页支持使用HTML语言格式化,但无法插入图片。

    5、无状态性
    每个事务独立处理,事务结束则释放该链接。

    一次HTTP 0.9的传输过程 

    1、先建立一个由客户端到web服务器的tcp链接。  
    2、客户端发起一个请求。 
    3、web服务器返回页面内容,关闭链接。  
    4、如果请求的页面不存在,也不会返回任何错误码。

    HTTP 1.0 版本新增特性:

    1、支持请求头与响应头

    2、Response响应以一个响应状态行开始,且Response包含的内容不只限于超文本

    3、开始支持客户端通过POST方法向Web服务器提交数据,并支持GET、HEAD、POST方法

    4、支持长连接Keepalive(但默认还是使用短连接),若需使用长连接,则添加请求头Connection:Keep-Alive

    5、缓存机制以及身份认证

    HTTP 1.1 版

    性能优化:keepalive连接,请求流水线,chunked编码传输,字节范围请求等

    HTTP 1.1 详解:

    1、Persistent Connection(keepalive连接)
    HTTP设备在事务处理结束后保持tcp链接,以便HTTP设备再次请求时重复利用该链接,直到客户端或服务端主动关闭。
    该版本的链接默认是长连接,若要关闭则HTTP请求报文首部加上Connection: close
    长链接和短链接的区别:
    短连接:同一个HTTP发送3次请求,每次发送请求之前都要先键链接再通信。
    长链接:同一个HTTP发送3次请求,只需在第一次发送请求前建立链接,3次请求都复用该链接。比上述短连接少了2次建立链接的时间。

    2、Pipelining(请求流水线)
    客户端可以不停的向服务端发送请求,每次请求后无需等待回复可立即发送下一次请求,服务端会按照客户端发送请求的顺序依次回应。

    3、chunked编码传输

    概念:chunked编码传输是指发送请求时将消息分块逐次传输,每块标明自己的大小,传输的消息块大小为0时则该次传输结束。

    分块编码指定方式:
    当响应头里包含Transfer-Encoding: chunked,则表明消息会被分块编码,报文被分隔为若干个块依次发送。
    分块编码的应用:
    使用长链接通信时,服务器发送消息时会先计算出主题内容的大小,放在响应头里(Content-Length:主体的字节数)发送给客户端。
    若服务器动态创建内容,无法预知发送内容的大小,则此时使用分块编码。

    Transfer-Encoding: chunked和Content-Length:主体的字节数,响应头的内容里这两者必须存在一个。

    Content-Length相关:
    若请求头里包含Accept-Encoding': 'gzip',则服务端会将内容压缩后返回,内容的Content-Length长度是压缩后的长度,
    不包含Accept-Encoding': 'gzip',服务器就不会采取gzip压缩,并且服务器的发送不会使用分块编码,响应头里返回的是
    Content-Length:未压缩的
    主体的字节数

    4、字节范围请求
    HTTP1.1支持传送内容的一部分,即当客户端已经有了服务端需回应消息的部分内容,则为了节省带宽,会向服务端请求部分没有的信息
    实现方法:在请求信息中加入range头域。响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如服务端返回消息
    无误,响应码206(Partial Content)。

    HTTP 1.1 版新增特性

    1、请求消息和响应消息中包含Host头域。
    2、新增Request method:OPTIONS,PUT, DELETE, TRACE, CONNECT。
    3、cache新特性:引入实体标签(e-tags),新增Cache-Control头。

    HTTP协议之请求Request

    请求的URL

    #URI
    URL(Uniform Resource Identifiers)统一资源标识符,HTTP协议用此来建立链接和传输数据。
    Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
    URI一般由三部组成:
    ①访问资源的命名机制
    ②存放资源的主机名
    ③资源自身的名称,由路径表示,着重强调于资源。
    #URL
    URL(Uniform Resource Locator)统一资源定位符,是互联网用来标识某个资源的地址。
    一般包含以下内容:
    ①协议(或称为服务方式)
    ②存有该资源的主机IP地址(有时也包括端口号)
    ③主机资源的具体地址。如目录和文件名等
    #URL和URI的关系
    URL是一种特殊类型的URI,包含了用于查找某资源的足够的信息。
    #URL详解
    以https://www.i.cnblogs.com:80/new/posts?postConfig=IsDraft#name为例
    #1、协议部分:http://
    “http:”为网页遵循的协议部分,“//”是分隔符,Internet中的协议还有FTP等。该部分必须有,不写浏览器会自动补充。
    #2、域名部分:www.i.cnblogs.com
    域名会通过NDS服务器转换成IP,该部分必须有。
    #3、端口:80
    域名后面用:分隔,接着写端口。端口可以没有,若省略端口,默认是80。
    #4、虚拟目录:/new/
    从域名后的第一个"/"开始到最后一个"/"为止,都是虚拟目录。非必须部分
    #5、文件名:posts?
    从域名后的最后一个"/"到“?”为止;若没有“?”,则到“#”为止;若没有“?”和“#”,则从域名最后一个“/”开始到结束部分都是文件名。
    该部分可以没有,省略时使用默认名。 #6、参数部分:postConfig=IsDraft 从“?”到“#”之间的都是参数,又称搜索部分、查询部分。参数之间用&以&为分隔符。非必须部分。 #7、锚部分:#name 从“#”到结束部分都是。非必须部分。

    请求的格式

    客户端发送一个HTTP请求到服务器的请求消息格式为:请求行(request line)请求头部(header)空行和请求数据四个部分组成。

    注意:回车符换行符为" "

    http的抓包分析

    #打开网页=>右击,点检查=>Network=>刷新URL=>Name中找到自己#访问的文件名,点击=>点击Headers。
    #请求源码的查看点击Request Headers 中的view source
    Request Headers GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
           Chrome/66.0.3359.181 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: https://www.baidu.com/
    Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: BAIDUID=F1FA6D880887A180B4136C951E0A9CFE:FG=1;
    BIDUPSID=F1FA6D880887A180B4136C951E0A9CFE; PSTM=1526890121;
    BD_UPN=12314753; cflag=15%3A3; FP_UID=b2082cdba42201ddbba7492d1f14829d;
    sugstore=0; pgv_pvi=4007056384; BD_HOME=0;
    H_PS_PSSID=1455_26459_21101_18560_26350_20928; BD_CK_SAM=1; PSINO=1;
    ispeed_lsm=2; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598 空行 #1、请求行:说明请求类型,要访问的资源(被省略,浏览器会自己补全),HTTP使用的版本 #2、请求头:从第二行开始,用于说明服务器要使用的附加信息,以key:value的形式展示 Host:指出请求地址
    Referer:指明从哪个地址跳转到该网页 User-Agent:客户端工具的工具名称,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.
    该信息由客户端的浏览器来定义,并且在每个请求中自动发送等。 cookie:客户端首次认证后,服务器返给客户端的认证信息,用于下次发送请求时的认证. #3、空行:请求头后面必须加空行,即使请求体数据为空。 #4、请求数据或请求主体,可添加任意的其他数据 该方法没有请求体(Form Data),只有post方法才有。

    请求方法

    #请求方法
    HTTP1.0定义的三种请求方法: GET, POST 和 HEAD。
    HTTP1.1新增请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 
    #请求方法简介:
    GET         请求指定的页面信息,并返回实体主体。
    HEAD        类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
    POST        向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
    数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 PUT 从客户端向服务器传送的数据取代指定的文档的内容。 DELETE 请求服务器删除指定的页面。 OPTIONS 允许客户端查看服务器的性能。 TRACE 回显服务器收到的请求,主要用于测试或诊断。 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 #请求方法的意义 一个URL地址用于描述一个网络上的资源,而HTTP中最基本的四个方法GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 #常用方法 GET和POST。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

    GET和POST方法的区别

    1:参数组织方式和显示位置不同,GET提交的数据会放在URL后面,用?分隔,参数之间以&为分隔符。
    参数为字母或数字时,会原样发送;是中文或其他字符时,则把字符串用BASE64加密的到%xx%yy形式的数据发送给服务端;参数中的空格用+代替。POST方法提交的数据放在HTTP包的Body中. 因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

    2:传输数据大小限制
    GET提交的数据大小因浏览器对URL长度的限制而受到限制,而POST方法提交的数据没有限制.
    GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

    3:安全性
    相比于POST方法,GRT方法的安全性较低。
    GET方法提交数据会显示在地址栏,造成数据不安全。
    1、通过GET方法发送的用户名和密码会出现在URL上,该页面被浏览器缓存,则通过查看浏览器记录会拿到用户信息 
    2、使用GET提交数据还可能会造成Cross-site request forgery攻击

    HTTP协议之响应Response

    服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息Response

    Response包括4部分:状态行、消息报头、空行和响应正文。

    响应详解

    #响应详解
    Response Headers
    HTTP/1.1 302 Found
    Location: https://map.baidu.com/
    Date: Sun, 03 Jun 2018 07:14:54 GMT
    Content-Length: 45
    Content-Type: text/html; charset=utf-8
    空行
    #=========响应正文==========
    #1、状态行:包括HTTP的版本号,状态码,状态信息
    #2、消息报头:用于说明客户端要使用的一些附加信息
    Date:生成响应的日期和时间
    Content-Type:指明内容类型和编码方式
    #空行:消息报头后必须有空行
    #响应正文:服务器返回给客户端的文本信息

    响应状态码

    #状态码由三位数字组成,第一个数字划分类别,分为5种。
    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求
    
    #常见状态码:
    200 OK                        //客户端请求成功
    400 Bad Request               //客户端请求有语法错误,不能被服务器所理解
    401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
    403 Forbidden                 //服务器收到请求,但是拒绝提供服务
    404 Not Found                 //请求资源不存在,eg:输入了错误的URL
    500 Internal Server Error     //服务器发生不可预期的错误
    503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
    #更多状态码http://www.runoob.com/http/http-status-codes.html
  • 相关阅读:
    scrapy-redis使用以及剖析
    完全理解 Python 迭代对象、迭代器、生成器
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    HTTP状态码
    Py西游攻关之RabbitMQ、Memcache、Redis
    Django contenttypes 应用
    cookie和session 以及Django中应用
    RESTful规范
    rest_framework框架的认识
    vue 总结
  • 原文地址:https://www.cnblogs.com/mingkong-z/p/9167008.html
Copyright © 2011-2022 走看看