全面理解HTTP

作者: LuckyJing | 来源:发表于2015-10-07 11:11 被阅读10945次

    原文地址:http://www.luckyjing.com/posts/cp/http.html

    引言:作为一名软件工程Web专业学生,对于HTTP的熟悉掌握是必不可少的,特此做记录,打造自己的HTTP栈。

    URL与URI

    我们经常接触到的就是URL了,它就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢?
    URL:uniform resource location 统一资源定位符
    URI:uniform resource identifier 统一资源标识符
    这也就是说,URI是一种资源的标识;而URL也是一种URI,也是一种资源的标识,但它也指明了如何定位Locate到这个资源。
    URI是一种抽象的资源标识,既可以是绝对的,也可以是相对的。但是URL是一种URI,它指明了定位的信息,必须是绝对的。

    报文-通信的桥梁

    客户端和服务器端通过相互发送报文进行通信,要深刻理解HTTP协议,就需要理解报文的格式和内容。

    报文的组成


    无论是请求报文还是响应报文都需要有报文首部,当然报文主体并不是必需的。
    一般来说,请求报文的格式如下:


    看一下百度网站的请求报文:


    简单的报文形式:

    GET / HTTP/1.1    //请求行,包含用于请求的方法,请求的URI,HTTP版本
    //以下为各种首部字段
    Host: www.baidu.com
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0...
    Accept-Encoding: gzip, deflate, sdch
    Accept-Language: zh-CN,zh;q=0.8
    

    响应报文的格式如下:


    看一下百度网站的响应报文:

    HTTP/1.1 200 OK   //状态行,包含表明响应结果的状态码,原因短语和HTTP版本
    //以下为各种首部字段
    Server: bfe/1.0.8.5
    Date: Tue, 06 Oct 2015 14:48:28 GMT
    Content-Type: text/html;charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Cache-Control: private
    

    告知服务器意图的HTTP方法

    发送HTTP的方法有许多种,最常用的便是GET和POST,下面就这两种进行详细地说明。

    1. GET
      GET方法用来请求访问URI所指定的资源,(我想访问你的某个资源)并不对服务器上的内容产生任何作用结果;每次GET的内容都是相同的。GET方式把请求所需要的参数放到URL中,直接就可以在URL中看见,有大小限制。
    2. POST
      POST方法用来传输实体主体,目的并不是获取响应的主体内容,(我要把这条信息告诉你),POST方式则是把内容放在报文内容中,因此只要报文的内容没有限制,它的大小就没有限制。
    3. 总结
      GET用于获取某个内容,POST用于提交某种数据请求。
      按照使用场景来说,一般用户注册的内容属于私密的,这应该使用POST方式;而针对某一内容的查询,为了快速的响应,可以使用GET方式。

    无状态协议与Cookie

    HTTP是一种无状态协议,也就是每一次发送都是一次新的开始,服务器并不知道也没有必要知道当前连接的客户端是否之前有过交集,那么当需要进行保存用户登录状态时,则出现了麻烦,这个时候使用Cookie来保存状态。
    Cookie会根据服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段,通知客户端保存Cookie(保存在自己的电脑里),当下次客户端发送请求时,Cookie值会被添加到请求报文中发送出去。

    持久连接

    使用浏览器浏览一个包含多张图片的HTML页面时,浏览器会发起多次请求,如图所示:


    显而易见每次请求会造成无谓的TCP连接建立和断开,增加通信量的开销。

    引入持久连接

    持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。目前HTTP/1.1中默认为持久连接。

    Connection:keep-alive
    

    管线化

    管线化可以同时并行发送多个请求,不需要一个一个等待响应了。

    常见的状态码

    确保安全的HTTPS

    HTTP+加密+认证+完整性保护 = HTTPS
    一些登陆界面和购物结算界面使用HTTPS通信,也就是改用https://,HTTPS说简单点就是它的通信接口部分被SSL和TLS协议代替而已。

    身份认证

    有一些网址或者服务需要用户的身份信息,因此需要随时知道这些消息,但是肯定不能每次都让用户输入用户密码,因此关于认证就有下面几种方式:


    在这里主要说一下FormBase认证,也就是表单认证

    使用Cookie来管理Session

    1. 客户端把用户IE和密码等登录信息放入报文的实体部分,以POST方式发送给服务器。
    2. 服务器进行身份认证,产生SessionID,加入到Set-Cookie内,返回给客户端。
    3. 客户端接收到SessionID后,将其加入Cookie,下次请求时,浏览器会自动发送Cookie。

    在传输过程中,一种安全地保存密码方式是,先利用给密码加盐的方式增加额外信息,再使用散列hash函数计算出散列值后保存。

    书籍推荐:《图解HTTP》,轻松理解更全面的HTTP知识。

    相关文章

      网友评论

      • eb15e719394c:写的太简单。
      • a2edd4172c31:深度好文!
      • 9ae0682726c6:HTTP知识点总结的不错,图解HTTP, 明天就去图书馆借来看
      • liyangyao:求教图片是拿什么工具做的?
        LuckyJing:@liyangyao ppt 2013版本的
      • mconintet:不是 form based 吗 https://en.m.wikipedia.org/wiki/Form-based_authentication
        LuckyJing:@mconintet 受教了,我再去学习下,谢谢~
        mconintet:@LuckyJing 开始是你打错单词了,应该是 form based。然后看你回复的内容,好像你对验证和加密的理解有点偏差。用户身份验证的话是使用的各类验证方式:HTTP authentication、Form based authentication 等等;而 TLS 就和它的名字一样,只是传输层加密、加密通信的内容,包括了用户身份验证(HTTP authentication、Form based authentication等)的信息。表单本身对其内容并没有加密,只是 encoding(multipart/form-data)。虽然在 TLS 的握手阶段双方是可以使用对方的公匙去验证身份的,但是在 HTTP over TLS 的时候服务端作为服务的提供者并没有验证用户的公匙是否是访问受限的,而是客户端(浏览器)会验证服务端提供的证书信息,这刚好和用户身份验证相反,是客户端验证服务端(上面说的用户身份验证是服务端验证客户端)。
        LuckyJing:@mconintet 验证登录的话,用https ,就是SSL,公密钥去验证,安全一些,用基于表单的,就是要在传输过程中对密码进行加密然后去判定,是这样吧?
      • Kaiyulee:不错,《HTTP权威指南》可以读一下。
      • 量U移动广告归因:讲的太简略了 还能再深入一点就更好了
      • 布客飞龙:不把cookie隐藏一下?
      • 许还真:赞
        复习了
      • 化浊:我是从以太网frame -> IP -> TCP/UDP -> HTTP, 一步步往上走上去的。当然学的也不扎实,懂点皮毛而已。个人感觉无论什么东西,了解些实现的细节总是有益于对概念的理解的。
        LuckyJing:@化浊 恩,的确是这样,网络还得继续啃下去,主要是做前端,所以想把ajax深入理解下,得补补http知识
      • 作死的节奏:学习了
      • 952625a28d0d:好详细
      • eae525f215b7:浅显易懂
      • 皆静:挺厉害的
      • 安央未昕:it 一族们;-)
      • iHTCboy:授渔于人!
      • 2b2de9c5cc2d:涨知识了
      • e4bf382529b8:不错,学习了
      • f1db2696ff9a:涨姿势
      • 4a4a8be5293b:在看这本书
      • 43ecff54edc3:虽然不太懂
      • 超级向向阳:正好前段时间看了这本书,当做复习了,谢谢分享
      • stonemaker:好文章,学习了

      本文标题:全面理解HTTP

      本文链接:https://www.haomeiwen.com/subject/jxxncttx.html