精华内容
下载资源
问答
  • URI与URL的区别一.先来序言一段二.协议的自定义的理解三.自定义协议URL关系四.URL自定义私有协议实战五.后话,自定义mineType解析器
  • 浅析HTTP协议

    千次阅读 多人点赞 2016-07-30 17:24:37
    HTTP协议

    以下内容是本人阅读《图解HTTP》后的个人笔记和总结

    一、HTTP入门

    1、HTTP是一个属于应用层的面向对象的协议,它是基于TCP协议的可靠传输,采用客户端/服务器端模式,由客户端发起请求,服务端进行响应。

    2、HTTP是一种无状态协议,即不保存状态,它不对之前发生过的请求和响应的状态进行管理。每当有新的请求发送时,就会有对应的新响应产生,协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性而设计的。但同时也带来了一些不便,比如,用户登录到一家购物网站,即使他跳转到该网站的其他页面,也需要能继续保持登录状态,为了实现期望的保持状态功能,于是就引入了Cookie技术。(Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当客户端下次再往服务器端发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。服务器端发现客户端发送过来的Cookie后,会去检和比对服务器上的记录,最后得到之前的状态信息。)

    3、URL(Uniform Resource Locator,统一资源定位符)是我们使用Web浏览器等访问Web页面时需要输入的网页地址,比如http://www.baidu.com。URI(Uniform Resource Identifier,统一资源标识符)是由某个协议方案表示的资源的定位标识符,协议方案是指访问资源所使用的协议类型名称。URI用字符串标识某一互联网资源,而URL表示资源的地址,可见URL是URI的子集。

    二、HTTP中的方法

    HTTP/1.1中可使用的方法(方法名区分大小写):
    (1)GET:获取资源
    GET方法用来请求访问已被URI识别的资源,指定的资源经服务器端解析后返回响应内容。
    (2)POST:传输实体主体
    POST方法用来传输实体的主体。虽然GET方法也可以传输,但一般不用GET方法进行传输。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容。
    (3)HEAD:获得报文首部
    HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性和资源更新的日期时间等。
    (4)PUT:传输文件
    PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置。但是由于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,所以一般不使用该方法。
    (5)DELETE:删除文件
    DELETE方法用来删除文件。DELETE方法按请求URI删除指定的资源。但是和PUT一样不带验证机制,所以一般也不是用该方法。
    (6)OPTIONS:询问支持的方法
    OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
    (7)TRACE:追踪路径
    TRACE方法时让Web服务器端将之前的请求通信环回给客户端的方法。
    (8)CONNECT:要求用隧道协议连接代理
    CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输安全层)协议把通信内容加密后经网络隧道传输。

    三、HTTP报文概要

    用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP报文叫做请求报文,响应端的叫做响应报文。HTTP报文由报文首部、空行和报文主体三部分组成,通常,并不一定要有报文主体。请求报文和响应报文的结构如下图:

    这里写图片描述这里写图片描述
    请求报文和响应报文的首部内容由以下数据组成:

    • 请求行:包含用于请求的方法、请求URI和HTTP版本。
    • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
    • 首部字段:包含表示请求和响应的各种条件和属性的各类首部。
    • 其他:可能包含HTTP的RFC里未定义的首部(Cookie等)。

    四、HTTP状态码

    状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。状态码的类别有以下5种:

    类别原因短语
    1xx信息性状态码接收的请求正在处理
    2xx成功状态码请求正常处理完毕
    3xx重定向状态码需要进行附加操作以完成请求
    4xx客户端错误状态码服务器无法处理请求
    5xx服务端错误状态码服务器处理请求出错

    常见的状态码如下:
    2xx 成功

    • 200 OK:表示从客户端发来的请求在服务器端被正常处理了。
    • 204 No Content:该状态码代表服务器接收的请求已经成功处理,但在返回的响应报文中不含实体的主体部分。
    • 206 Partial Content:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的请求。响应报文中包含由Content-Range指定范围的实体内容。

    3xx 重定向

    • 301 Moved Permanently:永久性重定向。该状态码表示请求的资源已被分配了新的URI,以后应该使用现在资源所指的URI。
    • 302 Found:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能使用新的URI访问。
    • 303 See Other:该状态码表示由于请求对应的资源存在着另外一个URI,应使用GET方法定向获取请求的资源。
    • 304 Not Modified:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后直接返回304。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系。(附带条件的请求时指采用GET方法的请求报文中包含If-Match、If-Modified-Since、If-Range等任一首部)
    • 307 Temporary Redirect:临时重定向。该状态码与302 Found有着相同的含义。

    4xx 客户端错误

    • 400 Bad Request:该状态码表示请求报文中存在语法错误。

    • 401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。另外若之前已进行过1次请求,则表示用户认证失败。

    • 403 Forbidden:该状态码表明对请求资源的访问被服务器拒绝了。未获得文件系统的访问授权,访问权限出现某些问题等情况都可能发生403。

    • 404 Not Found:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

    5xx 服务器错误

    • 500 Internal Server Error:该状态码表明服务器端在执行请求时发生了错误,也有可能是Web应用存在的Bug或某些临时的故障。

    • 503 Service Unavailable:该状态码表明服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。

    五、HTTP报文首部详解

    HTTP请求报文由方法、URI、HTTP版本、HTTP首部字段等部分构成。
    HTTP响应报文由HTTP版本、状态码、HTTP首部字段三部分组成。
    HTTP首部字段是构成HTTP报文的要素之一,无论是请求还是响应都会使用首部字段,它能起到传递额外信息的重要作用。
    HTTP首部字段根据实际用途被分为以下4种类型:

    • 通用首部字段:请求报文和响应报文都会使用的首部。
    • 请求首部字段:客户端向服务器端发送请求报文时使用的首部。
    • 响应首部字段:服务器端向客户端返回响应报文时使用的首部。
    • 实体首部字段:针对请求报文和响应报文的实体部分使用的首部。

    1、通用首部字段

    (1)Cache-Control
    通过指定首部字段Cache-Control的指令,就能控制缓存的行为。例如:Cache-Control: private, max-age=0, no-cache
    缓存请求指令:

    指令参数说明
    no-cache强制向源服务器再次验证,客户端不会接收缓存过的响应
    no-store不缓存请求或响应的任何内容
    max-age = [秒]必需 响应的最大时间值(会使Expires字段失效)
    max-stale( = [秒])可省略即使过期,只要处于指定时间内,也照常接收资源
    min-fresh = [秒]必需要求返回至少还未过指定时间的缓存资源
    no-transform代理不可更改媒体类型
    only-if-cached仅从缓存获取资源,如果无响应则返回504 Gateway Timeout
    cache-extension 新指令标记,可以扩展Cache-Control首部字段内的指令

    缓存响应指令:

    指令参数说明
    public 可向任意方提供响应的缓存
    private可省略仅向特定用户返回响应
    no-cache可省略缓存前必须先确认其有效性,不缓存过期的资源
    no-store不缓存请求或响应的任何内容(这个才是真正的不进行缓存)
    no-transform要求代理不可更改媒体类型,可防止缓存或代理压缩图片等类似操作
    must-revalidate代理会向源服务器再次验证即将返回的响应缓存是否仍然有效(会使max-stable失效)
    proxy-revalidate 要求中间缓存服务器对缓存的响应有效性再进行确认
    max-age = [秒]必需 响应的最大时间值(会使Expires字段失效)
    s-maxage = [秒]必需公共缓存服务器响应的最大时间值(会使Expires字段失效)
    cache-extension 新指令标记,可以扩展Cache-Control首部字段内的指令

    (2)Connection
    Connection字段用来控制不再转发给代理的首部字段和管理持久连接。HTTP/1.1版本的默认连接都是持久连接,当服务端想断开连接时,可以指定Connection首部字段的值为Close。HTTP/1.1之前的版本默认都是非持久化连接,如果想维持持续连接,则需要指定Connection的值为Keep-Alive。
    (3)Date
    首部字段Date表明创建HTTP报文的日期和时间。
    (4)Pragma
    这个字段是HTTP/1.1之前的版本遗留下来的,仅作为向后兼容而定义的。它只用在客户端发送的请求中,要求中间服务器不返回缓存的资源(no-cache)。
    (5)Trailer
    首部字段Trailer会事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时。
    (6)Transfer-Encoding
    首部字段Transfer-Encoding规定了传输报文主体时采用的编码方式。
    (7)Upgrade
    首部字段Upgrade用于检测HTTP协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
    (8)Via
    使用首部字段Via是为了追踪客户端与服务器之间的请求和响应报文的传输路径,还可以避免请求回环的发生。报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再进行转发。
    (9)Warning
    首部字段Warning会告知用户一些与缓存相关的问题的警告。

    2、请求首部字段

    (1)Accept
    Accept首部字段可通知服务器用户代理能够处理的媒体类型及媒体类型的相对优先级。比如,如果浏览器不支持gif图片的显示,那Accept就不指定image/gif,而可以指定image/png和image/jpeg等类型。当有多种类型时,可以使用q来表示权重,范围为0~1,不指定权重时,默认为1.0。比如下面,表示给我HTML格式的啊,没有的话text格式也行:

    Accept: text/plain; q=0.3, text/htm

    (2)Accept-Charset
    Accept-Charset首部字段可用来通知服务器用户代理支持的字符集及字符集的相对优先顺序。比如:

    Accept-Charset: iso-8859-5, unicode-1-1; q=0.8

    (3)Accept-Encoding
    Accept-Encoding首部字段用来告知服务器用户代理支持的内容编码及内容编码的优先级顺序。比如:

    Accept-Encoding: gzip, deflate

    (4)Accept-Language
    Accept-Language首部字段用来告知服务器用户代理能够处理的自然语言集,以及自然语言集的相对优先级。比如,表示的意思是有中文版的给我中文版的,没有的话英文也行。

    Accept-Language: zh-cn,zh; q=0.7, en-us,en; q=0.3

    (5)Authorization
    Authorization首部字段是用来告知服务器用户代理的认证信息。
    (6)Expect
    客户端使用Expect来告知服务器,期望出现的某种特定行为。如果服务器无法理解客户端的期望而发生错误时,会返回417 Expectation Failed。
    (7)Form
    Form首部字段用来告知服务器使用用户代理的用户的电子邮件地址。
    (8)Host
    首部字段Host会告知服务器,请求的资源所处的互联网主机名和端口号。它是唯一一个必须被包含在请求内的首部字段。当相同的IP地址下部署运行着多个域名,就需要使用首部字段Host来指出请求的主机名。比如:

    Host: sp0.baidu.com

    (9)If-xxx
    If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Ranged都为条件请求,服务器接收到附带条件的请求后,只有判定指定条件为真时才会执行请求。
    (10)Max-Forwards
    通过TRACE或OPTIONS方法发送包含首部字段Max-Forwards的请求时,指定了可经过的服务器最大数目。当服务器接收到Max-Forward值为0的请求时,则不再进行转发,而是直接返回响应。比如:

    Max-Forwards: 6

    (11)Proxy-Authorization
    接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证所需要的信息。
    (12)Range
    对于只需获取部分资源的范围请求,包含首部字段Range即可告知服务器资源的指定范围。格式如下,表示请求获取5001字节到10000字节的资源:

    Range: bytes=5001-10000

    (13)Referer
    首部字段Referer会告知服务器请求的原始资源的URI。
    (14)TE
    首部字段TE会告知服务器客户端能够处理响应的传输编码方式及相对优先级。比如:

    TE: gzip, deflate; q=0.5

    (15)User-Agent
    首部字段User-Agent会将创建请求的浏览器和用户代理名称等信息传达给服务器。比如,已经暴露了我正在使用chrome浏览器:

    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36

    3、响应首部字段

    (1)Accept-Ranges
    首部字段Accept-Ranges是用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。当可处理范围请求时其值为bytes,否则会none。比如:

    Accept-Ranges: bytes

    (2)Age
    首部字段Age能告知客户端,源服务器在多久前创立了响应,单位为秒。若创建该响应的服务器是缓存服务器,Age值是指缓存后的响应再次发起认证到认证完成的时间值。比如:

    Age: 300

    (3)ETag
    首部字段ETag能告知客户端实体标识。它是一种可将资源以字符串形式做唯一标识的方式,服务器会为每份资源分配对应的ETag值。
    (4)Location
    使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。基本上,该字段会配合3xx Redirection的响应,提供重定向的URI。比如,当我们访问https://www.baidu.com/sample.html时,它会把我们重定向到如下URI:

    Location:https://www.baidu.com/search/error.html

    (5)Proxy-Authenticate
    首部字段Proxy-Authenticate会把由代理服务器所要求的认证信息发送给客户端。
    (6)Retry-After
    首部字段Retry-After告知客户端应该在多久之后再次发送请求,主要配合状态码503 Service Unavailable响应或3xx Redirect响应一起使用。字段值可以是具体日期,也可以是秒数,比如:

    Retry-After: 120

    (7)Server
    首部字段Server告知客户端当前服务器上安装的HTTP服务器应用程序的信息。比如:

    Server: Apache

    (8)Vary
    首部字段Vary可对缓存进行控制。源服务器会向代理服务器传达关于本地缓存使用方法的命令。
    (9)WWW-Authenticate
    首部字段WWW-Authenticate用于HTTP访问认证。它会告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。

    4、实体首部字段

    (1)Content-Encoding
    首部字段Content-Encoding会告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码食指在不丢失实体信息的前提下所进行的压缩。比如:

    Content-Encoding: gzip

    (2)Content-Language
    首部字段Content-Language会告知客户端,实体主体使用的自然语言。比如:

    Content-Language: zh-CN

    (3)Content-Length
    首部字段Content-Length表明了实体主体部分的大小(字节)。比如:

    Content-Length: 15000

    (4)Content-Location
    首部字段Content-Length给出与报文主体部分相对应的URI。和首部字段Location不同,Content-Location表示的是报文主体返回资源对应的URI。
    (5)Content-MD5
    首部字段Content-MD5是一串由MD5算法生成的值,其目的在于检查报文主体在传输过程中是否保持完成,以及确认传输到达。
    (6)Content-Range
    针对范围请求,返回响应时使用的首部字段,能告知客户端作为响应返回的实体的哪个部分符合范围请求。比如下面,表示一共10000字节,返回第5001-10000字节:

    Content-Range: bytes 5001-10000/100000

    (7)Content-Type
    首部字段Conteng-Type说明了实体主体内对象的媒体类型,和首部字段Accept一样,字段值用type/subtype形式赋值。
    (8)Expires
    首部字段Expires会将资源失效的日期告知客户端,缓存服务器在接收到含有首部字段Expires的响应后,会以缓存来应答请求,在Expires字段值指定的时间之前,响应的副本会一直被保存。当超过指定的时间后,缓存服务器在请求发送来时,会转向源服务器请求资源。
    (9)Last-Modified
    首部字段Last-Modified指明资源最终修改的时间。

    5、其他首部字段

    (1)X-Frame-Options
    首部字段X-Frame-Options属于HTTP响应首部,用于控制网站内容在其他Web网站的Frame标签内的显示问题。其主要目的是为了防止点击劫持攻击。此字段有两个字段值,分别为DENY和SAMEORIGN。
    (2)X-XSS-Protection
    首部字段X-XSS-Protection属于HTTP响应首部,它是针对跨站脚本攻击的一种对策,用于控制浏览器跨站脚本攻击防护机制的开关。此字段有两个字段值,分别为0和1,对应关和开。
    (3)DNT
    首部字段DNT属于HTTP请求首部,其中DNT是Do Not Track的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。此字段有两个字段值,分别为0和1,对应同意被追踪和拒绝被追踪。
    (4)P3P
    首部字段P3P属于HTTP响应首部,通过利用P3P技术,可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。

    六、HTTP的安全性

    1、HTTP的不足

    到目前为止,我们看到了HTTP的许多优点,但是它也有不足之处,例如:
    (1)通信使用明文,内容可能会被窃听
    由于HTTP本身不具备加密的功能,所以也无法做到对通信整体进行加密。同时,TCP/IP是可能被窃听的网络,即使报文经过加密,也只是可能让人无法破解而已,加密后的内容还是能被窥视到。
    目前最为普及的加密技术的对象有:

    • 通信的加密:
        HTTP协议中没有加密机制,但可以通过和SSL(Secure Socket Layer,安全套接层)和TLS(Transport Layer Security,安全传输层协议)的组合使用,加密HTTP的通信内容。
    • 内容的加密:
        另一种是将参与通信的内容本身加密的方式。由于HTTP协议中没有加密机制,那么就对HTTP协议传输的内容本身加密。

    (2)不验证通信方的身份,因此有可能遭遇伪装
    在HTTP协议通信时,由于不存在确认通信方的步骤,任何人都可以发起请求,服务器不管对方是谁都会进行响应,因此会存在一些隐患:

    • 无法确定请求发送至目标的Web服务器是否是按真实意图返回响应的那台服务器。即我发送给A服务器的请求,被一台伪装成A的服务器给接收了。
    • 无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。即服务器想发送给我的东西,被一个伪装成我的人给拿走了。
    • 无法确定正在通信的对方是否具备访问权限。因为某些Web服务器上保存着重要的信息,只想发给特定用户通信的权限。
    • 无法判定请求是来自何方,出自谁手。
    • 即使是无意义的请求也会照单全收,无法阻止海量请求下的DoS攻击。

    虽然使用HTTP协议无法确定通信方,但是如果使用SSL则可以。SSL不仅提供加密处理,还是用了一种被称为证书的手段,可用户确定方,可以减少个人信息泄露的危险性。
    (3)无法验证报文的完整性,所以有可能已遭篡改
    由于HTTP协议无法证明通信的报文完整性,因此在请求或响应的传输的过程中,即使内容遭到篡改也无法获悉。比如,有可能你从服务器请求一张正常的图片,结果在传输过程中被人改成了一张限制级的图片,结果你就被查水表了。

    2、HTTPS

    为了统一解决上述问题,需要在HTTP上再加入加密处理和认证等机制,最后就诞生了HTTPS了。最常出现HTTPS的地方应该是在购物结算或银行网站等着一些地方。HTTPS并非是应用层的一种新协议,它只是HTTP通信接口部分用SSL和TSL协议代替而已。简而言之,HTTPS就是身披SSL协议的HTTP了。在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。
    那么问题来了,既然HTTPS安全可靠,为什么Web网站不一直使用呢?原因其一就是加密通信会消耗更多的CPU及内存资源,因此只有涉及到重要信息的数据才使用HTTPS。除此之外,购买证书也是要花钱的。

    展开全文
  • HTTP协议详解以及URL具体访问过程

    千次阅读 2018-09-08 21:24:29
    HTTP协议详解以及URL具体访问过程 阅读目录 1、简介 2、URI与URL 3、TCP握手连接以及断开(扩展) 4、特点 5、HTTP请求  5.1、Request 消息的结构  5.2、请求方法  5.3、http的无状态以及建立连接方式...

    HTTP协议详解以及URL具体访问过程

    阅读目录

    回到顶部

    1、简介

      1.1、HTTP协议是什么?

      即超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。从网络参考模型来看,它是属于应用层。它规定了计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。

      简单的来说,它就是基于应用层一个规范一个标准!通讯双发都需要遵守这一准则,这就是http协议!

      1.2、http简史

      设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1,这也是我们现在最常用的版本,在此之前还存在HTTP 1.0版本以及HTTP 0.9版本

    回到顶部

    2、URI与URL

      问: 为什么要区别URI与URL呢?

      答:因为我看书看博客资料都遇到过着两个名词,第一次遇到是在学习API的时候,那时候我是一脸懵逼,不是怎么区分,感觉看过去都是一串网址呀!事实并非如此。

      URI:统一资源标示符,只是标识资源在哪里,这意味着存在多个URI可以指向该资源(例如:绝对与相对)【URI包含URL】

      URI一般由三部分组成:
        1. 访问资源的命名机制。 
        2. 存放资源的主机名。 
        3. 资源自身的名称,由路径表示。 

      语法:[scheme:] scheme-specific-part 

      URI以scheme和冒号开头。Scheme用大写/小写字母开头,后面为空或者跟着更多的大写/小写字母、数字、加号、减号和点号。冒号把 scheme与scheme-specific-part分开了,并且scheme-specific-part的语法和语义(意思)由URI的名字空间决定。如下面的例子:
      http://www.cnn.com,其中http是scheme,//www.cnn.com是 scheme-specific-part,并且它的scheme与scheme-specific-part被冒号分开了。

      绝对与相对:

      绝对的URI指以scheme(后面跟着冒号)开头的URI。(例如:mailto:jeff@javajeff.com、news:comp.lang.java.help和xyz: //whatever);绝对的URI看作是以某种方式引用某种资源,而这种方式对标识符出现的环境没有依赖。

      相对的URI不是以scheme(后面跟着冒号)开始的URI。(例如:articles/articles.html、img/aa.jpg)你可以把相对的URI看作是以某种方式引用某种资源,而这种方式依赖于标识符出现的环境。(即你在html中引用图片:./img/aa.jpg,那么它依赖的就是http)

      URL:统一资源定位符,是URI的子集;它除了标识资源的位置,还提供一种定位该资源的主要访问机制(如其网络“位置”)。【即提供具体方式找到该资源(位置+方式)】

      URL的格式由下列三部分组成: 
        1. 第一部分,是协议或称为服务方式 (指定低层使用的协议,例如:http, https, ftp);
        2. 第二部分,是存有该资源的主机IP地址(有时也包括端口号); 
            3. 第三部分,是主机资源的具体地址。如目录和文件名等。 

      第一部分和第二部分之间用"://"符号隔开,第二部分和第三部分用"/"符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。 

    回到顶部

    3、TCP握手连接以及断开(扩展)

      TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道。引用oneSong所画的一张金典TCP通讯图片

      上图中主要分为三部分:建立连接、传输数据、断开连接。

      建立连接:

      三次握手即可建立TCP连接

      1、第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

      2、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

      3、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

      握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

      为什么需要三次握手呢?

      相互确认!(网上有很多解释,这里就不多讲了)

      数据传输:

      建立好连接后,开始传输数据。TCP数据传输牵涉到的概念很多:超时重传、快速重传、流量控制、拥塞控制等等。(这一切都是为了提供可靠的字节流服务)

      断开连接:

      四次握手即可断开TCP连接

      1、第一次握手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但此时主动关闭方还可以接受数据。

      2、第二次握手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。

      3、第三次握手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

      4、第四次握手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

      白话文:

      1、第一次握手,浏览器对服务器说:“煞笔,我不再给你发数据啦,但可以接受数据。”

      2、第二次握手,服务器对浏览器说:“骚货,我知道啦!”

      3、第三次握手,服务器对浏览器说:“骚货,我也不再给你发数据啦!”

      4、第四次握手,浏览器对服务器说:“煞笔,我知道啦!”

    回到顶部

    4、特点

    HTTP协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。、

    主要特点:

      1、支持客户/服务器模式。一旦建立了运输连接(这常常称为建立了会话),浏览器端就向万维网服务器端发送HTTP请求,服务器收到请求后给出HTTP响应。
      2、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
      3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
      4、HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象,采用这种方式可以节省传输时间。
      5、无状态:HTTP协议是无状态协议。即每一个HTTP请求都是独立的。万维网服务器不保存过去的请求和过去的会话记录。这就是说,同一个用户再次访问同一个服务器时,只要服务器没有进行内容的更新,服务器的响应就给出和以前被访问时相同的响应。服务器不记录曾经访问过的用户,也不记录某个用户访问过多少次。

    回到顶部

    5、HTTP请求

    回到顶部

      5.1、Request 消息的结构

      请求消息的结构由三部分组成,请求行、请求头、请求主体(即:请求行、消息报头、请求正文。)

    【请  求 行】请求方法 空格 请求资源地址(URI、无域名) 空格 HTTP版本 空格 CRLF(换行符)

    【请  求 头】标识:内容 CRLF(换行符)

    【空  一 行】(表示请求头结束)

    【请求主体】(即请求正文,用户的主要数据。POST方式时使用,GET无请求主体)

      在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的。  

      例:

    复制代码

    GET /phpstudy2015-6/ HTTP/1.1
    Host: www.cnblogs.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 300
    Connection: keep-alive
    If-Modified-Since: Sat, 06 May 2017 12:05:41 GMT

    复制代码

    回到顶部

      5.2、请求方法

      HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式,最基本的有4种,分别是GET,POST,PUT,DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

      【我们在浏览器地址栏直接输入地址的时候,采用的就是GET方法】

    各方法如下:

      1、GET:向特定的资源发出请求

      2、POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

      3、PUT:向指定资源位置上传其最新内容。

      4、DELETE:请求服务器删除Request-URI所标识的资源。

      5、HEAD: 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。

      6、TRACE:请求服务器会送收到的请求信息,主要用于测试或诊断。

      7、OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求

      8、CONNECT: HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。(即留为将来使用)

      【注意:请求方法区分大小写;所示请求方法应为大写】

    GET与POST的区别:

      1、GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?postid=6810130&update=1 ;POST方法是把提交的数据放在HTTP包的Body中。

      2、GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。

      3、GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

      4、GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

    回到顶部

      5.3、http的无状态以及建立连接方式

      无状态:

      http协议为了保证服务器的内存,不会维持客户端发过来的请求,即同一个客户端的这次请求和上次请求是没有对应关系,对http服务器来说,它并不知道这两个请求来自同一个客户端。例如:一个浏览器在短短几秒之内两次访问同一对象时,服务器进程不会因为已经给它发过应答报文而不接受第二期服务请求。

      为了解决这个问题, Web程序引入了Cookie机制来维护状态。

      建立连接方式:

      HTTP中支持两种连接方式:非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)。

      1、非持久连接方式(采用访问例子来说明)

      让我们查看一下非持久连接情况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:cnblogs.com/phpstudy2015-6/index.html。

      下面是具体步骡:

      1. HTTP客户初始化一个与服务器主机cnblogs.com中的HTTP服务器的TCP连接。HTTP服务器使用默认端口号80监听来自HTTP客户的连接建立请求。

      2. HTTP客户经由与TCP连接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。

      3. HTTP服务器经由与TCP连接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。

      4. HTTP服务器告知TCP关闭这个TCP连接(不过TCP要到客户收到刚才这个响应消息之后才会真正终止这个连接)。

      5. HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。

      6.给每一个引用到的JPEG对象重复步骡1-4。

      上述步骤之所以称为使用非持久连接,原因是每次服务器发出一个对象后,相应的TCP连接就被关闭,也就是说每个连接都没有持续到可用于传送其他对象。每个TCP连接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP连接。

      2、持久连接

      非持久连接有一个很大的缺点就是,每一个http请求都需要建立一个TCP连接,就上面的例子而言,get一个html页面就要建立十一次TCP连接,这是严重浪费资源行为!

      首先,客户得为每个待请求的对象建立并维护一个新的连接。对于每个这样的连接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的web服务器来说,这会严重增加其负担。其次,如前所述,每个对象都有2个RTT的响应延长——一个RTT用于建立TCP连接另—个RTT用于请求和接收对象。最后,每个对象都遭受TCP缓启动,因为每个TCP连接都起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。

    【RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。】

      持久连接就能够很好解决这一缺点,在持久连接情况下,服务器在发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。整个Web页面(上例中为包含一个基本HTMLL文件和10个图像的页面)自不用说可以通过单个持久TCP连接发送:甚至存放在同一个服务器中的多个web页面也可以通过单个持久TCP连接发送。

      通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。

      持久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。

      不带流水线的版本:

      客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象(上例中的10个图像)都经历1个RTT的延迟,用于请求和接收该对象。与非持久连接2个RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服务器资源便闲置了。

      带流水线的持久连接:

      HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。如果所有的请求和响应都是紧挨着发送的,那么所有引用到的对象一共只经历1个RTT的延迟(而不是像不带流水线的版本那样,每个引用到的对象都各有1个RTT的延迟)。另外,带流水线的持久连接中服务器空等请求的时间比较少。与非持久连接相比,持久连接(不论是否带流水线)除降低了1个RTT的响应延迟外,缓启动延迟也比较小。其原因在于既然各个对象使用同一个TCP连接,服务器发出第一个对象后就不必再以一开始的缓慢速率发送后续对象。相反,服务器可以按照第一个对象发送完毕时的速率开始发送下一个对象。 

    回到顶部

      5.4、请求行

      正如上面所讲的,请求行以一个方法符号开头,空格之后,一个请求URI,再空格,然后一个HTTP版本,最后一个回车换行。

      它的作用是用来说明当前请求的最基本信息。

    回到顶部

      5.5、请求头

      (注:在HTTP/1.1 协议中,所有的请求头,除Host外,都是可选的)

      #请求头的书写形式为:Host:coblogs.com \r\n【标识符:内容 换行】

      常见的请求头:

      1、Host:(发送请求时,该头域是必需的)主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
      例如: 我们在浏览器中输入:http://www.guet.edu.cn/index.html,浏览器发送的请求消息中,就会包含Host请求头域:Host:http://www.guet.edu.cn,此处使用缺省端口号80,若指定了端口号,则变成:Host:指定端口号。

      2、User-Agent:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
      例如: User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:53.0) Gecko/20100101 Firefox/53.0

      3、Content-Type:例如:Content-Type: application/x-www-form-urlencoded

      4、Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;例如:Accept-Language: en-us。如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

      5、Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

      6、Accept-Encoding:浏览器申明自己可接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate);Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

      例如: Accept-Encoding: gzip, deflate。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。

      7、Cookie:最重要的请求头之一, 将cookie的值发送给HTTP服务器。

      8、Connection:HTTP 1.1默认进行持久连接keep-alive。
      例如:Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。

      利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
      Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭,当客户端再次发送Request,需要重新建立TCP连接。

      9、Keep-Alive:30保持持久连接30s

      10、If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。

      例如:If-Modified-Since: Sat, 06 May 2017 12:05:41 GMT

      11、If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag.  使用这样的机制将提高网站的性能。

      例如: If-None-Match: "03f2b33c0bfcc1:0"。

      12、Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样。Pargma只有一个用法, 例如: Pragma: no-cache

      13、Cache-Control:指定请求和响应遵循的缓存机制。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程)。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

      注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

      Cache-Control:Public 可以被任何缓存所缓存
      Cache-Control:Private 内容只缓存到私有缓存中
      Cache-Control:no-cache 所有内容都不会被缓存
      Cache-Control:no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
      Cache-Control:max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
      Cache-Control:min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
      Cache-Control:max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

      14、Accept-Charset:浏览器可接受的字符集。如果在请求消息中没有设置这个域,缺省表示任何字符集都可以接受。

      15、Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。

      例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT

      16、Content-Length:表示请求消息正文的长度。例如:Content-Length: 38。

      17、From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。

      18、Range:可以请求实体的一个或者多个子范围。

      例如:
      表示头500个字节:bytes=0-499
      表示第二个500字节:bytes=500-999
      表示最后500个字节:bytes=-500
      表示500字节以后的范围:bytes=500-
      第一个和最后一个字节:bytes=0-0,-1
      同时指定几个范围:bytes=500-600,601-999
      但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。 

    回到顶部

      5.6、请求主体

      请求的主要用户数据,就是POST数据。

      如果方式为POST,则需要请求主体部分;GET则没有请求主体

      数据形式:类似name=XXX&pwd=XXXX的内容 

    回到顶部

    6、HTTP响应

    回到顶部

      6.1、Response 消息的结构

      响应消息的结构由三部分组成,响应行、相应头、相应主体(即:状态行、消息报头、响应正文。)

    【响  应 行】HTTP版本 空格 状态码 空格 状态码的文本描述 空格 CRLF(换行符)

    【响  应 头】:内容 CRLF(换行符)

    【空  一 行】(表示响应头结束)

    【响应主体】所谓响应主体,就是服务器返回的资源的内容。即整个HTML文件。

    回到顶部

      6.2、响应行

      响应数据的第一行,响应结果的概述。

      状态码:

      状态代码有3位数字组成,状态描述给出了状态代码简短的描述。状态码第一个数字定义了响应的类别,有五种可能取值:
      1xx  :  指示信息--表示请求已接收,继续处理
      2xx  :  成功--表示请求已被成功接收、理解、接受
      3xx  :  重定向--要完成请求必须进行更进一步的操作
      4xx  :  客户端错误--请求有语法错误或请求无法实现
      5xx  :  服务器端错误--服务器未能实现合法的请求

      所有状态码如下(已折叠):

    View Code

    回到顶部

      6.3、响应头

      同理,请求头!

      HTTP常见的响应头:

      1、Date:表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Sat, 06 May 2017 12:16:56 GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦  

      2、Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentType。可在web.xml文件中配置扩展名和MIME类型的对应关系。

      例如:

      Content-Type: text/html;charset=utf-8
      Content-Type:text/html;charset=GB2312
      Content-Type: image/jpeg

      媒体类型的格式为:大类/小类,比如text/html。
      IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)定义了8个大类的媒体类型,分别是:
      application— (比如: application/vnd.ms-excel.)
      audio (比如: audio/mpeg.)
      image (比如: image/png.)
      message (比如,:message/http.)
      model(比如:model/vrml.)
      multipart (比如:multipart/form-data.)
      text(比如:text/html.)
      video(比如:video/quicktime.)

      3、Expires:指明应该在什么时候认为文档已经过期,从而不再缓存它,重新从服务器获取,会更新缓存。过期之前使用本地缓存。HTTP1.1的客户端和缓存会将非法的日期格式(包括0)看作已经过期。

      eg:为了让浏览器不要缓存页面,我们也可以将Expires实体报头域,设置为0。
      例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

      4、P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
      例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

      5、Set-Cookie:非常重要的header, 用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个Set-Cookie。
      例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

      6、ETag:和If-None-Match 配合使用。

      7、Last-Modified:用于指示资源的最后修改日期和时间。Last-Modified也可用setDateHeader方法来设置。

      8、Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。
      例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响 应或对一系列范围的重叠请求),Content-Range表示传送的范围。

      9、Content-Length:指明实体正文的长度,以字节方式存储的十进制数字来表示。在数据下行的过程中,Content-Length的方式要预先在服务器中缓存所有数据,然后所有数据再一股脑儿地发给客户端。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。

      例如: Content-Length: 19847

      10、Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
      例如:Content-Encoding:gzip

      11、Content-Language:WEB服务器告诉浏览器自己响应的对象所用的自然语言。

      例如: Content-Language:da。没有设置该域则认为实体内容将提供给所有的语言阅读。

      12、Server:指明HTTP服务器用来处理请求的软件信息。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多个产品标识和注释,产品标识一般按照重要性排序

      13、X-AspNet-Version:如果网站是用ASP.NET开发的,这个header用来表示ASP.NET的版本。
      例如: X-AspNet-Version: 4.0.30319

      14、X-Powered-By:表示网站是用什么技术开发的。
      例如: X-Powered-By: ASP.NET

      15、Connection:keep-alive /close
      16、Location:用于重定向一个新的位置,包含新的URL地址。表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。Location响应报头域常用在更换域名的时候。

      17、Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

    回到顶部

      6.4、响应主体

       就是服务器返回的资源的内容。即整个HTML文件

    回到顶部

    7、HTTP请求详细过程

      从前面讲解中我们大概对HTTP有了一个基本的认识,那么接下来我们就详细研究了解HTTP请求的具体过程。

      引用咸鱼老弟的博客文章

    回到顶部

      7.1、 输入地址

      当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能得 url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址。对于 google的chrome 的浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下 enter,页面就出来了。

    回到顶部

      7.2、浏览器查找域名的IP

      1、请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。

          2、如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

        3、查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

      4、根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程。

      5、本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

      6、最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

    下面这张图很完美的解释了这一过程:

    知识扩展:

    1)什么是DNS?

      DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。

      通俗的讲,我们更习惯于记住一个网站的名字,比如www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2。而计算机更擅长记住网站的ip地址,而不是像www.baidu.com等链接。因为,DNS就相当于一个电话本,比如你要找www.baidu.com这个域名,那我翻一翻我的电话本,我就知道,哦,它的电话(ip)是167.23.10.2。

    2)DNS查询的两种方式:递归查询和迭代查询

    1、递归解析

        当局部DNS服务器自己不能回答客户机的DNS查询时,它就需要向其他DNS服务器进行查询。此时有两种方式,如图所示的是递归方式。局部DNS服务器自己负责向其他DNS服务器进行查询,一般是先向该域名的根域服务器查询,再由根域名服务器一级级向下查询。最后得到的查询结果返回给局部DNS服务器,再由局部DNS服务器返回给客户端。

      简单来讲,就是参与此次寻找IP的所有服务器,最后都能够得到该域名对应的IP信息(将信息进行往返传送!)

    2、迭代解析

      当局部DNS服务器自己不能回答客户机的DNS查询时,也可以通过迭代查询的方式进行解析,如图所示。局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。也就是说,迭代解析只是帮你找到相关的服务器而已,而不会帮你去查。比如说:baidu.com的服务器ip地址在192.168.4.5这里,你自己去查吧,本人比较忙,只能帮你到这里了。

      简单的来讲,就是只有最后一台服务器与最初的服务器进行该域名/IP信息的传送!

    3)DNS域名称空间的组织方式

       我们在前面有说到根DNS服务器,域DNS服务器,这些都是DNS域名称空间的组织方式。按其功能命名空间中用来描述 DNS 域名称的五个类别的介绍详见下表中,以及与每个名称类型的示例

    4)DNS负载均衡

      当一个网站有足够多的用户的时候,假如每次请求的资源都位于同一台机器上面,那么这台机器随时可能会蹦掉。处理办法就是用DNS负载均衡技术,它的原理是在DNS服务器中为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器对每个查询将以DNS文件中主机记录的IP地址按顺序返回不同的解析结果,将客户端的访问引导到不同的机器上去,使得不同的客户端访问不同的服务器,从而达到负载均衡的目的。例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等。

    回到顶部

      7.3、浏览器携带IP地址向Web服务器发起HTTP请求

      拿到域名对应的IP地址之后,浏览器会以一个随机端口(1024<端口<65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求这个连接请求到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。

    TCP连接参考上面

      建立了TCP连接之后,发起一个http请求。一个典型的 http request header 一般需要包括请求的方法,例如 GET 或者 POST 等,不常用的还有 PUT 和 DELETE 、HEAD、OPTION以及 TRACE 方法,一般的浏览器只能发起 GET 或者 POST 请求。

    回到顶部

      7.4、服务器的永久重定向响应 

      服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.google.com/” 而非“http://google.com/”。

      为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。

    扩展知识

    1)301和302的区别。

      301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另一个地址B)——这是它们的共同点。

      他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址

      302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。 SEO302好于301

    2)重定向原因:

    (1)网站调整(如改变网页目录结构);

    (2)网页被移到一个新地址;

    (3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。

            这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。

    3)什么时候进行301或者302跳转呢?

            当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转,而使用301跳转的场景就是之前的网站因为某种原因需要移除掉,然后要到新的地址访问,是永久性的。

    清晰明确而言:使用301跳转的大概场景如下:

    1、域名到期不想续费(或者发现了更适合网站的域名),想换个域名。

    2、在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。

    3、空间服务器不稳定,换空间的时候。

    回到顶部

      7.5、发出新的请求(重定向)

      现在浏览器知道了 "http://www.google.com/"才是要访问的正确地址,所以它会发送另一个http请求。重复上面的http请求步骤

    回到顶部

      7.6、服务器主机处理

      经过前面的重重步骤,我们终于将我们的http请求发送到了服务器这里,其实前面的重定向已经是到达服务器了,那么,服务器是如何处理我们的请求的呢?

      后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。

      【一些大一点的网站会将你的请求到反向代理服务器中,因为当网站访问量非常大,网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。此时,客户端不是直接通过HTTP协议访问某网站应用服务器,而是先请求到Nginx,Nginx再请求应用服务器,然后将结果返回给客户端,这里Nginx的作用是反向代理服务器。同时也带来了一个好处,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。】

    回到顶部

      7.7、Web应用服务器处理http请求

       【假设服务器端使用nginx+php(fastcgi)架构提供服务】

      假设我此时输入的URL为http://www.mecnblogs.com/

      ① nginx读取配置文件,并寻找文件

      当服务器主机将浏览器发送过来的所有数据通过各个网络层的相应协议的规定进行了解密以及封装,最后将数据包送达应用层使用。(可参考TCP/IP网络模型)

      当Nginx在收到浏览器 GET / 请求时,会读取http请求里面的头部信息,根据Host来匹配 自己的所有的虚拟主机的配置文件的server_name,看看有没有匹配的,有匹配那么就读取该虚拟主机的配置,发现如下配置: 

    root /web/echo

     

       通过这个就知道所有网页文件的就在这个目录下 这个目录就是/ 当我们http://www.mecnblogs.com/时就是访问这个目录下面的文件,例如访问http://www.mecnblogs.com/index.html,那么代表/web/echo下面有个文件叫index.html

    index index.html index.htm index.php

     

      通过这个就能得知网站的首页文件是那个文件,也就是我们在入http://www.mecnblogs.com/ ,nginx就会自动帮我们把index.html(假设首页是index.php 当然是会尝试的去找到该文件,如果没有找到该文件就依次往下找,如果这3个文件都没有找到,那么就抛出一个404错误)加到后面,那么添加之后的URL是/index.php,然后根据后面的配置进行处理

    复制代码

    location ~ .*\.php(\/.*)*$ {
       root /web/echo;
       fastcgi_pass   127.0.0.1:9000;
       fastcgi_index  index.php;
       astcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }

    复制代码

      这一段配置指明凡是请求的URL中匹配(这里是启用了正则表达式进行匹配) *.php后缀的(后面跟的参数)都交给后端的fastcgi进程进行处理。

      ② 把php文件交给fastcgi进程去处理

       于是nginx把/index.php这个URL交给了后端的fastcgi进程处理,等待fastcgi处理完成后(结合数据库查询出数据,填充模板生成html文件)返回给nginx一个index.html文档,Nginx再把这个index.html返回给浏览器(通过HTTP协议返回,即HTTP响应【响应消息结构可以参考上面】),于是乎浏览器就拿到了首页的html代码,同时nginx写一条访问日志到日志文件中去。

    【扩展:】

    nginx是怎么找index.php文件的?

      当nginx发现需要/web/echo/index.php文件时,就会向内核发起IO系统调用(因为要跟硬件打交道,这里的硬件是指硬盘,通常需要靠内核来操作,而内核提供的这些功能是通过系统调用来实现的),告诉内核,我需要这个文件,内核从/开始找到web目录,再在web目录下找到echo目录,最后在echo目录下找到index.php文件,于是把这个index.php从硬盘上读取到内核自身的内存空间,然后再把这个文件复制到nginx进程所在的内存空间,于是乎nginx就得到了自己想要的文件了。

    寻找文件在文件系统层面是怎么操作的?

      比如nginx需要得到/web/echo/index.php这个文件

      每个分区(像ext3 ext3等文件系统,block块是文件存储的最小单元 默认是4096字节)都是包含元数据区和数据区,每一个文件在元数据区都有元数据条目(一般是128字节大小),每一个条目都有一个编号,我们称之为inode(index node 索引节点),这个inode里面包含 文件类型、权限、连接次数、属主和数组的ID、时间戳、这个文件占据了那些磁盘块也就是块的编号(block,每个文件可以占用多个block,并且block不一定是连续的,每个block是有编号的),如下图所示:

      还有一个要点:目录其实也普通是文件,也需要占用磁盘块,目录不是一个容器。你看默认创建的目录就是4096字节,也就说只需要占用一个磁盘块,但这是不确定的。所以要找到目录也是需要到元数据区里面找到对应的条目,只有找到对应的inode就可找到目录所占用的磁盘块。

    那到底目录里面存放着什么,难道不是文件或者其他目录吗?

      其实目录存着这么一张表(姑且这么理解),里面放着 目录或者文件的名称和对应的inode号(暂时称之为映射表),如下图:

    wKiom1LSX3KATYWYAAAx2GkMEO4103.jpg

    假设

    /           在数据区占据 1、2号block ,/其实也是一个目录 里面有3个目录  web 111

    web         占据 5号block  是目录 里面有2个目录 echo data

    echo        占据 11号 block  是目录  里面有1个文件 index.php

    index.php   占据 15 16号 block  是文件

    其在文件系统中分布如下图所示:

    那么内核究竟是怎么找到index.php这个文件的呢?

      内核拿到nginx的IO系统调用要获取/web/echo/index.php这个文件请求之后

      ① 内核读取元数据区 / 的inode,从inode里面读取/所对应的数据块的编号,然后在数据区找到其对应的块(1 2号块),读取1号块上的映射表找到web这个名称在元数据区对应的inode号

      ② 内核读取web对应的inode(3号),从中得知web在数据区对应的块是5号块,于是到数据区找到5号块,从中读取映射表,知道echo对应的inode是5号,于是到元数据区找到5号inode

      ③ 内核读取5号inode,得到echo在数据区对应的是11号块,于是到数据区读取11号块得到映射表,得到index.php对应的inode是9号

      ④ 内核到元数据区读取9号inode,得到index.php对应的是15和16号数据块,于是就到数据区域找到15 16号块,读取其中的内容,得到index.php的完整内容

    回到顶部

      7.8、浏览器处理并显示html文件

      在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,浏览器是如何把页面呈现在屏幕上的呢?不同浏览器可能解析的过程不太一样,这里我们只介绍webkit的渲染过程,下图对应的就是WebKit渲染的过程,这个过程包括:

      解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树

      在浏览器显示的时候,当遇到要获取外图片,CSS,JS文件等等时,浏览器将会发起不断发起异步的http请求来获取这些资源。

    回到顶部

    8、总结

      站在巨人的肩膀上来学习确实能够让自己的眼界更加开阔,同时深入学习与巩固HTTP这方面的知识,能够让自己深入了解Web的B/S结构、Web通讯的具体过程,有助于自己日后的Web开发。同时也为接下来的面试做准备。在此当然是要感谢各位前辈大牛啦。

    回到顶部

    9、参考文献

    1. 《图解TCP-IP协议》 

    2. 《一次完整的HTTP事务是怎样一个过程?

    3. 《【原】老生常谈-从输入url到页面展示到底发生了什么

    4. 《浅析HTTP协议

    5. 《HTTP协议详解

     

    (以上是自己的一些见解,若有不足或者错误的地方请各位指出)

     作者:那一叶随风   http://www.cnblogs.com/phpstudy2015-6/

     原文地址:http://www.cnblogs.com/phpstudy2015-6/p/6810130.html 

     声明:只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接

     

    展开全文
  • 写在前面:刚开始搞wifi通信没多长时间,基本上路子都通了,由于前期对网络的知识实在匮乏,所以看代码的时候很多地方知其然,不知其所以然,所以想学习、研究、梳理一下几个协议关系,对网络通信加深下印象,中间...

    写在前面:刚开始搞wifi通信没多长时间,基本上路子都通了,由于前期对网络的知识实在匮乏,所以看代码的时候很多地方知其然,不知其所以然,所以想学习、研究、梳理一下几个协议的关系,对网络通信加深下印象,中间理解不到位的地方还请大家及时指出,QQ:993650814。

     

    正文:

    一、先贴一张网络OSI(开放式通信系统互联参考模型Open System Interconnectio)七层模型图:

       

    其中:物理层、数据链路层、网络层通常称为媒体层,是网络工程师所研究的对象。

    传输层、会话层、表示层和应用层称为主机层,是用户所关心的内容。

    TCP和UDP属于传输层,HTTP属于应用层,IP属于网络层。

    而Socket本身并不是什么协议,而是一些列调用接口(API),通过Socket,我们才能使用TCP/IP协议。

    二、对标题中的协议先从概念阐述一遍,以及部分协议之间的关系理顺一下

    1、IP协议(Internet Protocol):又称互联网协议,是支持网间互联的数据报(数据报是通过网络传输的数据的基本单元)协议,通过IP协议,网络层向传输层提供的是统一的IP分组,传输层不需要考虑互联网在数据链路层、物理层协议与实现技术上的差异,IP协议主要是告诉数据链路层,数据中转的方向。数据链路层只管把数据送到特定的目标地址。IP协议提供网间连接的完善功能,包括IP地址格式, IP地址不因数据链路层的改变而发生改变。一个IP包除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口

    2、TCP协议(Transmission Control Protocol,传输控制协议):是面向连接的协议,即在收发数据前,必须要和对方建立可靠的连接。一个TCP连接必须要经过三次握手才能建立起来,而断开要进行四次挥手,这里断开和连接的过程不再阐述。

    3、UDP协议(User Data Protocol,用户数据报协议):UDP是一个非连接的协议,传输数据之前源端和终端不需要建立连接。使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。

    4、HTTP协议(Hypertext Transfer Protocol ,超文本传输协议):协议是建立在TCP协议之上的一种应用,HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立TCP连接,而且需要客户端向服务器发出请求请求中包含请求方法、URI(URL的概念和解释参考这里)、协议版本以及相关的MIME样式的消息,服务器端才能回复数据。服务器响应包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即使不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

      http是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

    5、Socket(套接字):前面说过了,Socket不属于通信协议。

    Socket是应用层TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Scoket去组织数据,以符合指定的协议。

    6、TCP跟UDP的比较:

    (1)、双方都是一种网络传输协议;

    (2)、TCP需要建立连接,而UDP不需要建立连接(无连接传输)。广播场景就依赖于UDP协议,因为UDP是无连接的;而打电话场景就依赖于TCP协议。

    (3)、 TCP属于可靠的传输协议:因为传输前双方建立好了连接,相当于买卖双方建立好了交易合同,传输中一般不会出现意外,直到连接终止; 
       UDP属于不可靠的传输协议:UDP的所谓连接相当于一种映射,UDP单方面的认为目标地址(端口)是可用的,从而进行收发数据,而实际上目标地址(端口)未必可用,所以传输数据不可靠。

    (4)、由于TCP需要建立真实的连接,所以需要消耗服务器的负载要大于UDP。

    三、对应关系

    1、从上面可以看出,TCP/IP协议族、HTTP、Socket 本质上没有可比性, 何况HTTP协议是基于TCP连接的。

         TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。

         我 们在传输数据时,可以只使用传输层(TCP/IP),但是那样的话,由于没有应用层,便无法识别数据内容,如果想要使   传  输的数据有意义,则必须使用应用层 协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。 WEB使用HTTP作传输层协议,以封装HTTP文本信息,然 后使用TCP/IP做传输层协议将它发送到网络上。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。

    2、Socket与TCP:

    创建Socket连接时,可以指定使用的传输层协议,Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。 

    3、Socket与HTTP:

    由 于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。

    很 多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给 客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以 保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。 

     

     

    展开全文
  • TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。 1,http对应于应用层 2,Tcp协议对应于传输层 3,http协议是在Tcp协议之上建立的,http在发起请求时通过tcp协议建立起连接服务器...

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。

    1,http对应于应用层

    2,Tcp协议对应于传输层

    3,http协议是在Tcp协议之上建立的,http在发起请求时通过tcp协议建立起连接服务器的通道,请求结束后,立即断开tcp连接

    说明:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

    4,Http是无状态的短连接,而TCP是有状态的长连接

    socket:

    Socket本身并不是协议,而是一个调用接口(API)。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口

    HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

    http协议详解:

    HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。

    一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。

    HTTP请求格式

    请求行(request line)请求头部(header)空行请求数据

    请求报文的一般格式。

    http响应:

    HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

    http请求方法:

    HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。

    HTTP1.1 新增了五种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。

    具体参见:https://www.runoob.com/http/http-methods.html

    状态码总结:

    1xx:指示信息--表示请求已接收,继续处理
    2xx:成功--表示请求已被成功接收、理解、接受
    3xx:重定向--要完成请求必须进行更进一步的操作
    4xx:客户端错误--请求有语法错误或请求无法实现
    5xx:服务器端错误--服务器未能实现合法的请求

    HTTP content-type

    Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因

    http请求头部

    常用的http请求头

    1.Accept

    • Accept: text/html  浏览器可以接受服务器回发的类型为 text/html。
    • Accept: */*   代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)。

    2.Accept-Encoding

    • Accept-Encoding: gzip, deflate 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码)。

    3.Accept-Language

    • Accept-Language:zh-CN,zh;q=0.9  浏览器申明自己接收的语言。

    4.Connection

    • Connection: keep-alive  当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
    •  Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。

    5.Host(发送请求时,该报头域是必需的)

    • Host:www.baidu.com 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。

    6.Referer

    • Referer:https://www.baidu.com/?tn=62095104_8_oem_dg 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

    7.User-Agent

    • User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本。

    8.Cache-Control

    • Cache-Control:private 默认为private  响应只能够作为私有的缓存,不能再用户间共享

    • Cache-Control:public 响应会被缓存,并且在多用户间共享。正常情况, 如果要求HTTP认证,响应会自动设置为 private.

    • Cache-Control:must-revalidate  响应在特定条件下会被重用,以满足接下来的请求,但是它必须到服务器端去验证它是不是仍然是最新的。

    • Cache-Control:no-cache  响应不会被缓存,而是实时向服务器端请求资源。

    • Cache-Control:max-age=10 设置缓存最大的有效时间,但是这个参数定义的是时间大小(比如:60)而不是确定的时间点。单位是[秒 seconds]。

    • Cache-Control:no-store 在任何条件下,响应都不会被缓存,并且不会被写入到客户端的磁盘里,这也是基于安全考虑的某些敏感的响应才会使用这个。

    9.Cookie

    Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。

    10.Range(用于断点续传)

    • Range:bytes=0-5 指定第一个字节的位置和最后一个字节的位置。用于告诉服务器自己想取对象的哪部分。

    http响应头部

    常用的http响应头

    1.Cache-Control(对应请求中的Cache-Control)

    • Cache-Control:private 默认为private 响应只能够作为私有的缓存,不能再用户间共享

    • Cache-Control:public 浏览器和缓存服务器都可以缓存页面信息。

    • Cache-Control:must-revalidate 对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时。

    • Cache-Control:no-cache 浏览器和缓存服务器都不应该缓存页面信息。

    • Cache-Control:max-age=10  是通知浏览器10秒之内不要烦我,自己从缓冲区中刷新。

    • Cache-Control:no-store 请求和响应的信息都不应该被存储在对方的磁盘系统中。

    2.Content-Type

    • Content-Type:text/html;charset=UTF-8 告诉客户端,资源文件的类型,还有字符编码,客户端通过utf-8对资源进行解码,然后对资源进行html解析。通常我们会看到有些网站是乱码的,往往就是服务器端没有返回正确的编码。

    3.Content-Encoding

    • Content-Encoding:gzip 告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

    4.Date

    • Date: Tue, 03 Apr 2018 03:52:28 GMT 这个是服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。http协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源的时候,时间混乱问题。

    5.Server

    • Server:Tengine/1.4.6  这个是服务器和相对应的版本,只是告诉客户端服务器信息

     

    6.Transfer-Encoding

     

    • Transfer-Encoding:chunked 这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送,每一块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

     

     

     

    7.Expires

     

    • Expires:Sun, 1 Jan 2000 01:00:00 GMT 这个响应头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本,很显然这个值会存在问题,因为客户端和服务器的时间不一定会都是相同的,如果时间不同就会导致问题。所以这个响应头是没有Cache-Control:max-age=*这个响应头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

    8.Last-Modified

     

     

    • Last-Modified: Dec, 26 Dec 2015 17:30:00 GMT 所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)

     

    9.Connection

    • Connection:keep-alive 这个字段作为回应客户端的Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。

    10.Etag

     

    • ETag: "737060cd8c284d8af7ad3082f209582d" 就是一个对象(比如URL)的标志值,就一个对象而言,比如一个html文件,如果被修改了,其Etag也会别修改,所以,ETag的作用跟Last-Modified的作用差不多,主要供WEB服务器判断一个对象是否改变了。比如前一次请求某个html文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得ETag值发送给WEB服务器,然后WEB服务器会把这个ETag跟该文件的当前ETag进行对比,然后就知道这个文件有没有改变了。

    11.Refresh

     

     

    • Refresh: 5; url=http://baidu.com  用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。

     

    12.Access-Control-Allow-Origin 

    • Access-Control-Allow-Origin: *   *号代表所有网站可以跨域资源共享,如果当前字段为*那么Access-Control-Allow-Credentials就不能为true
    • Access-Control-Allow-Origin: www.baidu.com 指定哪些网站可以跨域资源共享

    13.Access-Control-Allow-Methods

    • Access-Control-Allow-Methods:GET,POST,PUT,DELETE  允许哪些方法来访问

    14.Access-Control-Allow-Credentials

     

    • Access-Control-Allow-Credentials: true  是否允许发送cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。如果access-control-allow-origin为*,当前字段就不能为true

     

    15.Content-Range

    • Content-Range: bytes 0-5/7877 指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。

     

    参考:https://juejin.im/post/5c17d3cd5188250d9e604628

    展开全文
  • HTTP协议与攻击

    千次阅读 2018-12-28 09:51:28
    文章目录Web基础TCP/IPHTTP协议概念HTTP协议是个无状态协议HTTP方法持久连接节省通信量Cookie状态管理HTTP报文内的HTTP信息 Web基础 首先总所周知,HTTP是建立在TCP/IP之上的,也就是说,HTTP是TCP/IP的一个子集。 ...
  • 理解HTML HTTP API 和URL

    千次阅读 2020-05-06 11:07:15
    ‘响应’是指服务器对用户的请求作出的响应,‘无状态’是指用户与服务器之间的这种连接是一次性的,服务器不保留与客户交易时的任何状态,第二次连接与第一次连接没有任何关系,‘应用层’是指HTTP协议位于应用层上...
  • TCP协议HTTP协议的联系

    千次阅读 2016-11-16 09:41:34
    TCP/IP协议是客户端与服务端进行数据交互的一种协议方式,那么它是如何与服务端进行数据交互的?与HTTP协议又有什么联系? HTTP协议是获取地址,传递数据的一种基于...网页中的URl栏从左往右依次为协议、域名、
  • 网站地址、URL和域名的区别和关系

    万次阅读 2017-08-31 16:46:41
    这里所说的网址实际上指两个内涵,即IP域名。通用网址、域名、网站地址的三者是不同的概念,最基础的是域名。注册一个通用网址,你必须先要注册你的域名,提交给注册服务机构,这样通用网址就可以指向你...
  • 转载自 对Java的URL类支持的协议进行扩展的方法 JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类:java.net.URL、java.net....
  • http协议http协议和tcp协议的区别

    千次阅读 2017-03-08 11:14:13
    http是应用层的协议,并且无连接,无状态的协议http协议的特点:  1.支持c/s模式  2.简单快速:客户端向服务器端传送数据的时候,只需要发送请求方法路径,请求方法有:post,get,head。由于http协议...
  • Http协议详解(深入理解)

    万次阅读 多人点赞 2018-09-26 15:12:01
    设计HTTP最初的目的是为了提供一种发布接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted...
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,...JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境运行环境。 JRE:Java Runtime Environ...
  • HTTP协议简单介绍以及常用协议端口

    千次阅读 2019-08-03 10:40:22
    1.url 用于表示任意资源的位置 2.url详解 协议+主机名称+目录结构+文件名称 完整格式:<scheme>://<user>:<pwd>@<host>:<...scheme:协议,方案,常见的协议http/http...
  • 1.什么是http协议超文本传送协议 (HTTP-Hypertext transfer protocol) 定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向...
  • 万维网与HTTP协议

    千次阅读 2020-04-01 17:03:14
    万维网概述: 万维网www (World Wide Web)是...用户通过点击超链接(http://www.baidu.com) 获取资源,这些资源通过超文本传输协议(HTTP) 传送给使用者。 万维网以客户/服务器方式工作,用户使用的浏览器就是万维...
  • HTTP协议工作原理、工作过程

    千次阅读 2020-06-02 10:35:56
    HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输...
  • 现在想想无论分享什么内容都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢分享给大家 这个专题就是 HTTP协议原理与实践代码 相关的内容; 不积跬步,无以至千里, 戒焦戒躁 。 好了废话不多说, 直接上...
  • HTTP协议详解--请求与响应

    千次阅读 2019-06-24 20:56:22
    一、什么是HTTP协议 HTTP(超文本传输协议,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。 通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口...
  • HTTP协议理解及服务端与客户端的设计实现

    万次阅读 多人点赞 2019-06-20 19:05:05
    本文主要帮助读者理解 HTTP 的协作原理、HTTP 相关的各层协议,在服务端客户端的架构设计一些优化的技巧,本文中主要讲述逻辑思想和协议远离,会使用部分 Java 代码,但会有详细的讲解,非开发应该也读的明白。...
  • 现如今,一些游戏,网站,APP,支付行业的网络经常会收到DDOSCC,因此这个事情也变得不足为奇了。但在防护方案中有多种不同的方案。如,今天有几个同事在针对高防CDN问题讨论的时,谈到WebSocket协议,那么一些...
  • 目录1.HTTP协议1.1HTTP协议是什么1.2 HTTP协议工作过程1.3 HTTP请求方法1.4.HTTP请求报文应答报文1.5 HTTP状态码2.HTTPS协议2.1.什么是https协议2.2.加密模型2.3.数字证书2.4.HTTPS工作过程3.常见面试题总结3.1.在...
  • HTTP前端协议

    千次阅读 2017-08-08 23:54:09
    客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL协议版本、请求头部请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部响应数据。 ...
  • 协议系列之HTTP协议

    千次阅读 2014-08-26 18:52:41
    什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。HTTP协议用于从WWW服务器传输超文本到本地浏览器的...HTTP是一个应用层协议,它由请求响应组成,是一个标准的B/S模型;它也是一个
  • Http协议详解版本介绍

    万次阅读 2017-12-03 17:05:05
    协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。 HTTP协议,即超文本传输...
  • 详解HTTP协议与RESTFUL

    千次阅读 2020-07-08 20:33:32
    1.HTTP简介 http协议是一种超文本传输协议,主要应用在浏览器与...(1) 协议简单,只用传递请求方法路径,程序规模小,通信速度快。 (2)可以指定传输类型,由Content-Type标记。 (3)HTTP0.9 1.0使用非持续连接
  • 而了解TCP/IP 、HTTP等网络协议,更是对你未来的职业发展大有裨益。 下面,我总结了4个面试常考的关于浏览器网络通信的问题,为你重新梳理浏览器,网络通信、页面渲染、JavaScript、浏览器安全等知识,从而让你对...
  • URL与域名的含义

    千次阅读 2020-09-20 13:43:36
    1、URL的含义格式 用户使用浏览器访问网站时,需要在浏览器的地址栏中输入网址(网站地址),这个网址就是URL(Uniform Resource Locator,统一资源定位符)。URL信息会通过HTTP请求发送给服务器,服务器根据URL...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,006
精华内容 60,002
关键字:

url和http协议的关系