01-networkTransmission 网路传输
02-HTTPprotocol协议
03-accessNetworkData获取网络数据
04-socketServer套接字服务器端
05-socketClient套接字客户端
01-networkTransmission 网路传输
1.1 传输过程示意
网络传输过程示意.png1.2 OSI参考模型
OSI模型是国际标准化组织分析计算机通信,把计算机通信进行的规范和标准化分成了7层:
- 应用层:所有能产生网络流量的程序(QQ、浏览器等)
- 表示层:数据传输前的压缩、加密、确定编码方式等操作
- 会话层:查看木马(netstat-nb)
- 传输层:可靠传输、不可靠传输、流量控制
- 网络层:负责选择最佳路径、规划IP地址
- 数据链路层:帧的开始和结尾、透明传输、查错校验
- 物理层:接口标准、电器标准
1.3-TCP/IP协议栈(簇)
TCP/IP协议栈a.数据封装
数据封装.pngb.数据解封
数据解封.pngc.通信过程示意
通信示意.jpgd.传输层的协议TCP和UDP
- TCP协议(Transmission Control Protocol,传输控制协议)
- 需要传输的文件分段传输
- 建立会话
- 可靠控制
- 流量控制
- UDP协议(User Data Protocol,用户数据报协议)
- 一个数据包就能完成数据通信
2.不需要建立会话 - 不可靠传输
- 不需要流量控制
!可靠传输示意.png
02-HTTP协议
![UX3(4C0AGH0[R{J%X~AH22.png
![XW$4L%R9IJPZF(JIWL66X7.png
2.1 URL中常见的协议
- HTTP
超文本传输协议,访问的是远程的网络资源,格式是http://
http协议是在网络开发中最常用的协议
2.file
访问的是本地计算机上的资源,格式是file://(不用加主机地址)
3.maito
访问的是电子邮件地址,格式是mailto:
4.FTP
访问的是共享主机的文件资源,格式是ftp://
2.2 HTTP协议简介
QQ图片20180706200903.pnga.HTTP协议的特点
- 简单快速:因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
- 灵活:HTTP允许传输各种各样的数据
- HTTP 0.9和1.0使用非持续连接
限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间
b.
QQ图片20180706200903.pngc.请求
HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
-
请求头:包含对客户端的环境描述、客户端请求信息等
GET/minion.png HTTP/1.1 -->包含了请求方法、请求资源路径、HTTP协议版本
Host:120.25.226.186:32812 -->客户端想访问的服务器主机地址
User-Agent:Mozilla/5.0 -->客户端的类型,客户端的软件环境
Accept:text/html,/ -->客户端所能接收的数据类型
Accept-Language:zh-cn -->客户端的语言环境
Accept-Encoding:gzip -->客户端支持的数据压缩格式 -
请求体:客户端发个服务器的具体数据,比如文件数据(POST请求才会有)
d.响应
客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
HTTP协议规定:1个完整的HTTP响应中包含以下内容
*响应头:包含了对服务器的描述、对返回数据的描述
HTTP/1.1 200 OK // 包含了HTTP协议版本、状态码、状态英⽂名
称
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的⻓度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间
- 响应体:服务器返回给客户端的具体数据,⽐如⽂件数据
状态码 | 英文名称 | 中文描述 |
---|---|---|
200 | OK | 请求成功 |
400 | Bad Request | 客户端请求的语法错误,服务器无法解析 |
404 | Not Found | 服务器无法根据客户端的请求找到资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
e.发送HTTP请求的方法
■ 在HTTP/1.1协议中,定义了8种发送http请求的⽅法
p GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、
PATCH
p根据HTTP协议的设计初衷,不同的⽅法对资源有不同的操作⽅式
✓ PUT :增
✓ DELETE :删
✓ POST:改
✓ GET:查
p最常⽤的是GET和POST(实际上GET和POST都能办到增删改查)
■ 要想使⽤GET和POST请求跟服务器进⾏交互,得先了解一个概念
参数:就是传递给服务器的具体数据,如登录时的帐号、密码
f.GET和POST对比
● GET和POST的主要区别表现在数据传递上
p GET
✓ 在请求URL后⾯以?的形式跟上发给服务器的参数,多个参数之间⽤&
隔开,⽐如
http://www.test.com/login?username=123&pwd=234&type=JSON
✓ 由于浏览器和服务器对URL⻓度有限制,因此在URL后⾯附带的参数
是有限制的,通常不能超过1KB
p POST
✓ 发给服务器的参数全部放在请求体中
✓ 理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)
选择GET和POST的建议:
如果要传递大量数据,比如文件上传,只能POST请求
GET的安全性比POST要差些,如果包含机密\敏感信息,建议POST
如果仅仅是索取数据(数据查询),建议使用GET
如果是增加、修改、删除数据,建议使用POST
03-accessNetworkData获取网络数据
python中使用第三方库requests来获取网络数据
import requests
3.1.确定请求的地址(url)
GET传参的两种方式:
a. 直接拼接在url后面(?参数=值&参数2=值2......)
b. 给get函数中的第二个参数传参({参数:值, 参数2:值, .....})
url = 'https://www.apiopen.top/satinApi'
- 通过GET方式请求数据,请求结束后会返回响应
response = requests.get(url, {'type':1, 'page':1})
3.3. 获取数据
print(type(response), response)
a.获取字符串形式的数据
print(type(response.text), response.text)
b.获取json格式的数据
result = response.json()
print(type(result), result)
c.获取二进制形式的数据
data = response.content
print(type(data), data)
04-socketServer套接字服务器端
socket又叫套接字,我们把进行网络通信的一端就叫一个套接字
socket编程,就是通过程序实现通信的两端(服务器和客户端)
python中支持socket有三种,分别是基于TCP/UCP和IP的,叫做TCP套接字/UDP套接字和原始套接字
import socket
基于TCP的服务器端
4.1.创建套接字对象,并且指定服务器类型
- family:
AF_INET --> ipv4
AF_INET6 --> ipv6 - type:
SOCK_STREAM --> TCP
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
4.2.绑定ip地址和端口
- 地址:(ip地址, 端口)
ip地址:服务器所在的硬件的ip地址 cmd -->ipconfig/all - 端口:
不同端口绑定不同的服务,同一时间同一个端口只能绑定一个服务
端口的范围0-65535,但是小于等于1024的端口叫'著名端口',用于绑定著名服务(如http服务/邮件服务),一般不用
server.bind(('10.7.154.59', 12345))
4.3.监听访问
server.listen()
print('开始监听...')
让服务器一直运行,等待访问
while True:
当有客户端访问当前服务器后就建立连接(会话)
connect, addr = server.accept() # 当有一个客户端来连接服务器的时候,才会执行
print('====')
# 通过会话给客户端发送消息
# 发送的内容必须是二进制数
字符串转二进制: 字符串.encode('utf-8')
二进制转字符串: 二进制数据.decode('utf-8')
message = input(':')
connect.send(message.encode('utf-8'))
#接收客户端发送给服务器的消息
data = connect.recv(1024)
print(data.decode('utf-8'))
# 关闭连接
# connect.close()
05-socketClient套接字客户端
import socket
5.1.创建套接字对象
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
5.2.连接服务器
client.connect(('10.7.154.59', 12345))
while True:
# 3.接收服务器返回的数据
# 1024一次接收的数据大小
data = client.recv(1024)
print(data.decode('utf-8'))
# 4.客户端给服务器发送数据
message = input(':')
client.send(message.encode('utf-8'))
网友评论