PYTHON 网络编程

这篇博客介绍了网络编程的基础知识,包括网络的由来、IP地址、端口、协议和客户端服务端概念。详细讲解了IP地址的分类和作用,以及端口在数据通信中的角色。还探讨了网络协议的重要性,特别是OSI/RM模型,并提到了Python中的套接字和TCP编程,包括三次握手和四次挥手的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.网络编程理论基础

1.1概述

1.1.1. 什么是网络

1. 网络的由来
早期的计算机都是独立的一台一台以数据运算为主的机器,随着时代的发展,运算的数据的共享需求变得迫切,为了解决这一个问题,就有了网络的产生,通过物理路径(有线网或无线网)将多台计算机连接起来组成一个互联网计算机平台,实现多台计算机之间特定的数据交互模式。
2. IP地址的由来和作用
在计算机可以进行数据交互的基础上,又出现了新问题,如果主机要与某一台主机进行通信,如果所连接的主机数量少的情况下,可以通过对主机进行编号识别要发送给哪一台主机,但是如果连接数量过大时,就是出现数据溢出或错误的情况的,给数据交互带来很大的麻烦。为了解决这个问题,能够在众多计算机中找到特定的计算机,int cerf 在实验室模拟阶段使用了 32 位标记的网络地址协议[internet protocal],用于标识网络上唯一的一台计算机,也就是后来的 ip 地址
根据 ip 地址,按照网络主机数量【限制】,网络可以分为:
1. 局域网
2. 城域网
3. 广域网—>>全球网络
3. 端口port的由来和作用
在通过 IP 地址确定了网络上的某个具体主机之后,具体的数据通信主要是通过工作在计算机中的软件执行的,不同的软件通信很容易造成问题,那么问题又来了,随着计算行业的发展,计算机中会安装各种各样的应用软件,当主机A向主机B发送信息时,具体会由主机B上的哪个程序接收呢?由此计算机中出现了端口port的概念,端口port主要用于区别不同软件的通信渠道,用于正确的将数据通过指定的端口渠道传输给对应的软件!

4. 网络协议
网络协议的发展过程中,比较混乱,所以有一个非盈利性质的民间组织推出了网络协议公共标准,任何计算机的厂商,制造的计算机必须符合这样的标准才允许上市。
这个组织称为:国际标准化组织/欧洲计算机制造协会联盟组织/ISO。
ISO组织推出了网络协议标准模型:开放互联系统模型(OSI/RM模型)

网络协议处理 + ip 地址标注 + 端口限制 ——>>>形成成熟的互联网计算机系统

1.1.2. 客户端 & 服务端

客户端和服务端理解起来不是很容易,可以先从生活中的场景来理解,向人们提供需要的服务人群属于服务员,就相当于软件中的服务端,如客服人员;另外一部分消费者人群就是享受这些服务的,相当于软件中的客户端;一般情况下,服务端要二十四小时不间断的提供服务,用为不知道客户端会在什么时间需要访问这些服务。
在计算机中,有硬件和软件之分,客户端和服务端的架构模式,也区分为硬件模式和软件模式

-硬件客户端/服务端

在硬件模式下,一台机器可以作为提供服务的机器,如打印机就是一个硬件服务器。
工作在网络上的硬件服务器,通常情况下也会根据在服务器上安装的特定软件和应用场景来命名不同性质的服务器名称
如:web服务器/数据库服务器/文件服务器/通信服务器/代理服务器

-软件客户端/服务端

软件服务器和硬件服务器不同的是:软件服务器是安装在硬件上的一种特殊的软件,可以通过程序的执行完成数据检索、数据处理、数据存储等等各种特性,再通过网络进行数据的共享通信,完成提供网络数据服务的功能。

常见的如web软件服务器,主要是将一个服务器软件安装到工作网络上的硬件主机上,然后就可以在 web 服务器中添加网站程序,启动一个网站来给用户提供各种服务操作,如:淘宝pc端;数据库软件软件服务器,将数据软件安装在硬件上,提供数据的存取服务等等。

1.1.2. IP & PORT

1.2.1. IP 地址

 ip:internet protocol   网络互联协议,中文缩写:网协

网络互联协议就是为了为了多台计算机能够在网络中进行网络通信而设计的设计的协议,是能够使得网络上任意一个计算机可以与其他计算机之间实现网络通信的一套通用规则,ISO组织提出的规则。

  • IP 地址根据使用的用户性质,主要分为 5 类 IP 地址
地址类型地址范围网络个数
A类地址1.0.0.0 ~ 126.0.0.0126
B类地址128.0.0.0 ~ 191.255.255.25516382
C类地址192.0.0.0 ~ 223.255.255.255209万
D类地址192.0.0.0 ~ 223.255.255.255209万
  • 私有地址:适用于局域网络的地址

在IP 地址3种主要类型里,各保留里3各区域作为私有地址,其地址范围如下:

  • A类地址:10.0.0.0 ~ 10.255.255.255

  • B类地址:172.16.0.0 ~ 172.31.255.255

  • C类地址:192.168.0.0 ~ 192.168.255.255

  • 本机地址:适用于当前主机进行网络回路测试
    IP 地址为 127.0.0.1~127.255.255.255

  • 子网掩码:专门针对不同类型的 IP 地址进行的网络地址和主机地址的规则定义
    一个有效的 IP 地址,为了方便在网络上被寻址,通常情况包含三个部分:

    • 类型标志
    • 网络地址
    • 主机地址
      作用:网络地址和主机地址的区分主要通过子网掩码进行划分

1.2.1. PORT 端口

在通过 IP 地址确定了网络上的某个具体主机之后,具体的数据通信主要是通过工作在计算机中的软件执行的,不同的软件通信很容易造成问题。

  • 不同的端口号分类
    计算机中的端口号的范围是 0 ~ 65535 之间
    端口好根据使用场景,一般区分为公用端口/动态端口/保留端口
    公用端口:0 ~ 1023
    动态端口:1024 ~ 65535
    保留端口:一般是UNIX系统中超级用户进程分配保留端口号

remark: 查看当前主机正在使用端口号: netstat –ano
remark: 查看当前主机中某个端口号是否被使用: netstat –ano | findstr port

1.3. 协议

1.3.1. 什么是协议

协议:英文名称 protocal,是多方协商计议之后得出的约定、规则、规范

通常情况下为了让工作在网络中的多台计算机之间能友好的完成不同软件的数据的通信,出现了互联网数据传输协议的概念, 通过协议的约束,不同地域环境的计算机可以通过网络完成流畅的正确的数据交互。
计算机网络数据传输协议目前最主流的就是欧洲计算机制造协会联盟,也称为国际标准化组织 ISO 指定的 OSI/RM 七层网络传输模型!

1.3.2. OSI/RM 模型

七层模型,亦称OSI(Open System Interconnection)参考模型,是参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。

  • 分层:

应用层 (Application): 网络服务与最终用户的一个接口。

协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP

表示层(Presentation Layer): 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)

格式有,JPEG、ASCll、DECOIC、加密格式等

会话层(Session Layer): 建立、管理、终止会话。(在五层模型里面已经合并到了应用层)

对应主机进程,指本地主机与远程主机正在进行的会话

传输层 (Transport): 定义传输数据的协议端口号,以及流控和差错校验。

协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层

网络层 (Network): 进行逻辑地址寻址,实现不同网络之间的路径选择。

协议有:ICMP IGMP IP(IPV4 IPV6) ARP RARP

数据链路层 (Link): 建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)

将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。

物理层(Physical Layer): 建立、维护、断开物理连接。(由底层网络定义协议)

1.3.4.协议族

协议通常指代单独的一个协议,协议族通常指代互相关联的一组协议,协议栈指代某一组互相关联的协议和他们所属的 OSI 模型的层级结构。

1.3.4. 常见网络传输协议

1. HTTP: hyper text transfer protocal
2. HTTPS:hyper text transfer protocal secure
3. FTP: file transfer protocal

2.1.socket

socket 是 TCP/IP 的一个封裝,对用戶来说它只是一堆接口,socket 是一个软件抽象层,它不负责发送数据,它只帮你做数据处理,Socket有分BS和CS架构,它們本质上都是一个客户端和服务端之間的数据通信,因为交互的模式不同,所以也一般将程序中的套接字区分为两种:

  • 面向文件的套接字:通过文件进行数据交互
  • 面向网络的套接字:通过网络进行数据交互

2.1.2. PYTHON 中的套接字

套接字模型对象,为了能明确的表示网络中一台数据交互的主机,需要通过 IP 地址寻址确定主机位置,通过 PORT 端口号确定主机交互接口.
在网络套接字交互过程中,出现了两种类型的套接字模型:

  • 面向连接的套接字模型
  • 面向无连接的套接字模型
    python 中提供的网络套接字,主要包含在 socket 模块中
    socket 模块提供了 socket()函数
  • 基本语法结构

socket.socket(socket_family, socket_type, protocal=0)
socket_family: socket 地址家族, AF_UNIX/AF_LOCAL 或者 AF_INET
socket_type: socket 连接类型:1)面向连接的(SOCK_STREAM) 2)面向无连接的(SOCK_DGRAME)
protocal:传输协议,一般不用设置,使用默认值进行自动匹配就好

  • 创建 TCP 协议的套接字 socket 对象
    tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  • 创建 UDP 协议的套接字 socket 对象
    udp_socket =socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

其他参数:sk是自定义的变量,s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
服务端套接字函数

s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

2.2. TCP 编程

TCP :Transmission Control Protocol 传输控制协议
是一种面向连接,可靠的,基于字节流的传输层通信协议

数据传输的可靠性的处理方式,经典的 TCP 模型中通过如下两种方式完成连接的操作:

- 三次握手

所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包
三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
在这里插入图片描述

在这里插入图片描述

  • TCP的四次断开
    TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
    • A->B:发送一个数据验证请求码 seq=100, B->A:返回一个应答 ack=101
    • A->B:发送一个传输结束标记: seq=101; B->A:返回一个应答 ack=200
    • A->B:发送一个确认结束标记: seq=200; B->A:返回一个应答 ack=300
    • A->B:发送连接断开标记: seq=300; B->A:返回断开连接应答: ack=400

2.2.1. 服务端开发

服务端,就是提供服务的一端,操作如下
⚫定义需要监听的主机IP和端口号
⚫绑定IP地址和端口号到套接字
⚫开始监听,启动服务器
⚫等待连接
⚫连接成功开始数据通信
⚫断开连接
import socket

# 定义服务器信息
print("初始化服务器主机信息")
HOST = ""
PORT = 8888
ADDRESS = (HOST, PORT)
BUFFER = 1024

# 创建TCP服务socket对象
print("初始化服务器主机套接字对象>>>>>>>>")
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定主机信息
print("绑定服务器主机>>>>>>>>")
tcp_socket.bind(ADDRESS)

# 启动服务器 一个只能接受一个客户端请求,可以有128个请求排队
print("开始启动服务器>>>>>>>>")
tcp_socket.listen(128)

# 等待连接
while True:
	# 接收来自客户端的连
    print("等待客户端连接=======")
    client_socket, client_add = tcp_socket.accept()
    print("客户端{}连接成功".format(client_add))
   # 发送给客户端的数据
    client_socket.send("欢迎访问服务器".encode('utf-8'))

    # 收发信息 可以收发多次
    while True:
        # 接收客户端发送的数据
        print("等待客户端发送信息:")
        msg = client_socket.recv(BUFFER)
        try:
            print("client客户端:{}".format(msg.decode("utf-8")))

        except Exception :
            print("client客户端:{}".format(msg.decode("gbk")))

        finally:
            if msg == b'bye':
                print("客户端退出")
                # 关闭和客户端保持连接的套接字
                client_socket.close()
                break
       # 发送给客户端的数据
        info = input("请输入要发送的信息:")
        client_socket.send(info.encode('utf-8'))

# 关闭 【服务端一般情况下不关闭】
tcp_server.close()

2.2.2. 客户端开发

客户端,主动发起请求连接服务器完成和服务器连接之后,进行和服务器之间的通信,操作如下
⚫定义需要连接的主机IP和端口号
⚫创建 TCP 连接套接字对象
⚫向指定的 IP 和 PORT 发起请求,请求连接
⚫连接成功,进行数据收发操作
⚫关闭连接,释放资源

import socket
# 定义要连接的服务器信息
HOST = "192.168.11.205"
PORT = 8888
ADDRESS = (HOST, PORT)

# 创建 TCP 客户端套接字对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接指定服务器
client_socket.connect(ADDRESS)

# 和服务器进行数据交互
while True:

   # 接收服务器的信息
    msg = client_socket.recv(1024)
    print(msg.decode('utf-8'))

	# 给服务器发送消息
    info = input("请输入要发送的信息:")
    client_socket.send(info.encode("utf-8"))

    if info == 'bye':
        client_socket.close()
        print("客户端退出")
        break
    print("等待服务端发送信息:")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值