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

    HTTP是一个基于请求和响应模式的无状态,应用层的协议,常基于TCP的连接方式,广泛应用于B/S(浏览器/服务器)模式。

    http工作流程

    1、  首先客户端和服务器建立tcp连接。  

    2、  客户端发送请求报文,请求相关URL

    3、  服务器接收到请求之后,返回应答,即响应报文

    4、  客户端将内容显示在浏览器上,然后断开连接

    http报文特点

    1、  支持客户/服务器模式   C/S

    2、  简单快速:客户像服务器请求服务时,只需要传送请求方法和路径(常用的有GET HEAD POST方式)

    3、  灵活:HTTP允许传输任意类型的数据对象,其类型由content-Type加以标志

    4、  链接:限制每次连接只处理一个请求,处理完就断开链接。由于HTTP基于TCP协议,因此当客户端连续请求时,这种处理方式导致时间开销较大(需多次建立TCP连接),这种情形下采用长连接会比较有效。

    5、  无状态:是指协议对于事务处理没有记忆能力,如果客户端请求同样的资源,需重传需要的数据。

    补充:

    a)      关于长连接和短连接:

             客户端的长连接不可能无限期持续着,这样会造成服务器的并发量太大,因此需要有一个超时时间timeout(keep-alive表示持续连接),如


        另外还可能指定max =xxx,指示这个长连接最多接收XXX此请求就断开。如果没有指定超时时间,服务端也可以执行四次挥手断开链接。总之,服务端为了控制并发量,需要有相应的解决措施。

    b)      关于服务端如何判断传输结束:

        判断传输的数据量是否达到Content-Length大小;没有Content-Length字段的采用chunked编码来判断,在传输的最后会有一个空的chunked块。

        另外,为了控制客户端并发量,有的服务器只支持一个客户端只能有一个连接。常见的情形就是不支持多线程下载。                 

    c) 流水线技术

    指在一个TCP连接内,多个HTTP请求可以并行(像流水线一样),即在下一个HTTP请求的应答完成之前就发起;现在还有很多技术瓶颈待解决,因此应用的还不广泛。如果使用流水线技术,那么客户端多连接并不能提高效率(都是带宽充分利用),除非需要抢占资源。

    这里顺便提一下抓包软件wireshark,该软件可以抓取通过网卡的数据包。对于http协议而言,当http报文太大,到传输层就要进行TCP分片传输,然后到目的端再进行组装。在早些时候的wireshark软件中,分析出来的就是tcp包,而不是http报文(过滤选项过滤不出http),在1.12版本中已经可以过滤出来了,对分析而言方便了不少。

    HTTP报文格式

        HTTP报文分为请求报文和响应报文两种,其报文格式分别如下:

             请求报文包含请求行、首部行、空行及主体,格式如下:


    图 1 请求报文格式

             响应报文包含状态行、首部行、空行及主体


    图 2 响应报文格式

             状态码是一个三位整数,其中第一位定义的响应的类型:

             1xx:信息响应类,表示接收到请求并且继续处理 

             2xx:处理成功响应类,表示动作被成功接收、理解和接受 

             3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理 

             4xx:客户端错误,客户请求包含语法错误或者是不能正确执行 

             5xx:服务端错误,服务器不能正确执行一个正确的请求 

        讲了那么多,现在实际分析一下:

             wireshark抓取请求www.baidu.com的http报文,其请求报文和响应报文如下:


    图 3 请求报文


    图 4 响应报文

        从请求报文中可以看出请求报文没有主体部分(图中没标出,可以自己实践一下)响应码可以看出资源重定向了。当成功获取请求,响应码为200 ok

     

    参考链接:

    HTTP协议详解http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

    HTTP的长连接和短连接http://www.cnblogs.com/cswuyg/p/3653263.html  

  • 相关阅读:
    清空数据库所有表数据
    sqlserver编号
    Inherits、CodeFile、CodeBehind的区别
    初识NuGet
    ASP.Net各个命名空间及作用
    SQL SERVER数据库性能优化之SQL语句篇
    Exercise 20: Functions And Files
    Exercise 19: Functions And Variables
    Exercise 18: Names, Variables, Code, Functions
    Exercise 17: More Files
  • 原文地址:https://www.cnblogs.com/OpenLinux/p/5020708.html
Copyright © 2011-2022 走看看