HTTP协议(超文本传输协议)
用于从万维网服务器传输超文本到本地浏览器的传送协议
基于TCP/IP通信协议来传输数据(HTML文件,图片文件、查询结果等)
属于应用层面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
主要特点
1、简单快捷:客户想服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户和服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4、无状态:HTTP协议是无状态协议。无状态是指的协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。从另一方面来说,服务器在不需要先前信息时的处理速度和应答较快。
5、支持B/S及C/S模式。
1.1 请求/响应报文
HTTP的请求方式都有哪些?
GET、POST、HEAD、DELETE、PUT、OPTIONS等
就我们常用的GET、POST方式有什么区别?
从语义的角度来看的话
GET:获取资源,安全的,幂等的,可缓存的
POST:处理资源,非安全的,非幂等的,不可缓存的
安全性:不引起Server端的任何状态变化。
幂等性:同一个请求方法执行多次和执行一次的效果完全相同
可缓存性:请求是否可以被缓存
1.2 HTTP之URL
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息。
URL,全称是UniformResourceLocator(统一资源定位符),是互联网上用来标识某一处资源的地址以下面的这个URL为例,介绍一下一个URL的组成部分
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name](http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
从上面的URL可以看出,一个完整的URL包括一下的几个部分:
1、协议部分:该协议部分为“http:”。
2、域名部分:www.aspxfans.com,也可以是一个IP地址。
3、端口部分:跟在域名后面的是端口,端口和域名之间用“:”隔开,端口不是一个URL的必须部分,省略则采用默认端口。
4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”。
5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名。
6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分。
7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
1.3 工作原理
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认80)建立一个TCP套接字连接。
2、发送HTTP请求
通过套接字,客户端向Web端发送一个文本的请求报文,一个请求报文由请求行、请求头部、请求数据和空行组成。
3、服务器接收请求并返回HTTP相应
Web服务器解析请求,定位到请求资源。服务器将资源复写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行、响应数据四部分组成
4、释放连接TCP连接
若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection模式为keepalive,则该连接保持一段时间,在该时间内可以继续接收请求。
5、客户端浏览解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏输入URL,按下回车之后会经历一下流程:
1、浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址。
2、解析出IP后,根据IP地址和默认的端口80,和服务器建立TCP连接。
3、浏览器发出读取文件(URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器。
4、服务器对浏览器请求作出响应,并把对应的html文本发送给浏览器。
5、建立TCP连接。
6、浏览器将该HTML文本显示到窗口。
1.4 三次握手、四次挥手
三次握手:建立连接;四次挥手
为什么进行三次握手而不是两次呢?
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误,造成服务器端的一直等待而产生的浪费资源。
为什么断开连接需要双向断开呢?
究其原因,主要还是因为TCP是全双工模式,即A先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接,等待B的确认;B确认后,A到B方向上的连接就释放了,这时候的TCP连接处于半关闭状态,也就是说A已经没有数据要发送给B了,但B若是要发送数据给A,还是可以的。也就是说从B到A这个方向的连接并没有关闭。这个状态可能会持续一些时间。当B没有数据发送时,类似前面A到B操作,B发送报文,A确认。B到A方向上的连接也就中断了。
网友评论