什么是http呢?对于http的概念总是存在着模糊的概念,对它了解得并不透彻。现在我们来系统结合计算机的一些网络通信基础来彻底弄懂HTTP。
定义
HTTP:全称是超文本传输协议(Hypertext transfer protocol),是用于从WWW服务器传输超文本到本地浏览器的传送协议,它运行在TCP上,是一个应用层通信协议。
WWW服务器的传送协议?那WWW是什么呢?
下图是一张关系图:
可以看出WWW只是Internet提供的一种服务,Internet还有很多包括FTP,E-mail等等服务。
百度百科对于WWW的解释是这样的:
WWW是基于客户机/服务器方式的信息发现技术和超文本技术的综合。WWW服务器通过超文本标记语言(HTML)把信息组织成为图文并茂的超文本,利用链接从一个站点跳到另个站点。这样一来彻底摆脱了以前查询工具只能按特定路径一步步地查找信息的限制。WWW (World Wide Web,万维网)是存储在Internet计算机中、数量巨大的文档的集合。
从这里我们可以知道WWW是网页文档的集合,提供网页服务。
那么TCP是什么呢?为什么说它是应用层通信协议?还有其他协议?
下图是实现数据通信的分层概念:
可以看到TCP/IP协议栈里,各个层级中有不同作用的协议,HTTP处于应用层中,在传输层中的TCP之上。
当我们在客户端和服务端的请求和响应相互数据传输前,首先会进行TCP连接。
TCP建立连接的三次握手和TCP释放连接的四次挥手
建立连接的三次握手:
- 第一次: 客户端发送SYN(SYN:同步,表示开始会话请求)(SEQ=x)报文给服务器端,客户端状态由closed进入syn_send。
- 第二次:服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,服务器状态由listen进入syn_received状态。
- 第三次:客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,客户端进入established状态。
- 最后: 服务器收到确认报文段,服务器状态由syn_received变为established(完成连接)
为什么是三次握手呢?而不是两次呢?
一个是由TCP连接的特性决定,一次RT(往返)完成一个TCP动作。即一次请求携带的SEQ必须得到一个ACK。
另外是防止失效的报文创建连接。因为互联网链路发送的报文可能会被互联中的网络设备阻塞,经过了一段时间才到达服务器,时间大于了RTO(Retransmission TimeOut)时间,导致客户端重发SYN报文(重新创建新的连接,并丢失超时的连接)。如果只有两次握手,那么服务器每接收到SYN报文(包括重发的SYN报文),就会创建多余的连接,造成服务器的资源浪费。如果有第三次握手,那么客户端就能够识别出服务端发出的SYN和ACK报文对应的请求连接在客户端是否存活,如果存活则发送第三次握手ack报文,确认建立连接。
释放TCP连接的四次挥手: - 第一次:当客户端的应用程序通知TCP数据已经发送完毕时,TCP向服务器发送一个带有FIN附加标记的报文段(FIN表示英文finish),客户端状态由established变为fin-wait-1。
- 第二次:服务器收到这个FIN报文段之后