1.HTTP协议
我们在套接字部分编写的代码和应用层一中编写的网络计算器代码都是在应用层工作的,是应用层代码,因此应用层代码包括:
(1)基本系统socket套接字系列接口的使用。
(2)定制协议(例如网络计算器Protocol.hpp文件中的代码)
(3)编写业务(例如网络计算器severTcp文件中的calculator接口)
注:定制协议和编写业务是两回事,可以进行解耦。
网络计算器场景下我们使用socket套接字系列接口、定制协议、编写业务的过程较为麻烦,考虑的也不一定全面。一些常用的场景已经有程序员自定义过成熟的协议,这些协议慢慢成为了应用层特定协议的标准,可以被我们直接使用。
应用层代码的定制协议部分常见协议标准有http、https、smtp、ftp、DNS等,我们这里以http、https为主进行讲解。
注:这些常见协议标准主要完成了应用层代码的“基本系统socket套接字系列接口的使用”部分和“定制协议”部分功能。
1.1.HTTP简介
HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上。
在编写网络通信代码时,我们可以自己进行协议的定制,但实际有很多优秀的工程师早就已经写出了许多非常成熟的应用层协议,其中最典型的就是HTTP协议。
1.2.认识URL
URL(Uniform Resource Lacator)叫做统一资源定位符,也就是我们通常所说的网址,是因特网的万维网服务程序上用于指定信息位置的表示方法。
一个URL大致由如下几部分构成:
协议方案名:
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)协议:简单文件传输协议。
登录信息:
usr:pass表示的是登录认证信息,包括登录用户的用户名和密码。虽然登录认证信息可以在URL中体现出来,但绝大多数URL的这个字段都是被省略的,因为登录信息可以通过其他方式(网页扫码登录、网页账号密码登录等)交付给服务器。
服务器地址:
www.example.jp表示的是服务器地址,也叫做域名,比如www.alibaba.com,www.qq.com,www.baidu.com。需要注意的是,我们用IP地址标识公网内的一台主机,但IP地址本身并不适合给用户看。比如说我们可以通过ping命令,分别获得www.baidu.com和www.qq.com这两个域名解析后的IP地址。
如果用户看到的是这两个IP地址,那么用户在访问这个网站之前并不知道这两个网站到底是干什么的,但如果用户看到的是www.baidu.com和www.qq.com这两个域名,那么用户至少知道这两个网站分别对应的是哪家公司,因此域名具有更好的自描述性。
实际我们可以认为域名和IP地址是等价的,在计算机当中使用的时候既可以使用域名,也可以使用IP地址。但URL呈现出来是可以让用户看到的,因此URL当中是以域名的形式表示服务器地址的。
注:域名最终会被转化为IP地址。
服务器端口号:
80表示的是服务器端口号。HTTP协议和套接字编程一样都是位于应用层的,在进行套接字编程时我们需要给服务器绑定对应的IP和端口,而这里的应用层协议也同样需要有明确的端口号。
常见协议对应的端口号:
协议名称 对应端口号 HTTP 80 HTTPS 443 SSH 22 当我们使用某种协议时,该协议实际就是在为我们提供服务,现在这些常用的服务与端口号之间的对应关系都是明确的,所以我们在使用某种协议时实际是不需要指明该协议对应的端口号的,浏览器会自动添加对应的端口号,因此在URL当中,服务器的端口号一般也是被省略的。
注:
1.客户端访问服务器时必须要有域名(IP地址)和端口号,因为网络通信的本质是socket通信,socket通信需要IP地址+端口号。
2.我们前面讲过做测试时,我们不要绑定1024之前的端口号,因为0-1023端口号是给这些标准协议使用的。
带层次的文件路径:
/dir/index.htm表示的是要访问的资源所在的路径。访问服务器的目的是获取服务器上的某种资源,通过前面的域名和端口已经能够找到对应的服务器进程了,此时要做的就是指明该资源所在的路径。比如我们打开浏览器输入百度的域名后,此时浏览器就帮我们获取到了百度的网页首页,如下图一所示。当我们发起网页请求时,本质是访问服务器的某个.html网页文件,从.html文件中获取了如下图二这样的网页信息(图二展示了网页端和Linux端两种获取百度网页首页文件信息的方法),然后浏览器对这张网页信息进行解释,最后就呈现出了对应的网页,我们可以将这种资源称为网页资源。
此外我们还会向服务器请求视频、音频、网页、图片等资源。HTTP之所以叫做超文本传输协议,而不叫做文本传输协议,就是因为有很多资源实际并不是普通的文本资源。
因此在URL当中就有这样一个字段,用于表示要访问的资源所在的路径。此外我们可以看到,这里的路径分隔符是/,而不是\,这也就证明了实际很多服务都是部署在Linux上的。