一、HTTP简介
HTTP(Hyper Text Transfer Protocol)协议又被称为做超文本传输协议,是一种简单的请求-响应协议,HTTP通常运行在TCP之上
在编写网络通信代码时,可以自行进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议
二、认识URL
URL(Uniform Resource Lacator)叫做统一资源定位符,即通常所说的网址,是因特网的万维网服务程序上用于指定信息位置的表示方法
2.1 协议方案名
http://表示的是协议名称,表示请求时需要使用的协议,通常使用的是HTTP协议或安全协议HTTPS。HTTPS是以安全为目标的HTTP通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性
常见的应用层协议:
DNS(Domain Name System)协议:域名系统
FTP(File Transfer Protocol)协议:文件传输协议
TELNET(Telnet)协议:远程终端协议。
HTTP(Hyper Text Transfer Protocol)协议:超文本传输协议
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer)协议:安全数据传输协议
SMTP(Simple Mail Transfer Protocol)协议:电子邮件传输协议
POP3(Post Office Protocol - Version 3)协议:邮件读取协议
SNMP(Simple Network Management Protocol)协议:简单网络管理协议
TFTP(Trivial File Transfer Protocol)协议:简单文件传输协议
2.2 登录信息
usr:pass 表示的是登录认证信息,包括登录用户的用户名和密码。虽然登录认证信息可以在URL中体现出来,但绝大多数URL这个字段都是被省略的,因为登录信息可以通过其他方案交付给服务器
2.3 服务器地址
www.example.jp表示的是服务器地址,也被称为域名,如www.alibaba.com,www.qq.com
需要注意的是,用IP地址标识公网内的一台主机,但IP地址本身并不适合给用户看。比如可以通过ping命令,分别获得www.baidu.com和www.qq.com这两个域名解析后的IP地址
若用户看到的是两个IP地址,那么用户在访问这个网站之前并不知道这两个网站到底是干什么的,但若用户看到的是www.baidu.com和www.qq.com这两个域名,那么用户就知道这两个网站分别对应的是哪家公司,因此域名具有更好的自描述性
在计算机中使用的时候既可以使用域名,也可使用IP地址。但URL呈现出来需要让用户看见,因此URL以域名的形式表示服务器地址的更好
2.4 服务器端口号
80表示的是服务器端口号。在进行套接字编程时需要给服务器绑定对应的IP和端口,而这里的应用层协议也同样需要有明确的端口号
常见协议对应的端口号:
现在这些常用的服务与端口号之间的对应关系都是明确的,所以在使用某种协议时实际是不需要指明该协议对应的端口号的,因此在URL中,服务器的端口号一般是被省略的
2.5 带层次的文件路径
/dir/index.htm 表示的是要访问的资源所在的路径。访问服务器的目的是获取服务器上的某种资源,通过前面的域名和端口已经能够找到对应的服务器进程了,此时需要指明该资源所在的路径
比如打开浏览器输入百度的域名后,此时浏览器就获取到了百度的首页
当用户发起网页请求时,本质是获得了这样的一张网页信息,浏览器对网页信息进行解释,就呈现出了对应的网页
这种资源被称为网页资源,此外用户还会向服务器请求视频、音频、图片等资源。HTTP之所以被称为超文本传输协议,而不是文本传输协议,就是因为有很多资源实际并不是普通的文本资源
因此在URL中就有这样一个字段,用于表示要访问的资源所在的路径。这里的路径分隔符是/,而不是\,这也就证明了实际很多服务都是部署在Linux上的
2.6 查询字符串
uid=1表示的是请求时提供的额外的参数,这些参数是以键值对的形式,通过&符号分隔开的
比如在百度上面搜索HTTP,此时可以看到URL中有很多参数,而在这众多的参数中有一个参数wd(word),表示的就是搜索时的搜索关键字wd=HTTP
双方在进行网络通信时,是能够通过URL进行用户数据传送的
三、urlencode和urldecode
若在搜索关键字当中出现了类似 / ? : 这样的字符,这些字符已经被URL当作特殊意义理解了,但某些情况下并不希望这些字符被当作特殊字符处理,为了避免冲突,特殊字符需要表达普通含义时就会进行转义
URL中除了会对特殊符号做编码,对中文也会进行编码
规则:将需要转码的字符转为十六进制,然后从右到左,取4位(不足4位直接处理),每两位做一位,前面加上%,编码成%XY格式
示例
当搜索C++时,由于+号在URL中也是特殊符号,而+字符转为十六进制后的值就是0x2B,因此C++就会被编码成C%2B%2B
在线编码工具
http://tool.chinaz.com/tools/urlencode.aspx
当服务器拿到对应的URL后,也需要对编码后的参数进行解码,此时服务器才能拿到想要传递的参数,解码实际就是编码的逆过程