python|Python 网络编程 TCP/UDP
目录
网络编程
1.网络编程基础知识
1.1 什么是网络
1.2 网络协议
OSI 7层模型
TCP/IP模型
1.3 Linux Windows 命令行查看网络信息
1.4 IP地址
1.4.1 概念:
1.4.2 IP地址分类:
1.5 端口
1.5.1 概念
1.6 服务器和客户端
1.6.1 服务端(Server):
1.6.2 客户端(Client) :
2.传输方法
2.1套接字简介
2.2 套接字类型
1. 流套接字(SOCK_STREAM)
2. 数据报套接字(SOCK_DGRAM)
3. 原始套接字(SOCK_RAW)
2.3 UDP套接字编程
2.3.1 UDP套接字特点
2.3.2 UDP套接字传输服务端客户端流程图
2.3.3 UDP实现代码
2.4TCP 传输方法
2.4.1 TCP传输特点
2.4.2 TCP套接字传输服务端客户端流程图
三次握手(建立连接)
四次挥手(断开连接)
2.4.3 TCP服务端(实现代码)
2.4.4 TCP客户端(实现代码)
2.4.5 TCP套接字细节
2.5 TCP与UDP对比
网络编程
1.网络编程基础知识
1.1 什么是网络 什么是网络 : 计算机网络功能主要包括实现资源共享,实现数据信息的快速传递。
1.2 网络协议 什么是网络协议:在网络数据传输中,都遵循的执行规则。网络协议实际上规定了每一层在完成自己的任务时应该遵循什么规范。需要应用工程师做的工作 : 编写应用工功能,明确对方地址,选择传输服务 OSI 7层模型
文章图片
? 好处1.
建立了统一的通信标准2.
降低开发难度,每层功能明确,各司其职3.
七层模型实际规定了每一层的任务,该完成什么事情 TCP/IP模型
七层模型过于理想,结构细节太复杂在工程中应用实践难度大实际工作中以
TCP/IP
模型为工作标准流程
文章图片
?
1.3 Linux Windows 命令行查看网络信息 Linux: ifconfig
windows: ipconfig
开/关网卡:sudo ifconfig ###(网卡名) up/down
文章图片
?
1.4 IP地址
1.4.1 概念:
IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
IP地址即在网络中标识一台计算机的地址编号。
1.4.2 IP地址分类:
IPv4 : 192.168.1.5IPv6 :fe80::80a:76cf:ab11:2d73IPv4 特点分为4个部分,每部分是一个整数,取值分为0-255IPv6 特点(了解)分为8个部分,每部分4个16进制数,如果出现连续的数字 0 则可以用 ::省略中间的0
公网IP和内网IP: 公网
IP
指的是连接到互联网上的公共
IP
地址,大家都可以访问。(将来进公司,公司会申请公网
IP
作为网络项目的被访问地址)内网
IP
指的是一个局域网络范围内由网络设备分配的
IP
地址。
TCP/IP协议 之IPV4与IPV6的区别;5G无线通信与4G的典型区别有哪些?_洋葱专栏-有灵魂的程序员-CSDN博客
1.5 端口
1.5.1 概念
端口:网络地址的一部分,在一台计算机上,每个网络程序对应一个端口
文章图片
?
【python|Python 网络编程 TCP/UDP】如果把IP地址比作一间房子 ,端口就是出入这间房子的门。
真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
我们知道,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。
那么,主机是怎样区分不同的网络服务呢?
显然不能只靠IP地址,因为IP 地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
需要注意的是,端口并不是一一对应的。
比如你的电脑作为客户机访 问一台WWW服务器时,WWW服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3457”这样的端口。
网络端口的作用及分类_TerryZjl的博客-CSDN博客_端口
1.6 服务器和客户端
1.6.1 服务端(Server):
服务端是为客户端服务的,服务的内容诸如向客户端提供资源,保存客户端数据,处理客户端请求等。
1.6.2 客户端(Client) :
也称为用户端,是指与服务端相对应,为客户提供一定应用功能的程序,我们平时使用的手机或者电脑上的程序基本都是客户端程序
文章图片
?
2.传输方法
2.1套接字简介
套接字(Socket) :
实现网络编程进行数据传输的一种技术手段
,
网络上各种各样的网络服务大多都是基于
Socket
来完成通信的。 套接字
Socket=(IP地址:端口号),套接字的表示方法是点分十进制的lP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23) [4]
2.2 套接字类型
1. 流套接字(SOCK_STREAM)
流套接字用于提供面向连接、可靠的数据传输服务。
该服务将保证数据能够实现无差错、无重复送,并按顺序接收。
流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议
2. 数据报套接字(SOCK_DGRAM)
数据报套接字提供一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理 。
3. 原始套接字(SOCK_RAW)
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:
原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。
因此,如果要访问其他协议发送的数据必须使用原始套接 。
2.3 UDP套接字编程
2.3.1 UDP套接字特点
可能会出现数据丢失的情况传输过程简单,实现容易数据以数据包形式表达传输数据传输效率较高 2.3.2 UDP套接字传输服务端客户端流程图
文章图片
?
2.3.3 UDP实现代码
创建UDP套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)
功能:创建套接字
参数:
socket_family 网络地址类型 AF_INET表示ipv4
socket_type 套接字类型 SOCK_DGRAM 表示udp套接字 (也叫数据报套接字)
proto 通常为0 选择子协议 返回值: 套接字对象
绑定地址
绑定地址本地地址 : 'localhost' , '127.0.0.1'网络地址 : '172.40.91.185' (通过 ifconfig 查看)自动获取地址: '0.0.0.0
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/558daa2055ed44c794e24a71386f8627.jpg)
文章图片
?
sockfd.bind(addr)
功能: 绑定本机网络地址
参数: 二元元组 (ip,port) ('0.0.0.0',8888)
消息收发
接收消息:
data,addr = sockfd.recvfrom(buffersize)
功能: 接收UDP消息
参数: 每次最多接收多少字节
返回值:
data 接收到的内容
addr 消息发送方地址
发送消息:
n = sockfd.sendto(data,addr)
功能: 发送UDP消息
参数:
data 发送的内容 bytes格式
addr 目标地址
返回值:发送的字节数
关闭套接字
sockfd.close()
功能:关闭套接字
2.4TCP 传输方法
2.4.1 TCP传输特点
面向连接的传输服务传输特征 : 提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无重复。可靠性保障机制(都是操作系统网络服务自动帮应用完成的):在通信前需要建立数据连接确认应答机制通信结束要正常断开连接2.4.2 TCP套接字传输服务端客户端流程图
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/b68b154167c1497d8231d4d858dea9b3.jpg)
文章图片
?
三次握手(建立连接)
客户端向服务器发送消息报文请求连接服务器收到请求后,回复报文确定可以连接客户端收到回复,发送最终报文连接建立
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/4e0c9c9d01b745668ed4d11755d0a50f.jpg)
文章图片
?
四次挥手(断开连接)
主动方发送报文请求断开连接被动方收到请求后,立即回复,表示准备断开被动方准备就绪,再次发送报文表示可以断开主动方收到确定,发送最终报文完成断开
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/cbba1f230ac14ec497a40a1fe829e924.jpg)
文章图片
?
2.4.3 TCP服务端(实现代码)
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/1203022257214c2b84a768b80e7f526f.jpg)
文章图片
?
a.创建套接字
sockfd=socket.socket(socket_family,socket_type,proto=0)
功能:创建套接字
参数:
socket_family 网络地址类型 AF_INET表示ipv4
socket_type 套接字类型 SOCK_STREAM 表示tcp套接字 (也叫流式套接字)
proto :通常为0 选择子协议
返回值: 套接字对象
b.绑定地址 (与 udp 套接字相同)
sockfd.bind(addr)
功能: 绑定本机网络地址
参数: 二元元组 (ip,port) ('0.0.0.0',8888)
c.设置监听
sockfd.listen(n)
功能 : 将套接字设置为监听套接字,确定监听队列大小
参数 : 监听队列大小
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/fd6f8afd62224ca6aaa7241e74cc9afd.jpg)
文章图片
?
d.处理客户端连接请求
connfd,addr = sockfd.accept()
功能: 阻塞等待处理客户端请求
返回值: connfd 客户端连接套接字
addr 连接的客户端地址
e.消息收发
接收消息:
data = https://www.it610.com/article/connfd.recv(buffersize)
功能 : 接受客户端消息
参数 :每次最多接收消息的大小
返回值: 接收到的内容 发送消息:
n = connfd.send(data)
功能 : 发送消息
参数 :要发送的内容 bytes格式
返回值: 发送的字节数
f. 关闭套接字 (与udp套接字相同)
sockfd.close()
功能:关闭套接字
2.4.4 TCP客户端(实现代码)
![python|Python 网络编程 TCP/UDP](https://img.it610.com/image/info8/bfbd45b0292e475dafb9444263168f3c.jpg)
文章图片
?
创建套接字
a.请求连接
sockfd.connect(server_addr)
功能:连接服务器
参数:元组 服务器地址
b.收发消息 注意: 防止两端都阻塞, recv send 要配合c.关闭套接字 2.4.5 TCP套接字细节
tcp 连接中当一端退出,另一端如果阻塞在 recv ,此时 recv 会立即返回一个空字串。tcp 连接中如果一端已经不存在,仍然试图通过 send 向其发送数据则会产生 BrokenPipeError一个服务端可以同时连接多个客户端,也能够重复被连接tcp粘包问题产生原因为了解决数据再传输过程中可能产生的速度不协调问题,操作系统设置了缓冲区实际网络工作过程比较复杂,导致消息收发速度不一致 tcp以字节流方式
带来的影响
进行数据传输,在接收时不区分消息边界
如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。处理方法人为的添加消息边界,用作消息之间的分割控制发送的速度 2.5 TCP与UDP对比 传输特征TCP 提供可靠的数据传输,但是 UDP 则不保证传输的可靠性TCP 传输数据处理为字节流,而 UDP 处理为数据包形式TCP 传输需要建立连接才能进行数据传,效率相对较低, UDP 比较自由,无需连接,效率较高套接字编程区别创建的套接字类型不同tcp 套接字会有粘包, udp 套接字有消息边界不会粘包tcp 套接字依赖 listen accept 建立连接才能收发消息, udp 套接字则不需要tcp 套接字使用 send , recv 收发消息, udp 套接字使用 sendto , recvfrom使用场景tcp:更适合对准确性要求高,传输数据较大的场景文件传输:如下载电影,访问网页,上传照片邮件收发点对点数据传输:如点对点聊天,登录请求,远程访问,发红包udp:更适合对可靠性要求没有那么高,传输方式比较自由的场景视频流的传输: 如直播,视频聊天广播:如网络广播,群发消息实时传输:如游戏画面在一个大型的项目中,可能既涉及到 TCP 网络又有 UDP 网络
推荐阅读
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)
- Python(pathlib模块)
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Python数据分析(一)(Matplotlib使用)
- Python|Python 9.20