python-socket编程(入门,网络基础)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 一、网络基础 网络建立的目的是为了数据交互(通信) 如何实现通信:   1.建立好底层的物理连接介质   2.有一套统一的通信标准,称之为互联网协议 1.osi七层协议 互联网协议按照功能的不同分为osi七层或tcp/ip五层或tcp/ip四层 每层运行的常见物理设备 2.

一、网络基础

网络建立的目的是为了数据交互(通信)

如何实现通信:

  1.建立好底层的物理连接介质

  2.有一套统一的通信标准,称之为互联网协议

1.osi七层协议

互联网协议按照功能的不同分为osi七层或tcp/ip五层或tcp/ip四层

每层运行的常见物理设备

2.tcp/ip五层协议模型讲解

2.1物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

2.2数据链路层:定义了电信号的分组方式,由于单纯的0和1并没有任何意义,必须规定电信号多少位一组,每组什么意思

以太网协议:

  早期每个公司都有自己的分组方式,后来形成统一的标准,即以太网协议Ethernet

Ethernet规定

1.一组电信号构成一个数据包,叫做‘帧’,每一数据帧分成:报头head和数据data两部分

2.报头(head):固定字节数,里面包含发送者,接收者,数据类型。数据(data):数据包的具体内容

mac地址

head中包含的源和目标地址的由来:以太网规定接入internet的设备都必须具备网卡,发送地址和接收地址都是通过网卡来的

每块网卡出厂时都被烧制上一个唯一的mac地址,前6位是厂商编号,后6位是流水线号

广播:

有了mac地址,同一网络内的两台计算机就可以通信了   

2.3网络层:不同网络内想要通信,光靠Ethernet、mac地址和广播并不可行,所以引入一套新的地址用来区分不同的网络,这套地址就叫网络地址

ip协议:

  规定网络地址的协议叫ip协议,它定义的地址称为ip地址,广泛采用v4版本即ipv4,它规定网络地址由32位2进制表示

  范围为0.0.0.0 ---255.255.255.255

ip地址分为两部分

  网络部分:标识子网

  主机部分:标识主机

子网掩码:

  形式上等同于ip地址,也是32位二进制,网络部分全部为1,主机部分全为0。

知道子网掩码我们就能判断,任意两个ip地址是否处在同一个子网络。方法是将两个ip地址分别进行AND运算(两个都为1运算结果为1,否则为0),比较结果是否相同,如果相同的话就表明他们是在一个子网络中,否则就不是         

总结ip协议的作用:1.为每台计算机分配ip地址,2确定这些地址是不是在同一个子网络中。

ARP协议

  广播的方式发送数据包,获取目标主机的mac地址

2.4传输层:网络层的ip帮我们区分子网,以太网层的mac帮我们找到主机,传输层建立端口到端口的通信,端口就是应用程序与网关关联的编号   端口范围0-65535,  0-1023位系统占用端口     

tcp协议:可靠传输,tcp数据包没有长度限制,必须等到有回应才会继续发送

udp协议:不可靠传输,不管有没有收到响应只管发送   

tcp的三次握手

注:TCP的TIME_WAIT需要等待2MSL,当TCP的一端发起主动关闭,三次挥手完成后发送第四次挥手的ACK包后就进入这个状态,等待2MSL时间主要目的是:防止最后一个ACK包对方没有收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可以继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。MSL即Maximum Segment Lifetime,就是最大报文生存时间,是任何报文在网络上的存在的最长时间,超过这个时间报文将被丢弃。

常见面试题:为什么建立链接是三次握手,不是二次,四次,关闭链接却是四次不是其它

这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送。

2.5应用层:规定应用程序的数据格式

二、socket介绍

socket是应用层与tcp/ip协议通信的中间软件抽象层,它是一组接口,它吧复杂的TCP/IP协议隐藏在socket接口后面。           

基于文件类型的套接字家族:

套接字家族的名字:AF_UNIX       

unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信

基于网络类型的套接字家族:

套接字家族的名字:AF_INET

AF_INET被用于ipv4,AF_INET6被用于ipv6

三、套接字使用

import socket
socket.socket(socket_family,socket_type,protocal=0)
socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。

获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
例如tcpSock = socket(AF_INET, SOCK_STREAM)

客户端套接字函数
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() 创建一个与该套接字相关的文件

基于tcp协议通信的套接字简单                

from socket import socket, AF_INET, SOCK_STREAM
# socket 套接字
# AF_INET IPv4
# SOCK_STREAM socket流
IP = "127.0.0.1"
PORT = 8888
ADDRESS = (IP, PORT)
BUFSIZE = 1024

print("服务器开启了")
# 1.创建服务器socket对象
serSocket = socket(AF_INET, SOCK_STREAM)
# 2.设置服务器地址
serSocket.bind(ADDRESS)
# 3.设置连接管理队列
serSocket.listen(5)
# 4.建立客户端服务器连接
cliSocket, addr = serSocket.accept()
print(cliSocket)
print(addr)
# 5.收发数据
data = cliSocket.recv(BUFSIZE)
print(data.decode("utf-8"))
cliSocket.send("服务器返回的数据".encode("utf-8"))
# 6.断开客户端
cliSocket.close()
# 7.关闭服务器
serSocket.close()

print("服务器关闭了")
server
from socket import socket, AF_INET, SOCK_STREAM
IP = "127.0.0.1"
PORT = 8888
ADDRESS = (IP, PORT)
BUFSIZE = 1024
print("客户端开启了")
# 1.创建客户端socket对象
cliSocket = socket(AF_INET, SOCK_STREAM)
# 2.连接服务器地址
cliSocket.connect(ADDRESS)
print(cliSocket)
# 3.收发数据
cliSocket.send("客户端发送的数据".encode("utf-8"))
data = cliSocket.recv(BUFSIZE)
print(data.decode("utf-8"))
# 4.关闭客户端
cliSocket.close()
print("客户端关闭了")
client

 

                                                 

焚膏油以继晷,恒兀兀以穷年。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
存储 人工智能 数据挖掘
Python编程入门:从基础到实战
【9月更文挑战第10天】本文将引导你进入Python编程的世界,从基本语法到实际项目应用,逐步深入。我们将通过简单的例子和代码片段,帮助你理解并掌握Python编程的精髓。无论你是编程新手还是有一定经验的开发者,都能在这篇文章中找到有价值的信息。让我们一起开始Python编程之旅吧!
|
2天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络深度剖析:Python带你潜入AI大脑,揭秘智能背后的秘密神经元
【9月更文挑战第12天】在当今科技飞速发展的时代,人工智能(AI)已深入我们的生活,从智能助手到自动驾驶,从医疗诊断到金融分析,其力量无处不在。这一切的核心是神经网络。本文将带领您搭乘Python的航船,深入AI的大脑,揭秘智能背后的秘密神经元。通过构建神经网络模型,我们可以模拟并学习复杂的数据模式。以下是一个使用Python和TensorFlow搭建的基本神经网络示例,用于解决简单的分类问题。
20 10
|
3天前
|
机器学习/深度学习 数据挖掘 开发者
探索Python编程:从基础到进阶的旅程
【9月更文挑战第10天】本文是一篇深入浅出的技术感悟文章,通过作者自身的学习经历,向读者展示了如何从Python编程的基础入门逐步深入到高级应用。文章不仅分享了实用的代码示例,还提供了学习资源和建议,旨在鼓励初学者坚持学习,不断探索编程世界的奥秘。
|
1天前
|
数据采集 网络协议 API
HTTP协议大揭秘!Python requests库实战,让网络请求变得简单高效
【9月更文挑战第13天】在数字化时代,互联网成为信息传输的核心平台,HTTP协议作为基石,定义了客户端与服务器间的数据传输规则。直接处理HTTP请求复杂繁琐,但Python的`requests`库提供了一个简洁强大的接口,简化了这一过程。HTTP协议采用请求与响应模式,无状态且结构化设计,使其能灵活处理各种数据交换。
24 8
|
2天前
|
存储 开发者 索引
掌握Python编程:从基础到高级
【9月更文挑战第11天】本文将引导你进入Python编程的世界,无论你是初学者还是有经验的开发者。我们将从基础语法开始,逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。每个部分都将通过实际代码示例进行说明,帮助你更好地理解和应用所学知识。让我们一起探索Python的强大功能和灵活性,开启你的编程之旅!
|
4天前
|
存储 数据采集 人工智能
探索Python编程之美——从基础到进阶
【9月更文挑战第9天】本文是一篇深入浅出的技术分享文章,旨在引导读者从零基础开始掌握Python编程。我们将通过生动的实例和代码示例,探讨Python的基本语法、数据结构、函数、模块以及面向对象编程等核心概念。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到有价值的内容。让我们一起开启Python编程之旅吧!
18 11
|
1天前
|
监控 安全 Java
文件操作不再难!Python系统编程实战,带你轻松驾驭文件系统与I/O
【9月更文挑战第13天】在Python系统编程中,文件操作与I/O管理至关重要。本文通过五个实战案例分享最佳实践:高效遍历文件系统、优雅处理文件读写、利用缓冲机制优化性能、并行处理文件加速任务以及异常处理确保程序稳健。使用pathlib、上下文管理器及concurrent.futures等工具,助你轻松掌握Python文件系统与I/O操作,提升编程效率和项目质量。 示例代码展示了如何使用pathlib遍历目录、with语句安全读写文件、控制缓冲区大小、并行处理多个文件以及捕获异常保证程序稳定运行。通过这些技巧,你将能够在实际项目中更加高效地管理和操作文件。
12 6
|
2天前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【9月更文挑战第12天】在网络通信中,Socket编程是连接不同应用与服务的基石。本文通过问答形式,从基础到进阶全面解析Python Socket编程。涵盖Socket的重要性、创建TCP服务器与客户端、处理并发连接及进阶话题如非阻塞Socket、IO多路复用等,帮助读者深入了解并掌握网络通信的核心技术。
16 6
|
2天前
|
数据采集 数据可视化 数据挖掘
探索Python编程:从基础到高级应用
本文旨在通过简明扼要的方式,向初学者介绍Python编程的核心概念和实用技巧。我们将从Python的基础语法开始,逐步过渡到面向对象编程、数据科学应用以及网络爬虫开发等高级主题。文章的目标是使读者能够理解并实践Python编程,从而在技术之路上迈出坚实的一步。
11 4
|
1天前
|
消息中间件 网络协议 网络安全
解锁Python Socket新姿势,进阶篇带你玩转高级网络通信技巧!
【9月更文挑战第13天】在掌握了Python Socket编程基础后,你是否想进一步提升技能?本指南将深入探讨Socket编程精髓,包括从阻塞到非阻塞I/O以提高并发性能,使用`select`进行非阻塞操作示例;通过SSL/TLS加密通信保障数据安全,附带创建SSL服务器的代码实例;以及介绍高级网络协议与框架,如HTTP、WebSocket和ZeroMQ,帮助你简化复杂应用开发。通过学习这些高级技巧,你将在网络编程领域更进一步。
11 2