Python之网络编程

Posted 桥前石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之网络编程相关的知识,希望对你有一定的参考价值。

操作系统是管理和控制计算机的硬件与软件资源的计算机程序。互联网的本质就是一系列的网络协议。互联网协议按照功能能分为七层:应、表、会、传、网、数、物

每层常见物理设备:

传输层——》四层交换机、四层路由器

网络层——》路由器,三层交换机

数据链路层——》网桥、以太交换机,网卡

物理层——》中继器,集线器,双绞线

物理层

物理层功能:主要基于电器特性发送高低电压信号

数据链路层

数据链路层规定了电信号多少位一组,每组的意思。(即定义了电信号的分组方式)

以太网协议(ethernet)规定:

       。一组电信号构成一个数据报,也叫“帧”

       。每一数据帧分为报头和数据data两部分,

报头(head):

       。源地址,6字节

       。目标地址,6字节

       。数据类型,6字节

数据data:

       最短46字节,最长1500字节,head长度+data长度=最短64字节,最长1518字节,超过最大限制就分片发送

Mac地址:

head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址

mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)

广播:

有了mac地址,同一网络内的两台主机就可以通信了(一台主机通过arp协议获取另一台主机的mac地址)

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

协议的工作方式是每台主机的ip都是已知的。

例如:主机172.16.10.10/24访问172.16.10.11/24

一:首先通过ip地址和子网掩码区分出自己所处的子网

场景           数据包地址

同一子网       目标主机mac,目标主机ip

不同子网       网关mac,    目标主机ip

二:分析172.16.10.10/24与172.16.10.11/24处于同一网络(如果不是同一网络,那么下表中目标ip为172.16.10.1,通过arp获取的是网关的mac)

              源mac        目标mac           源ip               目标ip           数据部分

发送端主机    发送端mac    FF:FF:FF:FF:FF:FF    172.16.10.10/24     172.16.10.11/24     数据

三:这个包会以广播的方式在发送端所处的自网内传输,所有主机接收后拆开包,发现目标ip为自己的,就响应,返回自己的mac

网络层

世界范围的互联网是由彼此隔离的小的局域网组成的,以太网只能在同一局域网内发送,一个局域网是一个广播域,以太网的广播包只能在一个广播域内发送,跨广播域通信只能通过路由转发。

问题是必须找到一种方法区分计算机在哪个广播域内?

采用路由的方式(向不同的广播域/子网分发数据包),mac是无法区分的,它只与厂商有关。网络层功能:引入一套新的地址用于区分不同广播域/子网,这就是网络地址。

Ip地址分为:

网络部分:标识子网

主机部分:标识主机

IP数据包分为head和data两部分,无需为ip包定义单独的栏位,直接放入以太网包的data部分。Head长度为20到60字节,data的长度为65515字节,而以太网数据包的数据部分最长只有1500字节,因此如果ip数据包过长就会被分割成几个数据包分开发送。

注意:单纯的ip地址段只是标识了ip地址的种类,从网络部分或主机部分都无法辨识一个ip所处的子网

例:172.16.10.1与172.16.10.2并不能确定二者处于同一子网

子网掩码:

子网掩码就是表示子网特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。

通过子网掩码我们就能通过AND方法判断任意两个IP地址是否处于同一子网。

IP协议的作用就是:一是为每台计算机分配IP地址,另一个是确定那些地址在同一子网。

传输层

网络层的ip用来区分子网,以太网的mac用于找主机,而标识一台机器上的某一应用程序就要用端口,端口即应用程序与网卡关联的编号。

端口范围是0-65535 ,0-1023为系统占用的端口

TCP协议是可靠传输,TCP数据包是没有长度限制的,理论上可以是无限长,但是为了网络效率,通常TCP数据包长度不会超过IP数据包长度。

UDP协议是不可靠传输,报头只有8字节,总长不超过65535字节,正好放进ip数据包。

TCP协议:以太网头 IP头 TCP头 数据

UDP协议:以太网头 IP头 UDP头 数据

 

 

应用层

应用层的作用在于规定应用程序的数据格式。

 

Socket(套接字)

Socket是在应用层和传输层之间的一个抽象层,把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

套接字有两种,分为基于文件型和基于网络型。

服务器端:先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户机连接。这时如果客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器之间的连接就建立了。客户端发送数据,服务端接受并处理请求,然后把回应数据发送到客户端,客户端读取数据,关闭连接,一次交互结束。

服务端套接字函数

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

TCP是基于连接的,必须先启动服务器,然后再启动客户端连接服务器。

UDP是无连接的,无论先启动哪一端都不会报错。

 

服务器

import socket
inp_port=(‘127.0.0.1‘,8080)
BUFSIZE=1024
udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server.bind(inp_port)
while True:
    msg,addr=udp_server.recvfrom(BUFSIZE)
    print(msg,addr)

    udp_server.sendto(msg.upper(),addr)

 

客户端

import socket
ip_port=(‘127.0.0.1‘,8080)
BUFSIZE=1024
udp_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
    msg=input(‘>>‘).strip()
    if not msg:
        continue
   
udp_client.sendto(msg.encode(‘utf-8‘),ip_port)
    msg,addr=udp_client.recvfrom(BUFSIZE)
    print(msg.decode(‘utf-8‘),addr)



















以上是关于Python之网络编程的主要内容,如果未能解决你的问题,请参考以下文章

python之模块和包

Python 之 Socket编程(TCP/UDP)

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

前端面试题之手写promise

JAVA之AOP

python selenium片段+网络驱动程序