• http协议


    概要


    超文本文档中包括有超链接,指向其它的资源。超文本文档是万维网(WorldWide Web。即www)的基础。

    HTTP协议解决文件传输的问题。HTTP是应用层协议,主要建立在TCP协议之上(偶尔也能够UDP为底层)。

    它随着万维网的发展而流行。HTTP协议目的是,怎样在万维网的网络环境下。更好的利用TCP协议,以实现文件,特别是超文本文件的传输。

    早期的HTTP协议主要传输静态文件,即真实存储在server上的文件。

    随着万维网的发展,HTTP协议被用于传输“动态文件”。server上的程序依据HTTP请求即时生成的动态文件。我们将HTTP的传输对象统称为资源(resource)。

     

    点单

     

    HTTP实现了资源的订购和传送。其工作方式类似于快餐点单。

    请求(request):顾客向服务员提出请求:“来个鸡腿汉堡”。

    回复(response):服务员依据情况,回应顾客的请求

     

    依据情况的不同,服务员的回应可能有非常多。比方:

    服务员准备鸡腿汉堡,将鸡腿汉堡交给顾客。(一切OK)

    服务员发现自己仅仅是个甜品站。

    他让顾客前往正式柜台点单。(又一次定向)

    服务员告诉顾客鸡腿汉堡没有了。

    (无法找到)

    交易结束后,服务员就将刚才的交易抛到脑后。准备服务下一位顾客。

     

    以下来看一下HTTP是怎样详细实现的。

     

    格式

     

    HTTP协议的通信是一次request-responce交流。client(guest)向server发出请求(request)。server(server)回复(response)client。

     


    HTTP协议规定了请求和回复的格式:

    起始行(start line)
    头信息 (headers)

    主体(entitybody)

     

    起始行仅仅有一行。它包括了请求/回复最重要的信息。请求的起始行表示(顾客)“想要什么”。回复的起始行表示(后厨)“发生什么”。

    头信息能够有多行。每一行是一对键值对(key-valuepair)。比方:

    Content-type:text/plain

    它表示。包括有一个名为Content-type的參数,该參数的值为text/plain。头信息是对起始行的补充。请求的头信息对server有指导意义(好像在菜单上注明: 鸡腿不要辣)。

    回复的头信息则是提示client(比方,在盒子上注明: 小心烫)

    主体部分包括了详细的资源。

    上图的请求中并没有主体,由于我们仅仅是在下单。而不用该后厨送什么东西(请求是能够有主体内容的)。

    回复中包括的主体是一段文本文字(Hello World!)。

    这段文本文字正是顾客所期待的,鸡腿汉堡。

     

    请求

     

    我们深入一些细节。先来看一下请求:

    GET /index.htmlHTTP/1.1
    Host: www.example.com

    在起始行中,有三段信息:

    GET方法。用于说明想要server运行的操作。

    /index.html资源的路径。

    这里指向server上的index.html文件。

    HTTP/1.1协议的版本号。HTTP第一个广泛使用的版本号是1.0,当前版本号为1.1。

    早期的HTTP协议仅仅有GET方法。遵从HTTP协议,server接收到GET请求后,会将特定资源传送给客户。

    这类似于客户点单,并获得汉堡的过程。

    使用GET方法时,是客户向server索取资源,所以请求往往没有主体部分。

    GET方法也能够用于传输一些不重要的数据。它是通过改写URL的方式实现的。GET的数据利用URL?变量名=变量值的方法传输。比方向http://127.0.0.1发送一个变量“q”。它的值为“a”。那么,实际的URL为http://127.0.0.1?q=a。

    server收到请求后,就能够知道"q"的值为"a"。

    GET方法之外,最经常使用的是POST方法。它用于从client向server提交数据。

    使用POST方法时,URL不再被改写。

    数据位于http请求的主体。POST方法最用于提交HTML的form数据。

    server往往会对POST方法提交的数据进行一定的处理,比方存入server数据库。

    例子请求中有一行头信息。该头信息的名字是Host。

    HTTP的请求必须有Host头信息,用于说明server的地址和port。

    HTTP协议的默认port是80,假设在HOST中没有说明port,那么将默认採取该port。

    在该例子中。server的域名为www.example.com。port为80。域名将通过DNSserver转换为IP地址,从而确定server在互联网上的地址。

     

    回复

     

    server在接收到请求之后,会依据程序。生成相应于该请求的回复,比方:

    HTTP/1.1200 OK
    Content-type: text/plain
    Content-length: 12

    HelloWorld!

    回复的起始行相同包括三段信息

    HTTP/1.1 协议版本号

    200 状态码(status code)。

    OK 状态描写叙述

    OK是对状态码200的文字描写叙述,它仅仅是为了便于人类的阅读。电脑仅仅关心三位的状态码(statuscode),即这里的200。200表示一切OK,资源正常返回。状态码代表了server回应动作的类型。

    其他常见的状态码还有:

    302,又一次定向(redirect):我这里没有你想要的资源,但我知道还有一个地方xxx有,你能够去那里找。

    404。无法找到(not found):我找不到你想要的资源,无能为力。

    (又一次定向时,client能够依据302的建议前往xxx寻找资源。也能够忽略该建议。)

    Content-type说明了主体所包括的资源的类型。依据类型的不同,client能够启动不同的处理程序(比方显示图像文件,播放声音文件等等)。以下是一些常见的资源

    text/plain 普通文本

    text/html HTML文本

    image/jpeg jpeg图片

    image/gif gif图片

    Content-length说明了主体部分的长度。以字节(byte)为单位。

    回应的主体部分为一段普通文本,即

    Hello World!

     

    无状态

     

    依据早期的HTTP协议,每次request-reponse时,都要又一次建立TCP连接。TCP连接每次都又一次建立,所以server无法知道上次请求和本次请求是否来自于同一个client。因此,HTTP通信是无状态(stateless)的。

    server觉得每次请求都是一个全新的请求。不管该请求是否来自同一地址。

    想象高级餐厅和快餐店。高级餐厅会知道客人所在的位置。假设新增点单,那么服务员知道这和上一单同一桌。而在快餐店中,不好意思,服务员并不记录客人的特征。想再次点单?请又一次排队……

    随着HTTP协议的发展,HTTP协议同意TCP连接复用,以节省建立连接所耗费的时间。但HTTP协议依旧保持无状态的特性。

     

    总结

    HTTP协议实现了万维网上的资源传输,採用request-response的工作方式。



  • 相关阅读:
    c#中ref与out区别
    【转载】Firebug中net面板的使用
    结构声明、定义
    开始旅程了
    strcpy、strcat、strcmp、strlen
    #include 格式
    宏定义
    MySQL 字段类型
    MySQL 约束类型
    (转载)C#语言之“string格式的日期时间字符串转为DateTime类型”的方法
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5222270.html
Copyright © 2020-2023  润新知