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.4  TCP 传输方法

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层模型

Python 网络编程 TCP/UDP_第1张图片
好处
1. 建立了统一的通信标准
2. 降低开发难度,每层功能明确,各司其职
3. 七层模型实际规定了每一层的任务,该完成什么事情

TCP/IP模型

七层模型过于理想,结构细节太复杂
在工程中应用实践难度大
实际工作中以 TCP/IP 模型为工作标准流程
Python 网络编程 TCP/UDP_第2张图片

1.3 Linux Windows 命令行查看网络信息

Linux: ifconfig

windows: ipconfig

开/关网卡:sudo ifconfig ###(网卡名) up/down

Python 网络编程 TCP/UDP_第3张图片

1.4 IP地址

1.4.1 概念:

IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。

IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

IP地址即在网络中标识一台计算机的地址编号。

1.4.2 IP地址分类:

IPv4 : 192.168.1.5
IPv6 :fe80::80a:76cf:ab11:2d73
IPv4 特点
分为4个部分,每部分是一个整数,取值分为0-255
IPv6 特点(了解)  
分为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 网络编程 TCP/UDP_第4张图片

如果把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)

也称为用户端,是指与服务端相对应,为客户提供一定应用功能的程序,我们平时使用的手机或者电脑上的程序基本都是客户端程序

Python 网络编程 TCP/UDP_第5张图片

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套接字传输服务端客户端流程图

Python 网络编程 TCP/UDP_第6张图片

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 网络编程 TCP/UDP_第7张图片
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.4  TCP 传输方法

2.4.1 TCP传输特点

面向连接的传输服务
传输特征 : 提供了可靠的数据传输,可靠性指数据传输过程中无丢失,无失序,无差错,无
重复。
可靠性保障机制(都是操作系统网络服务自动帮应用完成的):
在通信前需要建立数据连接
确认应答机制
通信结束要正常断开连接

2.4.2 TCP套接字传输服务端客户端流程图

Python 网络编程 TCP/UDP_第8张图片

三次握手(建立连接)

客户端向服务器发送消息报文请求连接
服务器收到请求后,回复报文确定可以连接
客户端收到回复,发送最终报文连接建立
Python 网络编程 TCP/UDP_第9张图片

四次挥手(断开连接)

主动方发送报文请求断开连接
被动方收到请求后,立即回复,表示准备断开
被动方准备就绪,再次发送报文表示可以断开
主动方收到确定,发送最终报文完成断开

Python 网络编程 TCP/UDP_第10张图片

 2.4.3 TCP服务端(实现代码)

 Python 网络编程 TCP/UDP_第11张图片

 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 网络编程 TCP/UDP_第12张图片

d.处理客户端连接请求  

connfd,addr = sockfd.accept() 
功能: 阻塞等待处理客户端请求 
返回值: connfd 客户端连接套接字
         addr 连接的客户端地址

e.消息收发 

接收消息:
data = connfd.recv(buffersize) 
功能 : 接受客户端消息 
参数 :每次最多接收消息的大小 
返回值: 接收到的内容 

发送消息:
n = connfd.send(data) 
功能 : 发送消息 
参数 :要发送的内容 bytes格式 
返回值: 发送的字节数

 f. 关闭套接字 (udp套接字相同)

sockfd.close() 
功能:关闭套接字

2.4.4 TCP客户端(实现代码)

Python 网络编程 TCP/UDP_第13张图片

创建套接字

a.请求连接
sockfd.connect(server_addr) 
功能:连接服务器 
参数:元组 服务器地址
b.收发消息
注意: 防止两端都阻塞, recv send 要配合
c.关闭套接字

2.4.5 TCP套接字细节

tcp 连接中当一端退出,另一端如果阻塞在 recv ,此时 recv 会立即返回一个空字串。
tcp 连接中如果一端已经不存在,仍然试图通过 send 向其发送数据则会产生 BrokenPipeError
一个服务端可以同时连接多个客户端,也能够重复被连接
tcp粘包问题
产生原因
为了解决数据再传输过程中可能产生的速度不协调问题,操作系统设置了缓冲区

实际网络工作过程比较复杂,导致消息收发速度不一致 tcp以字节流方式

带来的影响

进行数据传输,在接收时不区分消息边界

如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
处理方法
人为的添加消息边界,用作消息之间的分割
控制发送的速度

2.5 TCPUDP对比

传输特征
TCP 提供可靠的数据传输,但是 UDP 则不保证传输的可靠性
TCP 传输数据处理为字节流,而 UDP 处理为数据包形式
TCP 传输需要建立连接才能进行数据传,效率相对较低, UDP 比较自由,无需连接,效率较
套接字编程区别
创建的套接字类型不同
tcp 套接字会有粘包, udp 套接字有消息边界不会粘包
tcp 套接字依赖 listen accept 建立连接才能收发消息, udp 套接字则不需要
tcp 套接字使用 send recv 收发消息, udp 套接字使用 sendto recvfrom
使用场景
tcp: 
        更适合对准确性要求高,传输数据较大的场景
文件传输:如下载电影,访问网页,上传照片
邮件收发
点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
udp: 
         更适合对可靠性要求没有那么高,传输方式比较自由的场景
视频流的传输: 如直播,视频聊天
广播:如网络广播,群发消息
实时传输:如游戏画面
在一个大型的项目中,可能既涉及到 TCP 网络又有 UDP 网络

你可能感兴趣的