当前位置:文档之家› Web前端开发培训第一讲:Http协议讲义完整版

Web前端开发培训第一讲:Http协议讲义完整版

Web前端培训第一讲:HTTP协议讲义完整版目录0. 预备知识 (1)0.1 OSI层次模型与TCP/IP协议栈 (1)0.2 IP地址 (2)0.3 TCP/IP通信方式 (2)1. HTTP协议通信过程 (2)1.1 URL自动解析 (2)1.2 获取IP,建立TCP连接 (3)1.3客户端浏览器向服务器发出HTTP请求 (3)1.4 Web服务器应答,并向浏览器发送数据 (3)1.5 Web服务器关闭TCP连接 (3)2. HTTP协议之URL (4)2.1 HTTP协议概述 (4)2.2 HTTP之URL (4)2.3 URL编码 (5)3. HTTP协议之请求 (8)3.1 HTTP请求的结构 (8)4. HTTP协议之响应 (9)5. HTTP协议之消息报头 (10)5.1 普通报头 (10)5.2 请求报头 (11)5.3 响应报头 (12)5.4 实体报头 (13)6. 需要提前了解的工具HttpAnalyzer (14)7. 核心参考资料 (14)0.预备知识0.1OSI层次模型与TCP/IP协议栈CCNA视频教程:/playlist_show/id_767428.html重点学习第二讲OSI层次参考模型与第三讲TCP/IP协议栈。

0.2IP地址Windows Server 2003从入门到精通系列之:TCP/IP协议基础。

0.3 TCP/IP通信方式●按Client和Server的连接数量分类1)一个Client方连接一个Server方,或称点对点(peer to peer)。

2)多个Client方连接一个Server方,这也是通常的并发服务器方式。

3)一个Client方连接多个Server方,这种方式很少见。

●按连接方式分类1)长连接Client方与Server方先建立通讯连接,然后再进行报文发送和接收,在通信过程中连接不断开。

2)短连接Client方与Server每进行一次报文收发交易时才进行通讯连接,通讯完毕后立即断开连接。

●按发送接收方式分类1)异步报文发送和接收是分开的,相互独立的,互不影响。

这种方式又分两种情况:(1)异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接收(2)异步单工:接收和发送是用两个不同的程序来完成。

2)同步报文发送和接收是同步进行,既报文发送后等待接收返回报文。

1.HTTP协议通信过程当我们在浏览器的地址栏输入“”然后按回车,这之后发生了什么事,我们直接看到的是打开了对应的网页,那么内部客户端和服务端是如何通信的呢?1.1 URL自动解析HTTP URL包含了用于查找某个资源的足够信息,基本格式如下:HTTP://host[“:”port][abs_path],其中HTTP表示桶盖HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

例如:输入;浏览器会自动转换成:/1.2 获取IP,建立TCP连接浏览器地址栏中输入"/"并提交之后,首先它会在DNS本地缓存表中查找注1,如果有则直接告诉IP地址。

如果没有则要求网关DNS进行查找,如此下去,找到对应的IP后,则返回会给浏览器。

当获取IP之后,就开始与所请求的Tcp建立三次握手连接,连接建立后,就向服务器发出HTTP请求。

注1:在Windows操作系统环境下,解析域名的过程有很多步骤,详细内容可以参Windows Server 2003从入门到精通系列之:DNS协议基础。

1.3客户端浏览器向服务器发出HTTP请求一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,接着以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

1.4 Web服务器应答,并向浏览器发送数据客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK应答的第一部分是协议的版本号和应答状态码,正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

1.5 Web服务器关闭TCP连接一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接注2,然后如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-aliveTCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。

保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

注2:关闭连接也可以由客户端来要求。

2.HTTP协议之URL2.1 HTTP协议概述http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

关键词:请求与相应模式、无状态的、常基于TCP的应用程协议、持续连接的机制。

请求与相应模式:客户端发出一个请求,服务器给出一个应答。

无状态的:指http协议本身不会在多次请求间保持状态。

常基于TCP的应用程协议:TCP/IP是事实上的网络通信工业标准,但并不是唯一,因此是“常”。

持续连接的机制注3:指的是Http1.1版本,通信方式已经可以为“长连接”。

注3:http协议中规定了一个特殊规则:浏览器对一个服务器不能同时打开两个以上的连接(IP+Port)。

这个规则应该是为了保护服务器不会很容易被洪水攻击。

主流浏览器包括IE都实现了这个规则。

DEMO:用IE下载一个网站的文件,只能同时打开2个,第三个就需要等待。

附注:这个规定是对IE而言是精确到域名而不是IP。

相关内容的详细说明:HTTP协议1.1中文版:/Class/HTTP/0772522080738754597.html请查看8.1.4节最后的说明。

其中节选:另外:Iframe与DIV+ajax实现方式效果差别。

我们知道ERP和桌面部件大多数都是使用IFrame加载的。

那么它的缺陷非常的明显,因为iframe指定src的方式,默认是使用“同步长连接”。

因此当iframe的数量多了之后,连接数就会超过2,因此后面的请求必须等待。

如果加载的iframe服务端处理时间过长,则整个客户端的浏览器一直被阻塞住。

而DIV+ajax的方式则不同。

Ajax发出的请求最后都由ajax Engine发出,即连接由ajaxEngine 管理(发送和接收数据)。

因此,DIV+ajax异步请求不会出现IE页面阻塞现象。

2.2 HTTP之URLHTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[":"port][abs_path]http表示要通过HTTP协议来定位网络资源;●host表示合法的Internet主机域名或者IP地址;●port指定一个端口号,为空则使用缺省端口80;●abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。

DEMO:输入:,浏览器自动转换成: /2.3URL编码foo://:8042/over/there?name=ferret#nose\_/ \______________/ \________/\_________/ \__/| | | | |scheme authority path query fragmentURI是统一资源标识的意思,通常我们所说的Url只是URI的一种。

典型Url的格式如上面所示。

Url编码,实际上指的是URI编码。

2.3.1 为什么需要Url编码通常如果一样东西需要编码,说明这样东西并不适合传输。

对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。

DEMO:Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。

如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。

2.3.2哪些字符需要编码RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

RFC3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。

2.3.3 US-ASCII字符集中没有对应的可打印字符Url中只允许使用可打印字符。

US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。

同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII 定义的字节范围,因此也不可以放在Url中。

2.3.4 保留字符Url可以划分成若干个组件,协议、主机、路径等。

有一些字符(:/?#[]@)是用作分隔不同组件的。

DEMO:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数,等等。

还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。

当组件中的普通数据包含这些特殊字符时,需要对其进行编码。

RFC3986中指定了以下字符为保留字符:2.3.5 不安全字符还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。

这些字符被视为不安全字符,原因有很多。

●空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉●引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用●# :通常用于表示书签或者锚点●% :百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码●{}|\^[]`~:某一些网关或者传输代理会篡改这些字符需要注意的是,对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的这些字符,如果不经过编码,那么它们有可能会造成Url语义的不同。

相关主题