zoukankan      html  css  js  c++  java
  • HyperText Transfer Protocol

    HyperText Transfer Protocol

      HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。从1960年发展至今,共有三个版,HTTP/0.9 已过时的版本。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。HTTP/1.0 这个版本是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

    一 DNS解析

    绝大多数的Web开发,都是构建在HTTP协议之上的Web应用 ,例如百度,http://www.baidu.com,准确来说是https://www.baidu.com(是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL)。人习惯记忆域名,当我想访问百度时,习惯性的输入www.然后加上"百度"的拼音"baidu",然后再加上.com,但机器间互相只认IP(互联网上每一台计算机的唯一标识)地址,因此需要把www.baidu.com转换成对应的IP地址,这个转换工作称为DNS解析,这个解析过程是如何进行的呢?

    首先在本地域名服务器中查询www.baidu.com对应的IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,其实,真正的网址是www.baidu.com.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,接着,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到百度的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: .->com -> baidu.com -> www.baidu.com。

    从上面DNS解析步骤来看,有些复杂,为了增加访问效率,DNS存在着多级缓存,浏览器缓存(Google  chrome://dns),系统缓存(cmd ipconfig/displaydns),路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。

    回到主题,通过DNS解析域名获取到百度服务器真获取实IP后,建立TCP连接,发送请求。

    二 HTTP Request请求

    HTTP请求由三部分构成,请求行,请求头(消息报头),请求体(请求正文)。

    下图是用抓包工具Fiddler抓取的上传文件的请求

     1 POST http://localhost:8080/ HTTP/1.1
     2 Host: localhost:8080
     3 Connection: keep-alive
     4 Content-Length: 6903
     5 Cache-Control: max-age=0
     6 Origin: http://localhost:8080
     7 Upgrade-Insecure-Requests: 1
     8 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykfTNgtyTkGnKaci9
     9 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36
    10 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    11 Referer: http://localhost:8080/
    12 Accept-Encoding: gzip, deflate, br
    13 Accept-Language: zh-CN,zh;q=0.9
    14 
    15 ------WebKitFormBoundarykfTNgtyTkGnKaci9
    16 Content-Disposition: form-data; name="file"; filename="内网配置.png"
    17 Content-Type: image/png
    18 ......

    1 请求行:上图显示的第(1)行内容。请求行以一个方法符号开头, 以空格分开, 后面跟着请求的URI 和协议的版本, 格式如下:Method Request-URI HTTP-Version CRL 

     其中 Method 表示请求方法; Request-URI 是一个统一资源标识符; HTTP-Version 表示请求的HTTP 协议版本; CRLF 表示回车和换行(除了作为结尾的CRLF 外,不允许出现单独的CR LF 字符)。

    请求方法
    GET

    请求获取Request-URI 所标识的资源
    POST 

    Request-URI 所标识的资源后附加新的数据
    HEAD 

    请求获取由Request-URI 所标识的资源的响应消息报头
    PUT 

    请求服务器存储一个资源,并用Request-URI 作为其标识
    DELETE 

    请求服务器删除Request-URI 所标识的资源
    TRACE

     请求服务器回送收到的请求信息,主要用于测试或诊断
    CONNECT 

    保留将来使用
    OPTIONS  请求查询服务器的性能,或者查询与资源相关的选项和需 

    2 请求头:上图显示的第(2-13)行内容,请求头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端信息。

    3 请求体:上图显示的第(15)行以后内容。


    三 HTTP Reponse响应

    HTTP响应也由三部分构成,响应行,响应头(消息报头),响应体(响应正文)。

    1 HTTP/1.1 200
    2 Content-Type: text/html;charset=UTF-8
    3 Content-Language: zh-CN
    4 Date: Wed, 16 May 2018 03:00:48 GMT
    5 Content-Length: 568
    6 
    7 <html>
    8 <body>
    9 ......

    1 响应行:上图显示的第(1)行内容。响应行的格式如下

      HTTP-Version Status-Code Reason-Phrase CRLF其中, HTTP-Version 表示服务器HTTP 协议的版本; Status-Code 表示服务器发回的响应状态代码; Reason-Phrase表示状态    代码的文本描述 。

    2 响应头:上图显示的第(2-5)行内容。

    3 响应体:上图显示的第(7)行以后内容。

     

     



  • 相关阅读:
    大话设计模式Python实现-代理模式
    大话设计模式Python实现-装饰模式
    大话设计模式Python实现-策略模式
    设计模式Python实现-简单工厂模式
    Python文件读写机制
    python 多线程剖析
    I/O多路复用-EPOLL探索
    Python学习笔记:魔术方法详解
    Django学习笔记:为Model添加Action
    【Django】Django Debug Toolbar调试工具配置
  • 原文地址:https://www.cnblogs.com/Matchman/p/9041789.html
Copyright © 2011-2022 走看看