写在前面
我们在绝大部分使用HTTP服务的场景中,都是利用浏览器或者请求发送工具(Postman)来构造HTTP请求报文,并由这些工具接收响应报文,最终根据一定规则渲染报文的效果(二进制流、文件、图片、或普通web界面)。那么HTTP协议到底是怎么工作的呢?或者说一次HTTP的请求事务过程是怎样的呢?下面我们利用【telnet】命令来探究HTTP事务的执行过程。
Telnet与HTTP
由于HTTP使用了TCP/IP 传输协议,而且它是基于文本的,没有使用那些难以理解的二进制格式,因此很容易直接与Web服务器进行对话。Telnet程序可以将(本地)键盘连接到某个目标(远端或本地)TCP端口,并将此TCP端口的输出回送到显示屏(本地)上。Telnet常用于远程终端会话,但它几乎可以连接所有的TCP服务器,包括HTTP服务器。可以通过Telnet程序直接与Web服务器进行对话。通过Telnet可以打开一条到某台机器上某个端口的TCP连接,然后直接向那个端口输入一些字符(命令)。Web服务器会将Telnet程序作为一个Web客户端来处理,所有回送给TCP连接的数据都会显示在(本地)显示屏上。
我们用Telnet与一个实际的Web服务器进行交互。我们要用Telnet获取URL www.jianshu.com/index 所指向的文档。下面我们来说明一下会发生什么情况:
- 首先,查找 www.jianshu.com 的IP地址,打开一条到那台机器端口80的TCP连接。Telnet会为我们完成那些“跑腿儿”的工作。
- 一旦打开了TCP连接,就要输入HTTP请求了。
- 请求结束(由一个空行表示)之后,服务器会在一条HTTP响应中将内容回送并关闭连接。
Telnet模拟HTTP客户端开启HTTP事务
下面是使用Telnet的HTTP事务图:
Telnet会查找主机名(使用DNS找到对应的IP地址)并打开一条连接,连接到在 www.jianshu.com 的端口80 上监听的Web服务器。这条命令之后的三行内容是Telnet的输出,告诉我们它已经建立了连接。
然后我们输入最基本的请求命令 GET /index HTTP/1.1,发送一个提供了远端主机名的Host首部,后面跟上一个空行,请求从服务器 www.jianshu.com 上获取资源 /index。随后,服务器会以一个响应行、几个响应首部、一个空行和最后面的HTML文档主体来应答。