目录:
网络编程
网络起源 (了解)
网络目的 : 数据的传输
ISO : 国际标准化组织
OSI七层模型 —-》 网络通信的标准化流程
7层
- 应用层 : 提供用户服务,具体的内容由特定程序规定
- 表示层 : 数据的压缩优化加密
- 会话层 : 建立应用连接,选择传输层服务
- 传输层 : 提供数据传输服务,流量控制
- 网络层 : 路由选择,网络互连
- 链路层 : 提供链路交换,具体的消息的发送
- 物理层 : 物理硬件,接口 网卡的规定
osi模型优点 :
将功能分开,降低网络传输中的耦合度每一部分完成自己的功能,开发更加清晰专一
四层模型
应用层 : 应用层 表示层 会话层
传输层 : 传输层
网络层 : 网络层
物理链路层: 链路层 物理层
五层模型(tcp/ip模型)
- 应用层 : 应用层 表示层 会话层
- 传输层 : 传输层
- 网络层 : 网络层
- 链路层 : 链路层
- 物理层 : 物理层
要求 :
- 能够按顺序说出七层模型 五层和四层模型
- 知道每一层是什么作用
- 对网络消息传输流程有基本了解
协议 :
- 协议定义:
网络通信中,各方必须遵守的规定。包括建立什么样的连接,消息结构等。 - 对应有哪些协议
5层模型 | 对应的协议 |
---|---|
应用层 | TFTP HTTP DNS SMTP |
传输层 | TCP UDP |
网络层 | IP |
物理层 | IEEE |
网络相关概念
主机 : host 表示一台计算机
本地使用 : ‘localhost’
”
‘127.0.0.1’网络使用 : ‘0.0.0.0’
‘172.60.50.60’获取计算机名:
In [2]: socket.gethostname()
Out[2]: 'admin'通过计算机名获取地址:
In [3]: socket.gethostbyname('admin')
Out[3]: '127.0.1.1'
IP地址
在网络上确定一台主机的地址
IPv4 :点分十进制 比如 192.168.1.72 0–255
32位二级制表示IPv6 : 128位二进制
windows cmd.exe 窗口 –》 ipconfig
- linux 查看本机地址 ifconfig
网络连接测试
ping 172.60.50.60
特殊IP
特殊ip | 表示意思 |
---|---|
127.0.0.1 | 本地测试IP |
0.0.0.0 | 使用局域网内可用的IP |
192.168.1.0 | 表示当前网段 |
192.168.1.1 | 通常是网络节点设备的IP (网关) |
192.168.1.255 | 广播地址 |
名获取服务器信息
socket.gethostbyaddr('www.baidu.com')
('127.0.0.1', [], ['119.75.213.61'])
主机 主机别名 主机IP
将点分十进制IP转换为二进制
In [11]: socket.inet_aton('192.168.1.2')
Out[11]: b'\xc0\xa8\x01\x02'
二进制转换为点分十进制IP
In [12]: socket.inet_ntoa(b'\xc0\xa8\x01\x02')
Out[12]: '192.168.1.2'
功能 : 同上面两个完全相同。只是可以选择地址类型
inet_pton(socket.AF_INET,’192.168.1.2’)
inet_ntop()
域名:
定义: 网络服务器地址的网络名称
端口号 : 端口号是网络地址的一部分,在一个系统中 每个网络应用都会有一个端口号相对应。用来在接收消息时确定由谁来接收
范围 : 1–65535
1–255 一些通用的众所周知程序占用
256-1023 系统应用端口
1024 — 65535 自用 >10000获取应用端口:
In [16]: socket.getservbyname('mysql')
Out[16]: 3306
字节序
- 数据在内存中的存储解析方式,不同操作系统可能不同
- 网络字节序 : 不同的操作系统在消息收发时均按照该标准操作。
传输层服务
面向连接的传输服务 —-》 tcp协议
传输特征:
- 可靠的数据传输
- 可靠性指数据传输中 无失序 无差错 无丢失 无重复
- 所有消息传输前一定会建立连接,传输后一定会断开连接
三次握手: 在进行面向连接的数据传输前进行传输连接的过程
- 客户端向服务器发送连接请求(问是否可以连接)
- 服务器接收到连接请求进行确认,返回报文
- 客户端收到回复,进行连接建立
四次挥手: 在进行面向连接的数据传输时,断开连接的过程
- 主动方发送报文 告知被动方要断开连接
- 被动方返回报文,告知收到请求,准备断开
- 被动方再次发送报文给主动方,告知准备完毕可以断开
- 主动方发送报文进行断开
应用情况 :适用于传输较大的内容或文件,网络情况良好,需要保证传输可靠性的情况
- 比如 : 聊天信息,文件的上传下载,邮件传输,网页获取
面向无连接的传输服务 —》 udp协议
传输特点:
- 不保证可靠的数据传输
- 没有连接过程
数据的收发都比较自由,不会受另一端制约
适用情况: 网络情况较差,对传输可靠情形要求不高。需要提升传输效率的情况
比如 : 网络视频,群聊,发送广播
socket套接字编程
目的 :
通过编程语言提供的函数接口进行组合,更简单的完成基于 tcp 或者udp通信的网路编程套接字 : 完成上述目标的一种编程方法
套接字分类
- 流式套接字(SOCK_STREAM): 传输层基于tcp的协议进行通信
- 数据报套接字 (SOCK_DGRAM):传输层基于udp协议进行通信
- 底层套接字 (SOCK_RAM):访问底层协议的套接字
TCP服务端
- 格式:
import socket
socket.socket(socket_family = AF_INET,
socket_type = SOCK_STREAM,
proto = 0)
- 功能 : 创建一个套接字
- 参数 : socket_family : 选择地址族类型 AF_INET
socket_type :套接字类型 SOCK_STREAM 流式
SOCK_DGRAM 数据报
proto :子协议类型,没有子协议选择 0 返回值 : 套接字对象
绑定地址(IP 端口号)
- 格式:
sockfd.bind()
- 功能 : 绑定地址
- 参数 : 一个元组包含两项
第一项为IP第二项为端口号
(’172.60.50.50’,8888)
- 格式:
将套接字设置可监听
- 格式:
sockfd.listen(n)
- 功能 : 将套接字设置为监听套接字
- 参数 : n是一个正整数 表示监听等待队列的大小
- 格式:
等待接收连接请求
- 格式:
connfd,addr = sockfd.accept()
- 功能: 阻塞等待处理客户端连接
- 返回值 : 第一个 : 一个新的套接字用来和客户端通 信
第二个 : 连接的客户端的地址 - 阻塞函数:程序运行到阻塞函数的位置,如果某种期待条件没有达成则暂停继续运行。当条件达成后会结束阻塞继续运行。
- 格式:
. 收发消息
- 收消息
- 格式:
data = connfd.recv(buffersize)
- 功能 : 流式套接字接收消息
- 参数 : 一次最多接收多大的消息 字节
- 返回值 : 返回接收到的内容
- 格式:
- 发消息
- 格式:n = connfd.send(data)
- 功能 : 流式套接字发送消息
- 参数 : 要发送的内容 要求bytes格式
- 返回值 : 返回实际发送的字节数
- 收消息
关闭套接字
- 格式:
close()
- 功能:关闭套接字 tcp套接字连接断开
- 格式:
tcp 客户端
- 创建套接字
socket()
请求连接
- 格式:
connect()
- 功能: 发起连接请求
- 参数: 是一个元组,表示服务器的地址
- 格式:
消息收发
recv() send()
- 关闭套接字
close()
- recv() 特性
- 如果连接双方断开连接,则recv会立即结束阻塞返回空字符串
- 当接收缓冲区为空的时候会阻塞
- 如果recv一次接收不完缓存去内容,下一次会继续接收
- send()特性
- 如果一段不存在,另一端还在试图send操作时会产生BrokenPipeError异常
- 当发送缓冲区慢的时候会阻塞
- 网络收发缓冲区
- 发送和接收消息均先放到缓冲区中,在进行处理
即 recv和send实际是从缓冲区接收内容,向缓冲区发送消息
- 发送和接收消息均先放到缓冲区中,在进行处理