`
yysct2005
  • 浏览: 90665 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

TTP/1.1都把TCP作为底层的传输协议。HTTP客户首先发起建立与服务器TCP连接。一旦建立连接,浏览器进程和服务器进程就可以通过各自的套接字来访问TCP。如前所述,客户端套接字是客户进程和TCP连接之间的“门”,服务器端套接字是服务器进程和同一TCP连接之间的“门”。客户往自己的套接字发送HTTP请求消息,也从自己的套接字接收HTTP响应消息。类似地,服务器从自己的套接字接收HTTP请求消息,也往自己的套接字发送HTTP响应消息。客户或服务器一旦把某个消息送入各自的套接字,这个消息就完全落入TCP的控制之中。TCP给HTTP提供一个可靠的数据传输服务;这意味着由客户发出的每个HTTP请求消息最终将无损地到达服务器,由服务器发出的每个HTTP响应消息最终也将无损地到达客户。我们可从中看到分层网络体系结构的一个明显优势——HTTP不必担心数据会丢失,也无需关心TCP如何从数据的丢失和错序中恢复出来的细节。这些是TCP和协议栈中更低协议层的任务。 

  TCP还使用一个拥塞控制机制。该机制迫使每个新的TCP连接一开始以相对缓慢的速率传输数据,然而只要网络不拥塞,每个连接可以迅速上升到相对较高的速率。这个慢速传输的初始阶段称为缓启动(slow   start)。 

  需要注意的是,在向客户发送所请求文件的同时,服务器并没有存储关于该客户的任何状态信息。即便某个客户在几秒钟内再次请求同一个对象,服务器也不会响应说:自己刚刚给它发送了这个对象。相反,服务器重新发送这个对象,因为它已经彻底忘记早先做过什么。既然HTTP服务器不维护客户的状态信息,我们于是说HTTP是一个无状态的协议(stateless   protocol)。 

HTTP协议状态码的含义   

  号码   含义   
-----------------------------------------   
"100 "   :   Continue   
"101 "   :   witching   Protocols   
"200 "   :   OK   
"201 "   :   Created   
"202 "   :   Accepted   
"203 "   :   Non-Authoritative   Information   
"204 "   :   No   Content   
"205 "   :   Reset   Content   
"206 "   :   Partial   Content   
"300 "   :   Multiple   Choices   
"301 "   :   Moved   Permanently   
"302 "   :   Found   
"303 "   :   See   Other   
"304 "   :   Not   Modified   
"305 "   :   Use   Proxy   
"307 "   :   Temporary   Redirect   
"400 "   :   Bad   Request   
"401 "   :   Unauthorized   
"402 "   :   Payment   Required   
"403 "   :   Forbidden   
"404 "   :   Not   Found   
"405 "   :   Method   Not   Allowed   
"406 "   :   Not   Acceptable   
"407 "   :   Proxy   Authentication   Required   
"408 "   :   Request   Time-out   
"409 "   :   Conflict   
"410 "   :   Gone   
"411 "   :   Length   Required   
"412 "   :   Precondition   Failed   
"413 "   :   Request   Entity   Too   Large   
"414 "   :   Request-URI   Too   Large   
"415 "   :   Unsupported   Media   Type   
"416 "   :   Requested   range   not   satisfiable   
"417 "   :   Expectation   Failed   
"500 "   :   Internal   Server   Error   
"501 "   :   Not   Implemented   
"502 "   :   Bad   Gateway   
"503 "   :   Service   Unavailable   
"504 "   :   Gateway   Time-out   
"505 "   :   HTTP   Version   not   supported 

 

非持久连接和持久连接 

  HTTP既可以使用非持久连接(nonpersistent   connection),也可以使用持久连接(persistent   connection)。HTTP/1.0使用非持久连接,HTTP/1.1默认使用持久连接。 

  非持久连接 

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

  下面是具体步骡: 

  1.HTTP客户初始化一个与服务器主机www.yesky.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。 

  浏览器在接收web页面的同时把它显示给用户。不同的浏览器可能会以略有不同的方式解释(也就是向用户显示)同一个web页面。HTTP与客户如何解释Web页面没有任何关系,其规范([RFC   1945]和[RFC   2616I)仅仅定义HTTP客户程序和服务器程序之间的通信协议。 

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

  在上述步骡中,我们有意不说清客户是通过10个串行的TCP连接先后取得所有JPEG对象,还是通过并行的TCP连接同时取得其中某些JPEG对象。实际上,现今的浏览器允许用户通过配置来控制并行连接的程度。大多数浏览器默认可以打开5到10个并行的TCP连接,每个连接处理一个请求—响应事务。用户要是喜欢,可以把最大并行连接数设为l,那样的话这10个连接是串行地建立的。我们使用并行连接可以缩短响应时间。

 

HTTP消息格式 

  HTTP规范1.0[RPcl945]和1.1[RFC   2616]定义了HTTP消息的格式。HTTP消息分为请求消息和响应稍息两类。下面我们分别进行介绍。 

  HTTP请求消息 

  下面是一个典型的HTTP请求消息: 

  GET   /somedir/page.html   H7TP/1.1   
  Host:www.yesky.com   
  Connection:close   
  User-agent:Mozilla/4.0   
  Accept-language:zh-cn   
  (额外的回车符和换行符) 
  


  仔细检查这个简单的请求消息,我们可从中学到不少东西。首先,这个消息是用普通的ASCII文本书写的。其次,这个消息共有5行(每行以一个回车符和一个换行符结束),最后一行后面还有额外的一个回车特和换行符。当然,一个请求消息可以不止这么多行,也可以仅仅只有一行。该请求消息的第一行称为请求行(request   line),后续各行都称为头部行(header)。请求行有3个宁段:方法字段、URL字段、HTTP版本宇段。方法字段有若干个值可供选择,包括GET、POST和HEAD。HTTP请求消息绝大多数使用GET方法,这是浏览器用来请求对象的方法,所请求的对象就在URL字段中标识。本例表明浏览器在请求对象/somedir/page.html。版本字段是不言自明的;本例中浏览器实现的是HTTP/1.1版本。 

  现在看一下本例中的各个头部行。头部行Host:www.yesky.com定存放所请求对象的主机。请求消息中包含头部Connection:close是在告知服务器本浏览器不想使用持久连接;服务器发出所请求的对象后应关闭连接。尽管产生这个请求消息的浏览器实现的是HTTP/1.1版本,它还是不想使用持久连接。User-agent头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是Mozilla/4.0,它是Nelscape浏览器的一个版本。这个头部行很有用,因为服务器实际上可以给不同类型的用户代理发送同一个对象的不同版本(这些不同版本位用同一个URL寻址)。最后,Accept-languag:头部行指出要是所请求对象有简体中文版本,那么用户宁愿接收这个版本;如果没有这个语言版本,那么服务器应该发送其默认版本。Accept-languag:仅仅是HTTP的众多内容协商头部之一。

 

 

你可以在用程序测试的时候,用netstat查看一下当前的TCP连接,如果出现close_wait状态,则说明套接字是“被动关闭的”。如果出现“time_wait "状态,说明套接字是“主动关闭的”。 

TCP结束的过程如下: 

Server                                                           Client 

--------------   FIN   -------------->     server:   fin_wait_1 

<-------------   ACK   ---------------   client:   close_wait     server:fin_wait_2 

<-------------   FIN     ---------------   client发出fin之后就关闭   

--------------   ACK   ------------->     server发出ack后进入time_wait状态 

正常情况下,应该是IIS主动关闭连接的。如果客户端(IE)主动关闭了连接,那么就会在客户端出现time_wait状态。 
Time_Wait的默认时间是2倍的MLS,就是240秒钟。MLS是TCP   片在网上的最长存活时间。 
TIME_Wait的主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。 
现在的问题在于,4分钟的时间有点长。大量的Time_wait会带来一些不好的影响,首先每个TCP连接都各自有个数据结构,叫TCP   Control   Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。 
你可以权衡一下,然后决定是由客户端还是服务端主动断开连接。

分享到:
评论

相关推荐

    地址转化器 迅雷,电驴,网盘,快车,旋风,http链接转化

    标题中的“地址转化器 迅雷,电驴,网盘,快车,旋风,http链接转化”指的是一个工具或软件,它能够帮助用户将不同类型的下载链接转换为相互兼容的格式,以便在不同的下载管理器中使用。这些下载管理器,如迅雷、...

    磁力链接和传统的HTTP链接有何不同?

    磁力链接与传统HTTP链接在技术实现、使用场景、用户体验、安全性和法律问题上都存在显著差异。磁力链接的去中心化特性使其在文件分享方面具有独特优势,但也带来了隐私和版权方面的挑战。随着技术的发展和法律的完善...

    批量打开http链接的小东西

    功能:在一个ie窗口,按照时间间隔,循环刷新文本文件中的http链接,如果要求打开的网页数量小于文本文件中链接 个数,则随机从文本文件中取链接数;否则,就顺序打开文本文件中的链接; 本程序支持并行执行;

    各种下载地址转换(迅雷 qq旋风 rayfile bitcomet)之间转换

    对于Rayfile,用户可以尝试寻找Rayfile的种子文件(.torrent),这样就能在BitComet中进行P2P下载,通常速度会优于直接使用HTTP链接。 转换下载地址的过程中,需要注意以下几点: 1. 保持网络连接稳定,确保转换...

    Python 正则表达式匹配字符串中的http链接方法

    利用Python正则表达式匹配字符串中的http链接。主要难点是用正则表示出http 链接的模式。 import re pattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+') #...

    http链接转码utf-8,String转码utf-8

    String转utf-8,http链接转utf-8

    Python爬虫下载磁力链接

    磁力链接是一种用于标识资源的链接,它不同于传统的 HTTP 链接,而是以"magnet:"开头,后面跟着一段 base32 编码的字符串。磁力链接的优点是可以直接通过 BT 软件进行下载,并且无需依赖任何中间服务器。 2. 爬虫...

    迅雷下载链接解析工具

    它主要功能是将迅雷、电驴(eMule)、旋风等非标准下载链接转换成通用的HTTP链接,使用户能够用任何支持HTTP协议的下载工具或浏览器进行下载,无需依赖特定的客户端软件。 首先,我们来深入了解迅雷下载链接的工作...

    QQ旋风/迅雷/快车下载地址在线转换工具_专用链转http链接

    现在像QQ旋风、迅雷、快车这些下载工具,都有自己的专用链,专用...今天发布的这款“QQ旋风/迅雷/快车下载地址在线转换工具”的作用就是帮您将QQ旋风、迅雷、快车这些软件所支持的专用链地址转换成普通的HTTP下载地址。

    专用下载链接转换工具

    例如,如果一个HTTP链接在迅雷中下载速度慢,用户可以将其转换为快车或旋风的链接,看是否能提升下载速度。 在压缩包文件"zyl"中,可能包含的就是这个转换工具的安装程序或源代码,用户可以解压后运行来体验这项...

    磁力链接的概述及详解.pdf

    与传统的基于位置或名称的链接(如HTTP链接)不同,磁力链接不依赖于具体的文件服务器或位置,而是通过文件内容的散列值(如SHA-1)进行识别。这使得磁力链接具有去中心化、高效和灵活的特点。 详解 1.基本原理 1....

    url链接还原,将url 短链接(加密、压缩后的链接)还原出原始链接

    http 链接还原,无论任何链接、短链接、压缩后端链接、包装过的链接都可以将其还原出原始链接。 可以用于线报内容分析、去重、解析等业务。 需要源码的可以联系我,包服务搭建。 C|a|ll,Q||Q:2026369403

    Jquery实现http地址自动变成可访问的url链接插件

    本篇文章将详细讲解如何利用 jQuery 实现一个功能,即自动将文本中的 http 地址转化为可点击的 URL 链接。 首先,我们需要了解这个插件的工作原理。在网页文本中,用户可能会输入或复制带有 http 或 https 前缀的...

    115网盘地址转换,可以将115地址转为http地址

    4. 复制HTTP链接:转换完成后,将显示的HTTP地址复制到剪贴板,或者保存到文本文件中备用。 5. 下载文件:用这个新的HTTP地址在任何支持HTTP下载的软件或浏览器中启动下载。 请注意,115网盘可能会对非会员设置...

    专用链接转换工具 V.1 绿色版

    它能够识别并解析上述提到的特殊格式链接,通过内部算法将其转化为普通的HTTP链接,这样,用户就可以在任何支持HTTP下载的环境下进行文件获取,不受特定下载工具的限制。 在实际使用中,用户只需将待转换的链接复制...

    磁力链接的详细解析.docx

    磁力链接通常由一系列参数组成,这些参数的顺序并不固定,格式类似于HTTP链接中的查询字符串。一个典型的磁力链接包含以下参数: - **magnet:** 表示协议名。 - **xt (exact topic):** 包含文件哈希值的统一资源...

    迅雷、115网盘、快车、旋风、rayfile下载链接解析工具

    解析工具通过解密过程,可以将rayfile链接转化为可以直接下载的HTTP链接,提高下载的便捷性。 下载链接解析工具V1.6是独木成林的杰作,它整合了上述五种主流下载服务的链接解析功能,用户只需输入相应的链接,即可...

    下载链接解析工具

    下载链接解析工具能够解析这些链接,揭示其背后的HTTP或FTP链接,使得不使用迅雷也能下载资源。 电驴(eDonkey)是早期的P2P文件共享网络,它的链接包含了服务器地址和文件哈希。解析电驴链接可以将这些元数据转换成...

    基于PHP的迅雷快车链接在线转换实现代码.zip

    4. **正则表达式**:可能需要使用正则表达式来匹配和提取HTTP链接中的关键信息,以便转换为迅雷快车的链接格式。正则表达式是处理字符串的强大工具,可以用于查找、替换和提取模式。 5. **数据解析与处理**:服务器...

Global site tag (gtag.js) - Google Analytics