URL的概念与组成
浏览某个网页时,很重要的是要知道某个网页的URL(统一资源定位符Uniform Resource Locator)。
以 https://www.baidu.com/index.php 为例:
通过URL的组成,可以看到当我们在浏览器中输入URL时,
其中的域名会被提取出来,并用DNS服务将其解析为IP地址。
之后就进行HTTP读物,建立连接,发送请求,接收应答消息,断开连接,
最终就会在浏览器上浏览到我们想要浏览的页面。
平时俗称的 “网址” 其实就是说的 URL:
urlencode 和 urldecode
urldecode 就是 urlencode 的逆过程
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现.
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成 %XY 格式
例:"+" 被转义成了 "%2B"
应用层协议:HTTP
全称:Hyper Text Transfer Protocol 超文本传输协议
是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)的协议。
HTTP协议工作于客户端-服务端架构为上。
浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息。
从层次的角度看,HTTP协议是一个应用层协议;
它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
它可以使浏览器更加高效,使网络传输减少,
不仅保证计算机正确快速地传输超文本文档,
还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。
HTTP是我们浏览网页、看在线视频、听在线音乐等必须遵循的规则。
正是在这样的规则下,浏览器才能向万维网服务器发送万维网文档请求,
然后服务器会将请求的文档发送回浏览器。
在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和规则,
这些格式和规则就构成了超文本传输协议。
它所对应的传输层的协议是TCP的传输;
它所应用的传输层的端口是80号端口,另外还有一个备用端口是8080端口。
HTTP消息结构
HTTP是基于客户端/服务端(C/S)的架构模型,通过一个可靠的链接来交换信息,是一个无状态的请求/响应协议。
一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。
HTTP协议格式
HTTP请求
请求格式:
请求报文:
请求报文(Request message)包含了四个部分的内容:
请求行(Request line)
头部(Headers)
空行(A blank line)
主体部分(Body)
请求行(Request line)包含了三部分的内容:
Request type
URL
HTTP version
URL全称:Uniform Resource Locator
统一资源定位符由四部分组成:
Method
Host
Port
Path
Request message:
Request message 详细格式:
Request line:
HTTP请求:
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串.
如果Body存在, 则在Header中会有一个 Content-Length 属性来标识Body的长度
HTTP响应
响应格式:
响应报文:
响应报文(Response message)包含了四个部分的内容:
状态行(Status line)
头部(Headers)
空行(A blank line)
主体部分(Body)
状态行(Status line)包含了三部分的内容:
HTTP version
Status code
Status phrase
Response message:
Response message 详细格式:
Status line:
HTTP响应:
首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\