应用层的协议,只是在传输层上的进一步封装。所以 HTTP协议
只是利用的 TCP协议
的通信架构,定义了一些基本信息交流术语。
完成一次HTTP通信的过程,分为两步,客户端一个请求 request
、服务器处理请求返回一个响应 responce
,HTTP每次请求都是一次全新的TCP连接,无状态的 stateless
。
# HTTP 请求格式
GET /index.html HTTP/1.1
Host: www.example.com
...
# HTTP 响应格式 (响应分两部分 header 和 body,这两部分的中间通过一个 “空行” 分割)
HTTP/1.1 200 OK # 状态码,本次请求得到一个什么的结果 (response header)
Content-type: text/plain # 返回的内容格式,浏览器通过这个信息解析 (response header)
Hello World! # 返回的内容 (response body)
---
# 状态码
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误
# Content-type
text/plain (普通文本)
text/html (HTML文本)
image/jpeg (jpeg图片)
image/gif (gif图片)
application/x-www-form-urlencoded (POST)
application/json
# 学习 HTTP 就是对这一行一行 header 的理解
我们通过 TCP 协议,构建一个最原始的 HTTP服务器
。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(5)
while True:
conn, addr = s.accept()
# 请求处理 | 得到客户端的请求信息,请求的路径,请求的方法 ... 我们在通过这些信息做出不同的响应
request = conn.recv(1024)
# 响应处理
response = b'''HTTP/1.x 200 OK
Content-Type: text/html
<html>
<head>
<title>hi</title>
</head>
<html>
<p>hi, python</p>
</html>
'''
method = request.decode('utf-8').split(' ')[0]
if method == 'GET':
conn.sendall(response)
conn.close()
浏览器其实就是一个 HTTP的客户端,启动HTTP服务器,通过浏览器访问 127.0.0.1:9999
,就能得到 hi, python
。