Python网络编程之二:网络编程基础

一、基础概念

1、两个地址
1.1、mac地址

mac地址:直译为媒体存取控制位址,也称为局域网地址、MAC位址、以太网地址或物理地址,它是一个用来确认网络设备位置的位址。它是由网卡提供的,MAC地址在全球范围内都是唯一的。

1.2、IP地址

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

2、局域网

局域网是指在某一区域内由多台计算机互联成的计算机组,而且一般局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。

局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。

局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网络安全,能够有效地保护资料安全,保证局域网网络能够正常稳定的运行。

2.1、局域网内通信

局域网内的通信是依靠交换机来完成的,图解:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_局域网


分析:

1、同一个局域网内所有计算机通过交换机来连接(如图黄色箭头)

2、计算机1去寻找计算机6的过程:计算机1将自己的mac地址和要寻找的计算机的ip地址(192.168.12.98)发送给局域网内所有的计算机,局域网内所有的计算机通过对比自己的ip地址,如果与找寻计算机的ip地址一致则会将自己mac地址通过交换机反馈给找寻它的计算机,并且交换机会记录参与找寻和被找到的计算机的mac地址,方便于以后直接应用。

3、交换机只能识别mac地址,无法识别ip地址。

交换机的功能:

1、广播:计算机1寻找计算机6的过程中,将要寻找的ip地址发给了局域网内每个计算机,这就是广播功能。
2、单播:计算机6对计算机1的反馈过程,就是单播功能
3、组播:对局域网内一部分计算机通信的功能

arp协议(地址解析协议):

以上计算机1和计算机6之间的通信就是arp协议,简单说就是通过一台机器的ip地址获取到它的mac地址。用到了交换机的广播和单播功能。

2.2、局域网之间的通信

局域网之间的通信是依靠交换机和路由器来完成的,图解:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_局域网_02


分析:

1、局域网之间的通信是依靠交换机和路由器来完成的(如图蓝色箭头)

2、局域网1的计算机(192.168.12.87)与局域网4的计算机(192.168.15.98)的通信过程:首先把要寻找的ip地址通过局域网自身的交换机发送到路由器,路由器根据自己的网关列表查找需要寻找的ip属于哪个网段,然后确定查找到的网段后通过对应网关发送到对应网段的局域网内的交换机上,再由局域网的交换机把请求发送给目标ip对应的计算机。

3、路由器可以识别ip地址。

网段:

指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分。例如,上图局域网1的网段是从192.168.12.1到192.168.12.255之间,一般用192.168.12.0表示。

网关:

网关又称为协议转换器。网关的功能是实现网络之间的相互连接。网关不仅可以让广域网之间相互连接,也可以让局域网之间相互连接。网关在计算机和设备之间起转换的作用,相当于一个翻译器,可以使不同的协议、语言、数据在不同的系统之间进行转换。例如,上图中路由器的接口连接局域网1的网关,它自身也是一个ip地址,并且与网段对应,一般用192.168.12.1表示。

3、ip地址相关
3.1 、ipv4协议:
1.1、格式:四位点分十进制,例如:192.168.12.89
1.2、范围:0.0.0.0至255.255.255.255
1.3、ip地址的分类

1、公网地址(需要我们自己申请购买的地址):指在因特网上直接可达的地址,如果你有一个公网地址,那就意味着你不但能访问别人,还能被人访问。公网地址是架设各种服务器必不可少的条件。
2、内网地址(保留字段):也就是局域网内的IP地址,多半为网吧内的局域网,校园网,小区网,打开ADSL路由功能后形成的局域网,它是内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问Internet。
三个保留字段:
192.168.0.0 - 192.168.255.255
172.16.0.0 - 172.31.255.255
10.0.0.0 - 10.255.255.255

1.4、特殊的ip地址(本地回环地址 )

本地回环地址:不属于任何一个有类别地址类。它代表设备的本地虚拟接口,所以默认被看作是永远不会宕掉的接口。在windows操作系统中也有相似的定义,所以通常在不安装网卡前就可以ping通这个本地回环地址。一般都会用来检查本地网络协议、基本数据接口等是否正常的。通常用127.0.0.1来表示。

1.5、查看ip地址

1、Windows系统:在dos窗口输入ipconfig
2、Linux系统:指令窗口输入ifconfig

1.6、子网掩码:

子网掩码又叫网络掩码,地址掩码,子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用,子网掩码只有一个作用,即将某个IP地址划分成网络地址和主机地址两部分。

简单说就是判断两台计算机的ip地址是否在同一个网段。具体方法是通过两台计算机ip地址的二进制分别与子网掩码的二进制“与”的关系判断,如果结果相同,则证明在同一网段,否则不在。

判断ip地址192.168.12.1和192.168.13.1是否在同一网段,子网掩码为:255.255.0.0。如下:

# 192.168.12.1
        # 11000000.10101000.00000110.00000001
        # 255.255.0.0
        # 11111111.11111111.00000000.00000000
        # 11000000.10101000.00000000.00000000  = 192.168.0.0

        # 192.168.13.1
        # 11000000.10101000.00000111.00000001
        # 255.255.0.0
        # 11111111.11111111.00000000.00000000
        # 11000000.10101000.00000000.00000000 = 192.168.0.0
3.2 、ipv6协议:

ipv6产生的原因是ipv4不够用了,使用ipv6协议可以给地球上的每一粒沙子分配一个唯一的ip地址都用不完!

1.1、格式:六位冒分十六进制
1.2、范围: 0:0:0:0:0:0 至 FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:FFFFFF:xxx.xxx.xxx.xxx
4、端口(port)

ip地址和mac地址是用来确认机器的,端口则是用来确认机器上的应用程序的,图解:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_路由器_03


分析:

1、计算机的端口是操作系统随机分配的,而服务器的端口一般情况下不会改变

2、访问过程:计算机把自身应用程序所随机分配的端口号通过服务器的端口告知服务器,服务器根据需求反馈给计算机。

二、开发架构

1、客户端英文名称:Client
2、浏览器英文名称:Browser
3、服务端英文名称:Server

1 、C/S架构

基于客户端与用户端之间的架构。例如:QQ、微信、优酷、暴风影音等等。

QQ的通信架构图:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_局域网_04


分析:

1、优点:C/S架构的界面和操作非常丰富满足客户的个性化要求,安全性很容易保证,响应速度较快。

2、缺点:需要开发客户端和服务器两套程序,开发成本维护成本较高,兼容性差,用户群固定等。

2 、B/S架构

基于C/S架构的一种特殊的C/S架构,浏览器与服务端之间的架构。例如:百度、码云、博客园、csdn网站等等。

B/S架构不需要客户端,直接用浏览器代替客户端,它是一种特殊的C/S架构。

优缺点:
1、优点:分布性强,客户端几乎无需维护,开发简单,共享性强,维护简单方便。
2、缺点:个性化低,安全性以及响应速度需要花费巨大设计成本。

三、网络编程协议

1、osi协议关系

互联网协议按照功能不同分为osi七层、osi五层、osi四层,如下图:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_路由器_05


osi五层协议对应协议和硬件设备关系:

层数

层名

对应协议

对应硬件设备

5

应用层

编程语言


4

传输层

port(端口)、udp、dcp

四层路由器、四层交换机

3

网络层

ipv4、ipv6

路由器、三层交换机

2

数据链路层

mac、arp

网卡、二层交换机

1

物理层


中继器、集线器、双绞线

2、osi五层协议定义
2.1、物理层

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

2.2、数据链路层(加入mac地址)

数据链路可以粗略地理解为数据通道。物理层要为终端设备间的数据通信提供传输媒体及其连接.媒体是长期的,连接是有生存期的。在连接生存期内,收发两端可以进行不等的一次或多次数据通信。每次通信都要经过建立通信联络和拆除通信联络两过程。这种建立起来的数据收发关系就叫作数据链路.而在物理媒体上传输的数据难免受到各种不可靠因素的影响而产生差错,为了弥补物理层上的不足,为上层提供无差错的数据传输,就要能对数据进行检错和纠错,数据链路的建立/拆除,对数据的检错/纠错是数据链路层的基本任务。

2.3、网络层(加入ip地址)

网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。

2.4、传输层(加入端口):

传输层是OSI协议的第四层协议,实现端到端的数据传输。该层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。

2.5、应用层(加入用户数据):

应用层也称为应用实体(AE),它由若干个特定应用服务元素(SASE)和一个或多个公用应用服务元素(CASE)组成。

3、osi五层协议通信过程

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_网关_06


分析:从一台机器的应用层向另一台机器的应用层发送数据,首先要从发送数据的机器的应用层开始添加不同的协议后转换成物理层的电信号,然后接收数据的机器就是从物理层开始把电信号转换成二进制数据,通过约定好的协议一层一层的转换成数据接收到应用层。

4、tcp和udp协议
4.1、tcp协议

1、tcp协议就好比微信的视频通话,必须是实时连接的,消息是实时传输的,所以tcp协议是需要先建立连接,然后才能通信。

2、特点:占用连接、可靠(消息不会丢失)、实时性高、传输速度慢

建立连接(三次握手):

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_路由器_07


分析:

第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手

断开连接(四次挥手):

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_路由器_08


分析:

第一次分手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number和Acknowledgment Number,向主机2发送一个FIN报文段;此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;

第二次分手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,Acknowledgment Number为Sequence Number加1;主机1进入FIN_WAIT_2状态;主机2告诉主机1,我已经知道你没有数据要发送了;

第三次分手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入CLOSE_WAIT状态;

第四次分手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,主机1也可以关闭连接了。

为什么握手是三次挥手是四次:原因是建立连接握手的时候,数据还没有开始传输,所以服务器端可以一次把建立连接的请求和同意建立的请求发送到客户端,但是断开连接的时候,只是服务器端确认没有数据发送给客户端了,但是客户端有可能还有没有向服务器端发送完毕的数据,所以需要等数据发送完毕才能请求服务器端断开连接,因此,握手是三次,分手是四次。
4.2、udp协议

1、udp协议就好比微信的发消息,不必须实时连接,只要你把消息发出去,不管对方是否收到消息所以udp协议是不需要建立连接,就可以通信的。

2、特点:不占用连接、不可靠(消息因为网络不稳定丢失)、传输速度快

四、代码实现一个最简单服务端与客户端通信

服务端:
import socket

sk = socket.socket()   #创建一个socket对象

sk.bind(('127.0.0.1', 8000))   #绑定一个监听地址和端口
sk.listen()   #监听绑定的地址和端口有没有来自客户端的请求

conn, addr = sk.accept()   #接收来自客户端的请求(conn:请求内容,addr:客户端地址)
print(addr)   #打印发出请求的客户端ip地址和端口

conn.send(b'hello, Successful visit!')  #向客户端发送数据
msg = conn.recv(1024)   #设定可接收信息的最大容量为1024个字节
print(msg)

conn.close()   #关闭本次客户端请求

sk.close()   #关闭服务器
客户端:
import socket

sk = socket.socket()   #创建一个socket对象

sk.connect(('127.0.0.1', 8000)) #设置需要访问的服务器地址和端口

msg = sk.recv(1024)  #设定可接收信息的最大容量为1024个字节
print(msg)

sk.send(b'I\'ll just visit, byebye!')

sk.close()   #关闭客户端
首先运行服务端,然后再运行客户端:
服务端输出:
('127.0.0.1', 53756) #客户端IP地址为127.0.0.1,端口:53756
b"I'll just visit, byebye!"
客户端输出:
b'hello, Successful visit!'
对应tcp协议图解:

python 获取局域网windows ip 主机名 python获取局域网中的ip和mac地址_交换机_09