zoukankan      html  css  js  c++  java
  • TCP&HTTP协议详解

           超文本传输协议(Hyper Text Transfer Protocol,HTTP)是互联网上应用最为广泛的一种网络协议。所有的WWW服务器都基于该协议。HTTP设计最初的目的是为了提供一种发布WEB页面和接收WEB页面的方法。

    本章向读者介绍TCP、HTTP协议、HTTP资源定位、HTTP请求及响应头详细信息、HTTP状态码及MIME类型详解等。

    一、TCP协议与HTTP协议

          1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hyper text),为HTTP超文本传输协议标准架构的发展奠定了根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。

           很多读者对TCP协议与HTTP协议存在疑问,这两者有什么区别呢,从应用领域来说,TCP协议主要用于数据传输控制,而HTTP协议主要用于应用层面的数据交互,本质上两者没有可比性。

          HTTP协议属于应用层协议,是建立在TCP协议基础之上,HTTP协议以客户端请求和服务器端应答为标准,浏览器通常称为客户端,而WEB服务器称之为服务器端。客户端打开任意一个端口向服务端的指定端口(默认为80)发起HTTP请求,首先会发起TCP三次握手,TCP三次握手的目的是建立可靠的数据连接通道,TCP三次握手通道建立完毕,进行HTTP数据交互,如图所示:

                            

                                                                 图   HTTP与TCP关系结构图

                            

                                                                    图 HTTP客户端与服务器

           当客户端请求的数据接收完毕后,HTTP服务器端会断开TCP连接,整个HTTP连接过程非常短。HTTP连接也称为无状态的连接,无状态连接是指客户端每次向服务器发起HTTP请求时,每次请求都会建立一个新的HTTP连接,而不是在一个HTTP请求基础上进行所有数据的交互。

    二、资源定位标识符

    发起HTTP请求的内容资源由统一资源标示符(Uniform Resource Identifiers,URI)来标识,关于资源定位及标识有三种:URI、URN、URL,三种资源定位详解如下:

    1)统一资源标识符(uniform resource identifier,URI),用来唯一标识一个资源;

    2)统一资源定位器(uniform resource locator,URL),是一种具体的URI。URL可以用来标识一个资源,而且访问或者获取该资源;

    3)统一资源命名(uniform resource name,URN),通过名字来标识或识别资源。

    如图9-2所示,可以直观区分URI、URN、URL的区别:

                           

                                                                   图  URI、URN、URL关联与区别

    三种资源标识,其中URL资源标识方式使用最为广泛,完整的URL标识格式如下:

    protocol://host[:port]/path/.../[?query-string][#anchor]
    protocol          基于某种协议,常见协议:http、https、ftp、rsync等;
    host              服务器的IP地址或者域名;
    port              服务器的端口号,如果是HTTP 80端口,默认可以省略。
    path              访问资源在服务器的路径;
    query-string      传递给服务器的参数及字符串;
    anchor-           锚定结束;

    Http URL案例演示如下:

    http://www.jfedu.net/newindex/plus/list.php?tid=2#jfedu
    protocol:                  http协议;
    host:                    www.jfedu.net;
    path:                    /newindex/plus/list.php
    Query String:             tid=2
    Anchor:                 jfedu

    三、HTTP与端口通信

           HTTP WEB服务器默认在本机会监听80端口,不仅HTTP会开启监听端口,其实每个软件程序在Linux系统中运行,会以进程的方式启动,程序就会启动并监听本地接口的端口,为什么会引入端口这个概念呢?

           端口是TCP/IP协议中应用层进程与传输层协议实体间的通信接口,端口是操作系统可分配的一种资源,应用程序通过系统调用与某个端口绑定后,传输层传给该端口的数据会被该进程接收,相应进程发给传输层的数据都通过该端口输出。

           在网络通信过程中,需要唯一识别通信两端设备的端点,就是使用端口识别运行于某主机中的应用程序。如果没有引入端口,则只能通过PID进程号进行识别,而PID进程号是系统动态分配的,不同的系统会使用不同的进程标识符,应用程序在运行之前没有明确的进程号,如果需要运行后再广播进程号则很难保证通信的顺利进行。

           而引入端口后,就可以利用端口号识别应用程序,同时通过固定端口号来识别和使用某些公共服务,例如如HTTP默认使用80端口,而FTP使用21、20端口,MYSQL则使用3306端口。

            使用端口还有一个原因是随着计算机网络技术的发展,物理机器上的硬件接口已不能满足网络通信的要求,而TCP/IP协议模型作为网络通信的标准就解决了这个通信难题。

    TCP/IP协议中引入了一种被称为套接字(Socket)的应用程序接口。基于Socket接口技术,一台计算机就可以与任何一台具有Socket接口的计算机进行通信,而监听的端口在服务器端也称之为Socket接口。

    四、HTTP Request与Response详解

          客户端浏览器向WEB服务器发起Request, Web服务器接到Request后进行处理,会生成相应的Response信息返给浏览器,客户端浏览器收到服务器返回的Response信息,会对信息进行解析处理,最终用户看到浏览器展示WEB服务器的网页内容。

    客户端发起Request,Request消息分为三个部分,分别包括:Request line、Request header、Body,如图所示:

                          

                                                          图   HTTP Request Message组成

    Unix/Linux系统中执行CURL -v命令可以打印访问WEB服务器的Request及Response详细处理流程,如图所示:

    curl  -v  http://192.168.111.131/index.html

                               

    1)Request信息详解如表所示:

    GET /index.html  HTTP/1.1

    请求行

     

     

     

    Request Message

    User-Agent: curl/7.19.7

    Host: 192.168.111.131

    Accept: */*

    ……

     

    请求头部

    空行

    请求Body

    第一部分:请求行,指定请求类型,访问的资源及使用的HTTP协议版本。

    GET表示Request请求类型为GET;/index.html表示访问的资源;HTTP/1.1表示协议版本。

    第二部分:请求头部,请求行下一行起,指定服务器要使用的附加信息;

    User-Agent 表示用户使用的代理软件,常指浏览器;HOST表示请求的目的主机。

    第三部分:空行,请求头部后面的空行表示请求头发送完毕。

    第四部分:请求数据也叫Body,可以添加任意的数据,Get请求的Body内容默认为空。

     2)Response信息详解如表所示:

    HTTP/1.1 200 OK

    响应行

     

     

     

    Response Message

    Server: nginx/1.10.1

    Date: Thu, 11 May 2017

    Content-Type: text/html

    ……

     

    响应头部

    空行

    <h1>www.jf1.com Pages</h1>

    响应Body

    第一部分:响应状态行,包括HTTP协议版本号、状态码、状态消息。

    HTTP/1.1表示HTTP协议版本号;200表示返回状态码;OK表示状态消息。

    第二部分:消息报头,响应头部附加信息。

    Date表示生成响应的日期和时间,Content-Type表示指定MIME类型的HTML(text/html),编码类型是UTF-8,记录文件资源的Last-Modified时间。

    第三部分:空行,表示消息报头响应完毕。

    第四部分:响应正文,服务器返回给客户端的文本信息。

     3)Request请求方法根据请求的资源不同,有如下请求方法:

    GET方法,        向特定的资源发出请求,获取服务器端数据;
    POST方法,       向WEB服务器提交数据进行处理请求,常指提交新数据;
    PUT方法,        向WEB服务器提交上传最新内容,常指更新数据;
    DELETE方法,     请求删除Request-URL所标识的服务器资源;
    TRACE方法,      回显服务器收到的请求,主要用于测试或诊断;
    CONNECT方法,    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器;
    OPTIONS方法,    返回服务器针对特定资源所支持的HTTP请求方法;
    HEAD方法,       HEAD方法跟GET方法相同,只不过服务器响应时不会返回消息体。

    五、HTTP 1.0/1.1协议区别

    HTTP 协议定义服务器端和客户端之间文件传输的沟通方式HTTP1.0运行方式,如图所示:

                        

                                                            图 HTTP1.0 客户端、服务器传输模式

    1)基于HTTP协议的客户/服务器模式的信息交换过程,如图所示,它分四个过程,建立连接、发送请求信息、发送响应信息、关闭连接;

    2)浏览器与WEB服务器的连接过程是短暂的,每次连接只处理一个请求和响应。对每一个页面的访问,浏览器与WEB服务器都要建立一次单独的连接;

    3)浏览器到WEB服务器之间的所有通讯都是完全独立分开的请求和响应。

                         

                                                       图 HTTP1.1 客户端、服务器传输模式

    1)在一个TCP连接上可以传送多个HTTP请求和响应;

    2)多个请求和响应过程可以重叠;

    3)增加了更多的请求头和响应头,比如Host、If-Unmodified-Since请求头等。

    六、HTTP状态码详解

    HTTP状态码(HTTP Status Code)是用来表示WEB服务器HTTP Response状态的3位数字代码,常见的状态码范围分类:

    100-199                用于指定客户端应相应的某些动作;
    200-299                用于表示请求成功;
    300-399                已移动的文件且被包含在定位头信息中指定新的地址信息;
    400-499                用于指出客户端的错误;
    500-599                用于支持服务器错误。

    HTTP协议Response常用状态码详解表所示:

    HTTP状态码

    状态码英文含义

    状态码中文含义

    100

    Continue

    HTTP/1.1新增状态码,表示继续,客户端继续请求HTTP服务器;

    101

    Switching Protocols

    服务器根据客户端的请求切换协议,切换到HTTP的新版本协议;

    200

    OK

    HTTP请求完成,常用于GET、POST请求中;

    301

    Moved Permanently

    永久移动,请求的资源已被永久的移动到新URI;

    302

    Found

    临时移动,资源临时被移动,客户端应继续使用原有URI;

    304

    Not Modified

    文件未修改,请求的资源未修改,服务器返回此状态码时,常用于缓存;

    400

    Bad Request

    客户端请求的语法错误,服务器无法解析或者访问;

    401

    Unauthorized

    请求要求用户的身份认证;

    402

    Payment Required

    此状态码保留,为以后使用;

    403

    Forbidden

    服务器理解请求客户端的请求,但是拒绝执行此请求;

    404

    Not Found

    服务器没有该资源,请求的文件找不到;

    405

    Method Not Allowed

    客户端请求中的方法被禁止;

    406

    Not Acceptable

    服务器无法根据客户端请求的内容特性完成请求;

    499

    Client has closed connection

    服务器端处理的时间过长;

    500

    Internal Server Error

    服务器内部错误,无法完成请求;

    502

    Bad Gateway

    服务器返回错误代码或者代理服务器错误的网关;

    503

    Service Unavailable

    服务器无法响应客户端请求,或者后端服务器异常;

    504

    Gateway Time-out

    网关超时或者代理服务器超时;

    505

    HTTP Version not supported

    服务器不支持请求的HTTP协议的版本,无法完成处理。

                                                                                 表    HTTP常用状态码

    七、HTTP MIME 类型支持

            浏览器接收到WEB服务器的Response信息,浏览器会进行解析,在解析页面之前,浏览器必须启动本地相应的应用程序来处理获取到的文件类型。

           基于多用途互联网邮件扩展类型 (Multipurpose Internet Mail Extensions,MIME),可以明确某种文件在客户端用某种应用程序来打开,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开,设计之初是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它使得HTTP传输的不仅是普通的文本,可以支持更多文件类型、多媒体音、视频等。

            在HTTP协议中,HTTP Response消息,MIME类型被定义在Content-Type header中,例如:Content-Type: text/html,表示默认指定该文件为html类型,在浏览器端会以HTML格式来处理。

           在最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML文档,为了支持多媒体数据类型,新版HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型,如表所示:

    Mime-Types(MIME类型)

    Dateiendung (扩展名)

    Bedeutung

    application/msexcel

    *.xls *.xla

    Microsoft Excel Dateien

    application/mshelp

    *.hlp *.chm

    Microsoft Windows Hilfe Dateien

    application/mspowerpoint

    *.ppt *.ppz *.pps *.pot

    Microsoft Powerpoint Dateien

    application/msword

    *.doc *.dot

    Microsoft Word Dateien

    application/octet-stream

    *.exe

    exe

    application/pdf

    *.pdf

    Adobe PDF-Dateien

    application/post******

    *.ai *.eps *.ps

    Adobe Post******-Dateien

    application/rtf

    *.rtf

    Microsoft RTF-Dateien

    application/x-httpd-php

    *.php *.phtml

    PHP-Dateien

    application/x-java******

    *.js

    serverseitige Java******-Dateien

    application/x-shockwave-flash

    *.swf *.cab

    Flash Shockwave-Dateien

    application/zip

    *.zip

    ZIP-Archivdateien

    audio/basic

    *.au *.snd

    Sound-Dateien

    audio/mpeg

    *.mp3

    MPEG-Dateien

    audio/x-midi

    *.mid *.midi

    MIDI-Dateien

    audio/x-mpeg

    *.mp2

    MPEG-Dateien

    audio/x-wav

    *.wav

    Wav-Dateien

    image/gif

    *.gif

    GIF-Dateien

    image/jpeg

    *.jpeg *.jpg *.jpe

    JPEG-Dateien

    image/x-windowdump

    *.xwd

    X-Windows Dump

    text/css

    *.css

    CSS Stylesheet-Dateien

    text/html

    *.htm *.html *.shtml

    -Dateien

    text/java******

    *.js

    Java******-Dateien

    text/plain

    *.txt

    reine Textdateien

    video/mpeg

    *.mpeg *.mpg *.mpe

    MPEG-Dateien

    video/vnd.rn-realvideo

    *.rmvb

    realplay-Dateien

    video/quicktime

    *.qt *.mov

    Quicktime-Dateien

    video/vnd.vivo

    *viv *.vivo

    Vivo-Dateien

                                                                                表   HTTP MIME类型详解
     

  • 相关阅读:
    57.适合自己的就是最好的
    45.懂得放弃
    ASP.NET碎知识点
    app性能测试理论基础一篇
    记一次踩坑docker+Jenkins+python3.6.8+gitee
    IT测试人从浓密到稀疏的的发量之路
    一天基本上没什么效率
    如此复杂的心情,如此失落的感觉…
    String.Replace 方法 (String, String)
    《见与不见》原题《班扎古鲁白玛的沉默》 作者:扎西拉姆·多多
  • 原文地址:https://www.cnblogs.com/deny/p/10022644.html
Copyright © 2011-2022 走看看