最近一直在研究如何让asp.net实现上传大文件的功能,因此都没怎么写技术类的文章了。惋惜的是至今还没研究出来,惭愧~~~。不过由于这样,也了解了一下http消息请求的大体过程。我就先简单介绍下,而后再来说如何利用Telnet来模拟Http请求。讲得不对的地方还但愿你们给我指出来。由于内容比较多,因此分红两部分来写。
一、流程简介
二、Telnet模拟HTTP请求
这篇咱们就来作一个简单介绍。
先提个问题:当咱们在浏览器的地址栏中输入"http://www.baidu.com/",而后按"回车",这以后发生了什么事?这里先不回答,你们接着往下看先。
咱们来分析一下:
·HTTP请求流程
首先,http属于Tcp/Ip模型中的应用层协议,而两个应用程序(咱们这里指的就是浏览器与服务器)之间要进行互相通讯,首先得创建Tcp链接,而后浏览器才能向服务器发送请求信息,服务器在接受到请求信息后,返回相应的应答信息,浏览器接收到来自服务器的应答信息后,对这些数据进行解释执行。
在http 1.0的版本中,浏览器的每次请求(也就是对每个页面的访问)都要求创建一次单独的链接,在处理完每一次的请求后,就自动释放链接。(这点咱们应该都有感受,好比咱们访问一个页面,当该页面在浏览器中显示出来的时候,咱们能够拔掉网线,此时该页面上的信息并不会丢失。)而当咱们请求的网页文件中有不少图片、音乐、电影等信息时,服务器返回的信息中并不直接包含图片数据,而只是保存该图片的连接,当浏览器进行解释的时候,遇到图片的url时,才向服务器发出对图片的请求信息。可见若是一个网页中包含多个图片数据时,将会频繁的与服务器创建链接,与释放链接,这无疑会形成资源的浪费。html
http 1.0 请求模式
而http 1.1则能够在一次链接中处理多个请求,而且多个请求能够重叠进行,不须要等待一个请求结束后再发送下一个请求。web
创建链接的方式浏览器
HTTP支持2中创建链接的方式:非持久链接和持久链接(HTTP1.1默认的链接方式为持久链接)。缓存
1) 非持久链接服务器
让咱们查看一下非持久链接状况下从服务器到客户传送一个Web页面的步骤。假设该贝面由1个基本HTML文件和10个JPEG图像构成,并且全部这些对象都存放在同一台服务器主机中。再假设该基本HTML文件的URL为:gpcuster.cnblogs.com/index.html。asp.net
下面是具体步骡:工具
1.HTTP客户初始化一个与服务器主机gpcuster.cnblogs.com中的HTTP服务器的TCP链接。HTTP服务器使用默认端口号80监听来自HTTP客户的链接创建请求。2.HTTP客户经由与TCP链接相关联的本地套接字发出—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。3.HTTP服务器经由与TCP链接相关联的本地套接字接收这个请求消息,再从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。post
4.HTTP服务器告知TCP关闭这个TCP链接(不过TCP要到客户收到刚才这个响应消息以后才会真正终止这个链接)。网站
5.HTTP客户经由同一个套接字接收这个响应消息。TCP链接随后终止。该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。ui
6.给每个引用到的JPEG对象重复步骡1-4。
上述步骤之因此称为使用非持久链接,缘由是每次服务器发出一个对象后,相应的TCP链接就被关闭,也就是说每一个链接都没有持续到可用于传送其余对象。每一个TCP链接只用于传输一个请求消息和一个响应消息。就上述例子而言,用户每请求一次那个web页面,就产生11个TCP链接。
2) 持久链接
非持久链接有些缺点。首先,客户得为每一个待请求的对象创建并维护一个新的链接。对于每一个这样的链接,TCP得在客户端和服务器端分配TCP缓冲区,并维持TCP变量。对于有可能同时为来自数百个不一样客户的请求提供服务的web服务器来讲,这会严重增长其负担。其次,如前所述,每一个对象都有2个RTT的响应延长——一个RTT用于创建TCP链接,另—个RTT用于请求和接收对象。最后,每一个对象都遭受TCP缓启动,由于每一个TCP链接都起始于缓启动阶段。不过并行TCP链接的使用可以部分减轻RTT延迟和缓启动延迟的影响。
在持久链接状况下,服务器在发出响应后让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链接,服务器发出第一个对象后就没必要再以一开始的缓慢速率发送后续对象。相反,服务器能够按照第一个对象发送完毕时的速率开始发送下一个对象。 ·