1. URL
1.1 定义
- Uniform Resource Locator的缩写,统一资源定位符
- 协议(HTTPS加密,http,ftp)+域名(www.baidu.com)+资源路径+查询参数(?page=1)
1.2 组成
- 协议(Protocol)
- IP地址/域名(Internet Protocol)
- 端口(Port)
- 路径(Path)
- 参数(Params)
2. Protocol
2.1 定义
- 网络协议,计算机设备在网络中的唯一标识,地址,编号。
2.2 分类
1. TCP协议
1.1 定义
- 传输控制协议,是Transmission Control Protocol的缩写,是一种面向连接的,可靠的,基于字节流的传输层通信协议,能保证数据的准确性和有效性。
1.2 特点
- 面向连接:
1. 创建连接
2. 传输数据
3. 关闭连接(双方必须断开连接,释放资源)
举例:打电话
- 可靠传输:
- 发送应答机制
- 超时重发机制
- 错误校验机制(校验码)
- 流量控制和阻塞控制机制(有缓冲)
- 基于字节流
- 一对一
2. HTTP协议
2.1 定义
- 超文本传输协议(Hyper Text Transfer Protocol)
2.2 特点
- 基于TCP协议,TCP协议规定可靠的传输方式
2.3 作用
-
HTTP协议规定浏览器和Web服务器传输的数据格式
-
浏览器访问web服务器的通信过程
1.4 查看HTTP协议的通信过程
- windows和Linux:f12
- macOS:右键检查(开发者工具)
1.network
2.输入URL,刷新浏览器
3.每一项都是一次请求和响应
1.5 http报文格式
请求报文组成
1.请求行: GET / HTTP/1.1\r\n
GET:请求方式 /:URL(请求资源路径) HTTP/1.1:协议版本
POST:提交
2.请求头:Host:www.baidu.com key:value\r\n
3.空行(\r\n回车和换行):分割请求头和请求体
4.请求体:GET请求没有请求体,POST请求有请求体\r\n
HTTP状态码:
200:请求成功
307:重定向http-->https(跳转)
404:请求错误
500:服务器错误
** 响应报文格式&**
1.响应(状态)行: HTTP/1.1 200 OK 协议版本 状态码 状态描述
2.响应头:key:vaule
3.空行
4.请求体:web服务器返回的资源数据
2. UDP协议(User Datagram Protocol)
2.1 定义
- 用户数据报协议,是User Datagram Protocol的缩写,是一个简单地面向数据报的传输层协议, 不能保证数据的准确性和有效性。
- 数据报:是通过网络传输的数据的基本单元
- udp实现基础发送接收数据
2.2 特点
- 面向无连接
- 不可靠
- 面向报文
- 速度快
- 一对多
2.3 操作步骤
1. 导包
2. 创建流对象(ipv4,udp)
3. 发送(二进制字符串,元组ip和端口)
4. 关闭流对象
#coding=utf-8
from socket import *
# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 准备接收方的地址
dest_addr = ('192.168.236.129', 8080)
# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)
# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])
# 7. 关闭套接字
udp_socket.close()
2.4 应用场景
- 广播,短息,音视频
2.3 tcp和udp不同点
- 面向连接(确认有创建三方交握,连接已创建才做传输)
- 有序数据传输
- 舍弃重复的数据包
- 无差错的数据传输
- 阻塞/流量控制
面向连接:双方建立连接,同时需要分配内核资源,来管理连接状态和连接上的传输,完成数据交换之后,双方必须断开连接,已释放系统源,这种是一对一的连接可靠地传输:- tcp采用了应答发送机制,在得到双方的应答后才认为tcp报文传输成功
- 超时重传:发送报文之后启动定时器,没收到应答就重发
- 错误校验:tcp用一个校验和函数来校验数据是否有错误,在发送和接收是都要计算校验和
- 流量控制与阻塞管理,流量控制用来避免主机发送的过快而是接收方来不及完全收下
- 同udp协议一样,都是依靠socket技术
2.4 TCP网络应用开发程序
1. 简介
1. socket创建一个套接字
2. blind绑定ip和port
3. listen使套接字变为可以被动连接
4. accept等待客户端的连接
5. recv/send接收发送数据
2. 分类
- TCP客户端程序开发
- TCP服务端程序开发
3. TCP客户端程序开发模型
1.创建客户端socket对象:s1 = socket()(AF_INET,SOCK_STREAM)·
2.建立连接:sd.connect()(IP地址,端口号)
3.数据传输:s1.encode('utf-8)s1.send(),s1.decode(utf-8)s2.recv(1024)
4.关闭连接:s1.close()
4. TCP服务端程序开发模型
1.穿件服务端socket对象(客户端服务socket):s1 = socket(AF_INET,SOCK_STREAM)
2.绑定端口号:blind(ip地址,端口号)
0
3.设置监听模式listen(n):n为等待连接的最大个数(128)(被动socket)
4.等待客户端连接accept() --->生成一个新的socket对象(服务器socket,客户端端口client_ip_port) 拆包
5.数据传输recv(1024),解码decode(),send(),编码encode()
6.关闭连接close()(关闭服务器socket,关闭客户端服务socket)
-
当服务端程序退出后端口号不会立即释放,要等1~2分钟
-
解决办法:
# 在绑定端口号之前启动端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket_SO_REUSEADDER,True)
- 注意点:
- 服务器如果关闭,新的客户端不能连接,旧的还能连接
3. IP(Internet Protocol)
3.1 定义
- Internet Protocol,也称IP地址,相当于自己家里地址,计算机在网络中的地址
3.2 分类
1. IPv4(4228250625):点分十进制
2. IPv6
- 格式:255.255.255.255:冒号分十六进制
- 查看IP地址:
- windows:
ipconfig
- macos和linux:
ifconfig
- 以太网适配器
en inet
- windows:
- 测试网络是否连通:
ping
ip地址(局域网)/域名(外网) - 测试停止:
ctr+c
4. Port
4.1 定义
- 网络数据传输的通道,相当于自己家里的门牌号,或者计算机上的QQ或者微信
端口号:65536个,端口的编号
4.2 分类
1. 知名端口号
- 0~1023众所周知的端口号ssh:22http:80ftp:21
2. 动态端口号
- 操作系统随机生成的,1024~65535
- port:端口除了固定的之外,其他的有主机随机分配需求使用
- 查看端口:
netstat -an
- 查看具体某个端口:
netstat -an lsof -i [tcp/udp]:2425
- 查看端口:
5. Socket
5.1 定义
- 套接字,接口,流对象,是进程之间的网络数据传输的工具。就是具体实现tcp和udp的底层技术(不是在网络七层协议之列,因为技术不是协议)
- socket有两个参数:
Address Family
(可以选择AF_INET
(用于internet进程间通信)或者AF_UNIX
(用于同一台机器进程间通信),实际工作中常用AF_INET
).Type
(套接字类型,可以是SOCK_STREAM
(流式套接字,主要用于TCP
协议)或者SOCK_DGRAM
(数据报套接字,主要用于UDP
协议)
5.2 使用步骤
1. 流程
1. 创建套接字
2. 使用套接字收/发数据
3. 关闭套接字
2. 注意事项
1. 创建套接字后,会有send缓冲区和recv缓冲区(粘包)
2. send-->send缓冲区-->网卡
3. 网卡-->recv缓冲区-->recv
5.3 应用场景
- 所有网络应用程序
5.4 socket的send和recv原理剖析
- send原理
- send->发送缓冲区–>网卡–>网卡–>接收缓冲区–>recv
- recv原理
- send原理反过来