在操作系统术语中,进行通信的实际上是进程而不是程序。进程通过一个称为套接字(socket)的软件接口在网络上发送和接收报文(message)。套接字是同一台主机内应用层与传输层之间的接口。开发者可以控制套接字在应用层的所有东西,但是对该套接字的传输层几乎没有控制,仅限于:1)选择传输层协议(TCP或UDP);2)设定几个传输层参数,如最大缓存、最大报文段长度等。
应用 | 应用层协议 | 支撑的传输层协议 |
---|---|---|
电子邮件 | SMTP | TCP |
远程终端访问 | Telnet | TCP |
Web | HTTP | TCP |
文件传输 | FTP | TCP |
流媒体 | HTTP、RTP | TCP或UDP |
因特网电话 | SIP、RTP或专用 | UDP |
HTTP协议
Web的应用层协议是超文本传输协议(HyperText Transfer Protocal, HTTP)。HTTP协议定义了Web客户机是如何向Web服务器请求Web页面,以及服务器如何将Web页面传送给客户机的。HTTP使用TCP作为它的传输层协议。
服务器向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息,所以我们说HTTP协议是一个无状态(stateless)协议。HTTP协议是无状态的,但是通过引入Cookie技术,再用HTTP协议通信,就可以管理状态了。
HTTP协议的初始版本中,每进行一次HTTP通信,就要断开一次TCP连接。以当年的通信情况来说,因为都是些容量小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,一个HTML页面往往包含多张图片,这就导致每次请求都会造成无谓的TCP连接建立和断开,增加通信量的开销。
为了解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0提出了持久连接(HTTP Persistent Connections,也称为HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。在HTTP/1.1中,所有的连接默认都是持久连接,但在HTTP/1.0内并未标准化。
HTTP报文有两种:请求报文和响应报文。
请求报文

HTTP请求报文的第一行叫做请求行(request line),后面的行叫做首部行(header line)。
请求行包含3个字段:请求的方法、请求的URI和HTTP版本。
请求的方法 | 说明 | 支持的HTTP协议版本 |
---|---|---|
GET | 获取指定URI的资源 | 1.0、1.1 |
POST | 传输报文实体的主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获取报文首部,不响应实体 | 1.0、1.1 |
DELETE | 删除文件 | 1.0、1.1 |
OPTIONS | 询问支持的方法 | 1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 要求用隧道协议连接代码 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
HTTP协议本身并没有规定URI允许的长度(GET的URL长度)和报文实体的大小(POST的表单大小),具体的限制是由客户端的浏览器或服务端的web服务自行进行设定的,且各个浏览器的标准并不统一。
响应报文

HTTP响应报文的第一行叫做状态行,包含3个字段:HTTP版本、表明响应结果的状态码和原因短语。其它部分与请求报文结构类似。
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
200 | OK | 正常处理 |
204 | No Content | 服务器返回的响应中不包含实体的主体部分 |
206 | Partial Content | 服务器执行了客户端的范围请求 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
301 | Moved Permanently | 永久重定向 |
302 | Found | 临时性重定向 |
303 | See Other | 请求的资源存在另外一个URI,应使用GET方法定向获取资源 |
304 | Not Modified | 客户端发送附带条件的请求时,若请求资源未满足条件,直接返回304 |
307 | Temporary Redirect | 临时重定向,保持原来的请求方法,即禁止将POST变成GET |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
400 | Bad Request | 请求报文中存在语法错误 |
401 | Unauthorized | 请求需要有通过HTTP认证的认证信息 |
403 | Forbidden | 请求资源的访问被服务器拒绝了 |
404 | Not Found | 服务器上无法找到请求的资源 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
500 | Internal Server Error | 服务器端在执行请求时发生了错误 |
503 | Service Unavailable | 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求 |
HTTPS协议
HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL(Secure Socket Layer)和TLS(Transport Layer Security)协议代替而已。
通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。所以,HTTPS其实就是身披SSL协议这层外壳的HTTP。在采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护这些功能。

SSL是独立于HTTP的协议,所以不光是HTTP协议,其它运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。

步骤1:客户端通过发送 Client Hello 报文开始SSL通信。报文中包含客户端支持的SSL版本和加密组件列表(所使用的加密算法及密钥长度等)。
步骤2:服务器可进行SSL通信时,会以 Server Hello 报文作为应答。报文中包含SSL版本和加密组件。服务器应答的加密组件是从接收到的客户端加密组件列表中筛选出来的。
步骤3:接着,服务器发送 Certificate 报文。报文中包含公开密钥证书。
步骤4:最后,服务器发送 Server Hello Done 报文通知客户端,最初阶段的SSL握手协商部分结束。
步骤5:SLL第一次握手结束后,客户端以 Client Key Exchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密钥串。该报文已使用步骤3中的公开密钥进行加密。
步骤6:接着,客户端发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。
步骤7:最后,客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。
步骤8:服务器同样发送 Change Sciper Spec 报文。
步骤9:服务器同样发送 Finished 报文。
步骤10:服务器和客户端的 Finished 报文交换完毕后,SSL连接就算建立完成。当然,通信会受到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求。
步骤11:应用层协议通信,即发送HTTP响应。
步骤12:由客户端断开连接。断开连接时,发送 close_notify 报文;这步之后发送 TCP FIN 报文来关闭与TCP的通信。或者直接发送关闭。
要进行HTTPS通信,证书是必不可少的。而使用的证书必须向认证机构(CA)购买。证书价格可能会根据不同的认证机构略有不同。
网友评论