HTTP协议 简介

HTTP协议

1.四大特性

HTTP协议
	1.四大特性
		1.基于TCP/IP作用于应用层之上的协议
		2.基于请求响应
		3.无状态
			cookie
			session
			token
		4.无连接
			keep-alive

2.请求响应数据格式

		请求首行(请求方式 协议版本)
		请求头(一堆k:v键值对)  就类似于开路先锋 携带了一些服务端可以提前知道的信息
		(/r/n)(如果请求头里没有内容 那就是 /r/n/r/n)
		请求体(发送post请求 携带的数据都会放在请求体中)

3.响应状态码

下面是常见的HTTP状态码:

  • 200 - 请求成功
  • 301 - 资源(网页等)被永久转移到其它URL
  • 404 - 请求的资源(网页等)不存在
  • 500 - 内部服务器错误

HTTP状态码分类

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

HTTP协议介绍

HTTP协议对收发消息的格式要求

每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type表明响应的内容格式。如 text/html表示HTML网页。

HTTP GET请求的格式:

HTTP响应的格式:

HTTP数据格式

这说明我们发送给浏览器的响应式无效的, Web应用程序想要在网络中完整的传输, 就一定需要遵从一定的通信协议,而在Web端这个应用层协议就是HTTP协议.

HTTP协议是有属于它自己的传输数据的格式的, HTTP的数据格式包含以下部分:

  • 请求首行 协议版本, 请求方式
  • 请求头 包含多个键值对形式的请求信息
  • \r\n
  • 请求体

服务端的响应格式也与之相对应:

  • 响应首行 协议版本, 状态码
  • 响应头 包含多个键值对形式的响应信息
  • \r\n
  • 响应体

返回正确响应

了解了HTTP的基本数据格式之后, 只要我们发送合法的响应信息, 就能和浏览器做一个基本的通信了, 然后继续修改上述的代码.

...
# 返回响应头
response = 'HTTP/1.1 200 OK\r\n\r\n'
# 返回响应体
response += '<h1>Hello World!!!</h1>'
...
HTTP协议
	四大特性
		1.基于TCP/IP作用于应用层之上的协议
		2.基于请求响应
		3.无状态
		4.无连接
			长连接websocket
	数据格式
		请求首行(HTTP/1.1 GET/POST)
		请求头(一大堆的k,v键值对)
		
		请求体(post请求携带的数据)
	
	响应状态码
		1XX:服务端已经接受到你的数据 正在处理 你可以继续提交相应数据
		2XX:请求成功(200 OK)
		3XX:重定向
		4XX:请求错误(404请求资源不存在 403请求错误携带的数据不够 不符合相应规定)
		5XX:服务器内部错误(500)
	
请求方式
	1.get  获取资源
	2.post 提交数据

5. 应用层

HTTP协议

FTP协议

TCP协议

	流式协议,可靠协议

	基于TCP协议通道

	TCP协议传输数据之所以可靠,不是在于双通道,而是在于反馈机制,发送消息后必须等到对方回应,才会将内存中的数据清除。

UDP协议
数据报协议

	无需建立双向通道    数据传输是不安全
	将内存中的数据直接发送出去 不会做保留
	早期的qq

	三次握手四次挥手

			三次握手建立连接
			四次挥手断开连接
           ###如何解决TCP的粘包问题
	基于TCP实现大文件的上传
	客户端:
		1.先生成一个字典
		2.制作字典的报头
		3.发送字典的报头
		4.发送字典数据
		5.发送真实数据
	服务端
		1.接收固定长度的报头
		2.解析获取字典的长度
		3.接收字典数据
		4.解析获取真实数据信息
		5.接收真实数据
		
socketserver
	能够实现并发的效果

并发:看上去像同时运行的
并行:真正意义上的同时执行
ps:单核的计算机绝对不可能实现并行 但是可以实现并发
大文件上传
		服务端
			1.socket创建TCP服务
			2.连接循环
			3.通信循环
				接受固定长度的字典的报头
				解析获取字典数据的真实长度
				接受字典数据 解码 反序列化成字典
				从字典中获取文件大小 以及文件名等其他信息
			4.循环接受文件数据
				文件操作(wb) 接受一行往文件中写入一行
		客户端
			1.socket客户端代码
			2.利用os.listdir获取文件夹中所有的文件名
			3.循环打印 供用户选择想要上传的文件
				用户选择是否符合要求
			4.根据用户寻找及os.path.join方法拼接用户想要上传的文件绝对路径
			5.根据文件路径获取文件大小os.path.getsize()
			6.定义一个发送给服务端的字典
				{
				"file_name":用户选择的文件名,
				"file_size":文件大小,
				...额外键值对消息
				}
			7.制作字典的报头
				序列化  编码
			8.发送字典的报头
			9.发送字典数据
			10.发文件
				文件操作 一行行读取并发送
posted @ 2019-10-01 16:33  Bitten  阅读(275)  评论(0编辑  收藏  举报