1. HTTP是什么
HTTP全称为Hyper Text Transfer Protocol ,是一种用于传输超文本的应用层协议。它是互联网上应用最广泛的协议之一,用于在客户端和服务器之间传输数据。下面是HTTP协议的一些主要特点。
基于请求和响应:
HTTP协议是一种基于请求-响应模式的协议,它用于客户端和服务器之间的通信。客户端发送一个请求给服务器,服务器接收到请求后进行处理,并返回相应的数据给客户端。这个过程是HTTP协议的基本工作原理。
在这个过程中,客户端和服务器通过HTTP协议进行通信,客户端发送的请求包含了要访问的资源的信息,例如URL、请求方法(如GET
、POST
)、请求头等。服务器接收到请求后,根据请求的内容进行处理,并生成一个响应,响应包含了要返回给客户端的数据,以及响应头信息等。
这种请求-响应模式使得客户端和服务器之间的通信变得简单明了。客户端只需要发送请求并等待服务器的响应,而服务器只需要处理请求并返回相应的数据。
无连接:
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
早期这么做的原因是HTTP协议产生于互联网,因此服务器需要处理同时面向全世界数十万、上百万客户端的网页访问,但每个客户端(即浏览器)与服务器之间交换数据的间歇性较大(即传输具有突发性、瞬时性),并且网页浏览的联想性、发散性导致两次传送的数据关联性很低,大部分通道实际上会很空闲、无端占用资源。因此HTTP的设计者有意利用这种特点将协议设计为请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
随着时间的推移,网页变得越来越复杂,里面可能嵌入了很多图片,这时候每次访问图片都需要建立一次TCP连接就显得很低效。后来,Keep-Alive
被提出用来解决这效率低的问题。
Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive
功能避免了建立或者重新建立连接。市场上的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive
。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep-Alive功能对资源利用的影响尤其突出。
这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive
规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。
无状态:
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送HTTP请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive
没能改变这个结果。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie
,而另一个则是Session
。
2. HTTP工作原理
建立TCP连接:客户端发起HTTP请求时,首先需要建立TCP连接。TCP协议提供了可靠的连接,确保数据的可靠传输。客户端通过三次握手与服务器建立连接。
发送HTTP请求:一旦TCP连接建立,客户端就可以发送HTTP请求给服务器。HTTP请求包括请求方法(如GET
、POST
)、请求URL、请求头部信息和请求体(对于POST
请求)等。
服务器响应:服务器接收到HTTP请求后,会根据请求的内容进行处理,并生成HTTP响应。HTTP响应包括响应状态码、响应头部信息和响应体等。
数据传输:服务器将HTTP响应通过TCP连接发送给客户端。TCP协议会将数据分割成小的数据包,并确保它们按正确的顺序到达客户端。
关闭连接:当服务器发送完整个HTTP响应后,TCP连接可以关闭。客户端和服务器都可以主动关闭连接,或者通过Keep-Alive
机制保持连接以便进行后续请求。
3. 请求报文
HTTP协议的请求报文由请求行、请求头、空行和请求体组成。下面是一个HTTP请求报文的示例:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
请求数据
请求行包含了请求的方法、请求的URL和HTTP协议版本。在上面的示例中,请求行为
GET /index.html HTTP/1.1
,表示使用GET
方法请求/index.html
页面。请求头包含了一系列的键值对,每个键值对占据一行。请求头提供了关于请求的附加信息。在上面的示例中,请求头包括了
Host
、User-Agent
、Accept-Language
和Connection
等。请求头和请求体之间必须有一个空行来表示它们的分隔。
请求体是可选的,通常在使用
POST
等方法时才会包含请求体。请求体中可以包含需要发送给服务器的数据。
4. 响应报文
HTTP协议的响应报文由状态行、响应头、空行和响应体组成。下面是一个HTTP响应报文的示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
Server: Apache/2.4.41 (Unix)
Date: Tue, 06 Jul 2023 12:34:56 GMT
响应数据
状态行包含了HTTP协议的版本、状态码和状态消息。在上面的示例中,状态行为
HTTP/1.1 200 OK
,表示响应状态码为200
,表示请求成功。响应头包含了一系列的键值对,每个键值对占据一行。响应头提供了关于响应的附加信息。在上面的示例中,响应头包括了
Content-Type
、Content-Length
、Server
和Date
等。响应头和响应体之间必须有一个空行来表示它们的分隔。
响应体包含了服务器返回的实际数据。