【一】初识
【1】那些可以充当客户端
-
自己写的TCP 服务端(python代码)
-
别人写的浏览器
-
cs架构和bs架构
【2】问题
-
我们自己写的tcp服务端语言浏览器之间虽然通信了,但是浏览器不识别服务端数据
【3】不能识别、交互的原因
-
浏览器和服务端之间需要遵循HTTP协议
【4】什么是HTTP协议
-
规定了服务端与浏览器之间的数据交互格式及其他事项
-
如果服务端遵循HTTP协议 就可以被浏览器正常访问并展示内容
-
如果服务端不遵循HTTP协议 浏览器就不会正常访问和展示 但是不影响服务端
【二】HTTP协议特点
【1】什么是HTTP协议
-
HTTP协议(HyperText Transfer Protocol,超文本传输协议)
-
-
由蒂姆·伯纳斯-李于1989年为了推广互联网技术而推出的一种无状态网络应用协议
-
-
HTTP协议构建于TCP/IP协议族之上
-
-
属于应用层协议。
-
-
主要用于传输与超文本相关的资源文件
-
-
如HTML网页,css,js,图片,视频,音频等。
-
-
现行的HTTP协议基于数据是否加密,主要分两种。
-
直接构建于TCP协议之上
-
-
没有进行加密传输数据的是HTTP协议
-
默认通信端口是80端口
-
常用端口有:3000,5000,8000,8080等。
-
-
构建于TLS或SSL协议之上
-
-
对数据使用SSL加壳加密传输数据的是HTTPS协议
-
默认通信端口是443端口
-
常用端口8443。
-
【2】HTTP协议的特点
-
http协议具有无状态、无事务、所有请求必有所回应的特点。
(1)基于请求、响应
-
服务端永远不会主动给客户端发消息 必须是客户端先请求服务端被动响应
-
http协议是基于客户端请求,服务端响应模型来实现的。
-
所以一般而言对于http协议通信的双方来说,发起请求的一方只能是客户端,而响应数据的一方只能是服务端。
(2)基于TCP/IP作用于应用层之上的协议
-
应用层协议:HTTP HTTPS FTP ...
(3)无状态
-
服务端不保存客户端状态
-
无状态是指HTTP协议默认情况下,服务端不识别客户端
-
在客户端多次发起请求到同一个服务器,服务端接收到客户端的请求在处理完成以后就会主动断开。
-
所以对于客户端的每一次请求,对于服务端来说,都是一次新的客户端请求。
-
也就是说,服务端无法区分多次请求的客户端是否同一个客户端。
(4)短连接
-
不保持客户端与服务端之间的连接导通
(5)长连接
-
主要用于加好友聊天等业务
【三】HTTP协议请求和响应格式
(1)请求格式
-
客户端给服务端发送消息应该遵循的数据格式
-
-
1.请求首行(请求方法 协议版本)
-
2.请求头(一大堆k:v键值对)
-
3.(换行不能省略)
-
4.请求体(携带敏感数据:密码 身份照号...) 不是一直都有
-
(2) 响应格式
-
服务端给客户端发送消息应该遵循的数据格式
-
-
1.响应首行(响应状态码 协议版本)
-
2.响应头(一大堆k:v键值对)
-
3.(换行不能省略)
-
4.响应体(给浏览器展示给用户看的页面内容)
-
【四】协议报文详解
-
http协议是应用层协议,是基于tcp协议。
-
在前面的网络编程曾经学习过tcp协议的通信是可靠安全的
-
-
所以实际上来说,因为http协议是基于TCP协议来传输数据的,所以http协议就具有了有所请求必有所回应的特点,也因此我们可以说,http协议一次通信的最基本的流程都是具有请求报文与响应报文的。
-
-
请求报文与响应报文就组成http协议的通信内容(HTTP报文)。
-
-
不管是请求报文还是响应报文在上面的发送请求与查看服务器响应报文
-
我们都可以看到,实际上HTTP报文就是一段连续的多行的文本
-
【1】HTTP请求流程
【2】请求报文
-
请求报文(HTTP Rquest)主要通过客户端发送用于表达对服务器资源的操作。
-
基本格式:
请求方法 请求路径 http协议版本 <---- http响应的一行内容,也叫请求行 请求头选项1: 选项值 请求头选项:2 选项值 .... 请求头选项n: 选项值 请求体(可以有多行,前后必有空行)
(1)请求行
-
请求行(HTTP Request Line)
-
表示请求报文的首行
-
-
主要三部分组成,使用单个空格隔开,分别是:
-
请求方法
-
请求路径
-
HTTP协议版本。
-
(2)请求方法
-
HTTP请求方法(HTTP Request Method)
-
表示客户端希望对服务器指定资源进行哪一种类型的操作
-
存在多种HTTP请求方法表达增删查改。
-
常见请求方法如下:
请求方法 | 描述 | 报文中是否包含请求体 |
---|---|---|
GET | 表示客户端希望从服务器中获取或下载资源信息 | Flase |
POST | 表示客户端希望上传文件或通过请求在服务器创建资源信息。 | True |
PUT | 表示客户端希望修改或更新服务器资源(表示修改全部资源信息,例如数据表的一整个记录) | True |
PATCH | 表示客户端希望修改或更新服务器资源(表示修改部分资源信息,例如数据表的一个记录里面某个属性值) | True |
DELETE | 表示客户端希望删除或废弃服务器资源 | Flase |
OPTION | 表示客户端希望获取服务器所支持的请求方法列表 | Flase |
HEAD | 表示客户端希望获取服务器支持的跨域地址列表 | Flase |
(3)请求路径
-
表示远程web服务器的一个可访问资源。
-
一般就是代表的就是一个服务器的具体文件或数据表中的记录信息,或一个服务端里面的函数或方法。
/ 表示根路径 /1.html 表示web服务器中web根目录下的1.html文件 /login 表示web服务器中的一个login方法或者login函数
(4)http协议版本
-
表示客户端目前使用的HTTP协议版本,并期望服务端也采用同样版本的协议与客户端进行通信。
-
http协议发送至今已经到了HTTP2.0版本,目前主流的使用版本有:HTTP/1.0 、HTTP/1.1。
(5)请求头
-
HTTP请求头(Request Head)
-
-
主要对客户端请求操作进行限制条件与补充说明。
-
-
常见的标准HTTP请求头如下:
-
注意:在http通信过程中,请求头也是可以自定义的,但是不能出现多字节编码字符,例如中文等。
-
选项 | 描述 | 值 |
---|---|---|
Host | 指定客户端请求的服务器的域名和端口号。 | www.baidu.com |
Content-Type | 告诉服务器,客户端请求携带的请求体数据的媒体类型信息(MIME类型) | |
User-Agent | 告知服务器HTTP 客户端网络代理程序的版本信息,一般就是浏览器的版本信息。 | |
Authorization | 告知服务器客户端的Web认证信息。 | |
Content-Length | HTTP报文中请求体的大小,以字节为单位。 | |
Referer | 告诉服务器该网页是从哪个页面链接过来。也就是上一页页面的地址。 | |
Accept | 指定客户端能够接收并理解的媒体类型类型(MIME类型),用于表达希望服务端的返回资源格式。 | |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | gzip, deflate, br |
Pragma | 指定服务端控制缓存行为。http/1.0以前的字段。 | Pragme: no-cache |
Cache-Control | 指定服务端控制缓存行为。http/1.1以后的字段。 | Cache-Control: no-cache |
Upgrade | 向服务器请求在当前http协议的基础上升级采用新的某种传输协议以便服务器进行转换 | 常用于http协议升级到ws协议。 |
Connection | 指定本次http通信结束以后,是否关闭TCP网络连接。如果设置持久连接,则可以在一次会话中,可以使用同一个TCP连接,进行多次的HTTP通信,提高效率。 | 持久连接,Connection: keep-alive 非持久连接,Connection: close |
(6)常见的MIME格式
类型 | 描述 | 别名 |
---|---|---|
text/html | HTML网页 | |
application/json | json文本 | text/json |
text/plain | 纯文本,普通文本 | |
text/xml | xml文档 | |
application/javascript | js脚本 | text/javascript |
text/css | css样式 | |
image/png | png格式图片 | |
image/jpeg | jpg格式图片 | |
image/gif | gif格式图片 | |
application/x-gzip | gzip格式压缩包 | |
application/msword | doc文档 | |
application/vnd.openxmlformats-officedocument.wordprocessingml.document | docx文档 | |
application/vnd.ms-excel | xls文档 | |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | xlsx文档 | |
application/pdf | pdf文档 | |
audio/mpeg | mp3音频 | |
video/mp4 | mp4视频 |
【3】响应报文
-
HTTP响应报文(HTTP Response)
-
是服务端在接收理解、处理并返回客户端操作的结果。
-
主要有三部分组成:
-
响应行,响应头与响应体。
-
-
-
注意:针对部分请求方法(delete、OPTION、HEAD)的返回结果有时候是没有响应体的。
协议版本 响应状态码 响应文本提示 <----- http响应的第一行内容,响应行 响应头选项1: 选项值 响应头选项2: 选项值 .... 响应头选项n: 选项值 响应体(服务端返回的正文信息,前后必有空行)
(1)响应行
-
HTTP响应行(HTTP Request Line),是HTTP响应报文的首行
-
由三部分组成,使用单个空格隔开:
-
HTTP协议版本
-
响应状态码
-
响应信息。
-
(2)HTTP协议版本
-
响应报文的HTTP协议版本,与客户端的协议版本保持一致。
-
例如:HTTP/1.0,HTTP/1.1
(3)响应状态码
-
状态码(status code)
-
用于表达本次服务端在接收客户端请求之后的操作结果,由三位整数组成。
-
状态码类型 | 描述 |
---|---|
1xx | 告诉客户端,本次请求,服务端还在持续处理中,并没有结束。 |
2xx | 告诉客户端,本次请求,服务端已经接收并成功受理了。 |
3xx | 告诉客户端,服务端位置发生改变,希望客户端重定向访问跳转新的服务器地址进行请求 |
4xx | 告诉客户端,本次请求有误,服务器无法处理。 |
5xx | 告诉客户端,本次请求服务端在处理过程中服务端出错了。 |
(4)常见的HTTP状态码
状态码 | 响应信息 | 描述 |
---|---|---|
101 | Switching Protocols | 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用升级协议来完成请求。 |
200 | OK | 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。常用于GET,PUT或PATCH |
201 | Created | 请求已成功,请求的资源已经创建成功或更新完成,常用于POST,PUT或PATCH |
204 | No Content | 请求已成功,但是没有任何内容返回。常用于DEELTE |
301 | Moved Permanently | 永久重定向,表示当前客户端请求的资源地址已经永久发生改变。 |
302 | Move Temporarily | 临时重定向,表示当前客户端请求的资源地址还存在,但是访问客户端达不到访问资源的条件,所以暂时无法访问。 |
304 | Not Modified | 表示本次客户端请求的资源,并非来自服务端,而是本地缓存。如果web项目有做了客户端缓存,一般静态文件都会出现304 |
305 | Use Proxy | 被请求的资源必须通过指定的代理才能被访问。 |
307 | Temporary Redirect | 请求的资源临时从不同的URI 响应请求。 |
400 | Bad Request | 本次请求,报文语义有误或请求参数有误,当前请求无法被服务器理解。 |
401 | Unauthorized | 本次请求,需要需要用户验证,但用户并没有提供认证。 |
403 | Forbidden | 服务器已经理解请求,但是拒绝执行它。一般是因为没有权限导致的。 |
404 | Not Found | 请求失败,请求所希望得到的资源未被在服务器上发现,请求路径不存在。 |
405 | Method Not Allowed | 请求行中指定的请求方法不能被用于请求相应的资源。使用了错误的请求方法。 |
500 | Internal Server Error | 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。就是服务端的代码报错了。 |
502 | Bad Gateway | 网关宕机,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。一般就是大量访问请求导致服务器瘫痪或宕机了。 |
503 | Service Unavailable | 网关过载,由于临时的服务器维护或者过载,服务器当前无法处理请求。 |
504 | Gateway Timeout | 网关超时,作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应。 |
507 | Insufficient Storage | 服务器无法存储完成请求所必须的内容。 |
(5)响应头
-
HTTP响应头(Response Head),主要是服务器返回的内容进行补充说明,并提供下一次请求的一些辅助信息。
选项 | 描述 |
---|---|
Content-Type | 告知客户端,响应数据的MIME类型 |
Content-Length | 告知客户端,响应数据的字节大小 |
Content-Encoding | 告知客户端,响应数据采用的压缩格式 |
Server | 告知客户端,响应服务器的名字或类型 |
Date | 告知客户端,响应请求的时间 |
Location | 告知客户端,实际要请求的资源地址(用于301或302进行页面跳转) |
Cache-Control | 告知客户端,响应数据的缓存机制 |
Refresh | 告知客户端,要定时刷新的时间间隔 |
Connection | 告知客户端,本次HTTP通信完成以后是否要保持TCP连接。 |
Transfer-Encoding | 告知客户端,数据是以分块方式响应回来的。 |
Content-Disposition | 告知客户端,以下载方式打数据的,格式:Content-Disposition: attachment;filename=文件名 |
Expires | 告知客户端,响应数据的过期事件,-1表示马上过期,客户端不要缓存当前响应数据。 |
Retry-After | 告知客户端,应该在多久之后再次发送请求。常见于服务端限流,或503中。 |
Access-Control-Allow-Origin | 指定客户端通过哪些域名下的脚本可以访问服务器资源。 |
Access-Control-Allow-Methods | 指定客户端通过哪些HTTP请求方法访问服务端资源。 |
Access-Control-Allow-Headers | 指定客户端请求服务器的报文中,允许包含哪些请求头。 |
示例:
import socket server = socket.socket() ip = '127.0.0.1' port = 8010 addr = (ip, port) server.bind(addr) server.listen(5) conn, addr = server.accept() while True: from_client_data = conn.recv(1024) from_client_data_str = from_client_data.decode() print(f'from_client_data_str: {from_client_data_str}') # 【1】响应首行 : 协议版本 响应状态码 换行(\r\n) response_line = "HTTP/1.1 200 OK\r\n" # 【2】响应头 response_header = "Server:Python20ws/21.1\r\n" # 【3】换行 response_blank = '\r\n' html_head = '<html>' # 【4】响应体 response_content = "HelloWorld!" html_foot = '<html/>' response_body = html_head + response_content + html_foot # 【5】拼接响应数据并转为二进制发送 to_client_data = response_line + response_header + response_blank + response_body to_client_data_bytes = to_client_data.encode() conn.send(to_client_data_bytes) # from_client_data_str: GET / HTTP/1.1 # Host: 127.0.0.1:8010 # Connection: keep-alive # sec-ch-ua: "Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24" # sec-ch-ua-mobile: ?0 # sec-ch-ua-platform: "Windows" # Upgrade-Insecure-Requests: 1 # User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0 # Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 # Sec-Fetch-Site: none # Sec-Fetch-Mode: navigate # Sec-Fetch-User: ?1 # Sec-Fetch-Dest: document # Accept-Encoding: gzip, deflate, br, zstd # Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
【总结】
【1】什么是HTTP协议
-
超文本传输协议,用来规定服务器和浏览器之间数据交互的格式
-
该协议可以不遵循,但是自己写的服务端不能被浏览器正常识别,只能单机使用
【2】HTTP协议的四大特性
(1)基于请求响应
(2)基于TCP/IP之上,作用域应用层之上的协议
(3)无状态
-
不保存用户的信息
-
早期的网站不需要用户注册 所有人访问的网页数据都是一样的
-
-
由于HTTP协议是无状态的,所以后来出现了一些专门用来记录用户状态的技术
-
cookie/session/token
-
(4)无/短链接
-
HTTP协议默认是HTTP 1.0 短链接
-
即两者请求响应后立刻断绝关系,绝大多数网站都用的短链接
-
-
HTTP 1.1 长链接
-
长链接:双方建立连接之后默认不会断开链接(websocket)
-
【3】HTTP协议的格式
(1)请求数据格式
-
请求首行(标识HTTP协议,当前请求方式)
-
请求头(多组K:V键值对)
-
\r\n\r\n
-
请求体(并不是所有的请求都有,get没有post有,存放的是post请求提交的敏感数据)
(2)响应数据格式
-
响应首行(标识HTTP协议,当前请求方式,响应状态码)
-
响应头(多组K:V键值对)
-
\r\n\r\n
-
响应体(返回给浏览器,展示给用户看的数据)
(3)请求方式
-
get请求
-
朝服务端要数据
-
输入网址获取对应的内容
-
-
-
post请求
-
朝服务端提交数据
-
用户登录 输入用户名密码之后 提交到服务端后端做身份校验
-
-
(4)响应状态码
-
用一堆简单的数字来表示一些复杂的状态或描述性信息
(5)URL
-
统一资源定位符(网址)