1 HTTP协议的请求与响应
1.1HTTP协议的特性
HTTP是一种建立在TCP/IP协议栈之上的应用层协议。通常使用TCP作为传输层协议,并且默认使用 端口80 进行通信。在某些情况下(如80端口被占用),HTTP服务也可以使用端口8080
1.2 HTTP的两个关键特性:
1 HTTP是无连接的,具体是指HTTP协议在应用层不需要建立HTTP的连接
HTTP的无连接,是客户端想要获取一个HTTP服务器中的资源,于是客户端就直接通过输入HTTP服务器相应的URL发出一个HTTP请求,而无需在输入HTTP的URL之前先建立与该服务器的HTTP连接。
但实际上HTTP客户端在发送请求之前,是需要先与服务器建立一个TCP连接的。
实际的连接步骤:
1 建立TCP连接
2 发送HTTP请求:通过传输层建立好的TCP连接发送HTTP请求
3 服务器处理请求
4 服务器发送HTTP响应:服务器通过同一个TCP连接发送HTTP响应给客户端
5 关闭TCP链接:如果是持久连接则TCP连接可以保持,以便进行多个HTTP请求和响应交换
HTTP协议本身不负责建立连接,这是由底层的TCP协议来完成的。HTTP的“无连接”特性主要是指在应用层,即HTTP层面上,每个请求和响应都是独立的,服务器在处理完请求后不需要维持与客户端的连接状态。
2 HTTP本身是无状态的
这是指HTTP协议本身不保留任何请求之间的状态信息。对于每个HTTP请求,服务器都会独立处理,而不会考虑之前的任何请求。如果需要维持状态,比如用户登录状态,这需要通过其他机制实现,如使用Cookies或Session。
Cookies的实现原理:见《计算机网络》书,282页
关于底层是否会使用同一个TCP连接,这取决于是否使用了持久连接。
1.3 HTTP协议报文
HTTP报文分为请求报文和响应报文,主要由三部分组成:
-
请求行(Request Line)或状态行(Status Line):
在请求报文中,请求行包括请求方法(如GET、POST、PUT等)、请求的资源的URL以及HTTP协议的版本。 GET:用于请求指定的资源。其中请求资源的参数是通过URL的查询字符串传递的:及在URL的路径中给出。见《计算机网络》书,275页。 POST:用于向指定资源提交数据,请求服务器进行处理(提交表单、上传文件)。数据存放在请求体中。 PUT:用于向指定资源上传最新内容。通常用于更新现有资源。 要求客户端体提供完整的资源表示,而不仅仅是更改小部分。 在响应报文中,状态行包括HTTP协议的版本、状态码(如200表示成功,404表示未找到,500表示服务器内部错误,403表示没有权限等)和状态描述(描述状态码)
-
请求头(Request Headers)或响应头(Response Headers)
这些头部字段包含了关于请求或响应的额外信息。 1.请求头: 请求头包含了关于请求的额外信息,如User-Agent(用户代理)、Accept(可接受的内容类型)、Content-Type(内容类型)、Host(请求的主机名)等 2.响应头: 响应头包含了关于响应的额外信息,如Content-Type(内容类型)、Content-Length(内容长度)、Server(服务器软件名称)等。 内容类型(Content-Type)即主体文件类型如:text、html、JSON... 内容长度(Content-Length)即主体数据的字节长度、缓存控制(Cache-Control)、Cookie、认证信息等。 头部字段以键值对的形式出现,每行一个。例如:Host:www.example.com
-
请求体(Request Body)或响应体(Response Body)
请求体通常在POST或PUT请求中使用,用于向服务器发送数据,比如表单数据或JSON数据。 响应体包含了服务器返回的实际数据,如HTML文档、图片、视频等。
HTTPS:
HTTPS是HTTP的安全版本,通过SSL/TLS协议对通信进行加密。
1.4 HTTP的URL格式:
http://<主机名>:<端口号>/<路径>?<查询字符串>#<片段标识符>
其中:
协议:http 表示使用的是HTTP协议。如果是HTTPS,则表示使用的是HTTP的安全版本,即加密的HTTP。
主机名:这是服务器的域名或IP地址,例如 www.example.com。
端口号:这是服务器监听的端口,默认情况下HTTP的端口是80,HTTPS的端口是443。如果使用默认端口,则端口号可以省略。
路径:这是服务器上资源的路径,例如 /index.html。
查询字符串:这是附加在路径后面的参数,用于传递额外的信息给服务器。查询字符串以?开始,参数之间用&分隔,例如 ?id=123&name=example。
片段标识符:这是URL的一部分,用于指向页面中的特定部分。它以#开始,例如 #section1。