概述
文章目录
- Python基础-网络编程
- 1.网络编程的定义及目的
- 定义
- 目的
- 2.网络编程的基础知识
- 2.1软件的开发架构
- 2.1.1c/s架构
- 2.1.2b/s架构
- 2.1.3TCP/IP协议
- 2.2地址
- 2.2.1地址与标识
- 2.2.2 ip地址的作用
- 2.3IP地址的分类
- 2.3.1 A类IP地址
- 2.3.2 B类IP地址
- 2.3.3 C类IP地址
- 2.3.4 D类地址用于多点广播
- 2.3.5 E类IP地址
- 2.3.6 私有ip
- 2.3.7 回路地址
- 3.网络通信过程
- 3.1 两台电脑的网络
- 说明
- 3.2 使用集线器组成一个网络
- 说明
- 3.3. 使用交换机组成一个网络
- 说明
- 3.4 使用路由器连接多个网络
- 3.5 通信过程(复杂)
- 说明
- 4.端口:
- 5.开放式系统互联网参考模型(Open System Intreconnecti0n Reference Model)简称OSI
- 4.1互联网分层
- 6.几个协议
- 6.1Sockrt简介
- demo
- Socket 对象(内建)方法
- 6.2UDP网络程序
- demo
- 6.2.1 udp绑定端口
- 6.3TCP协议
- 6.3.1TCP特点
- 6..3.2TCP和UDP的不同点
- 用TCP进行socket编程:
- tcp注意点
- 7.补充概念
- 7.1广播
- 7.2 Mac地址
- 7.3ARP协议 ——查询IP地址和MAC地址的对应关系
- 7.4路由器
- 7.5局域网
- 7.6子网掩码
Python基础-网络编程
1.网络编程的定义及目的
定义
让不同电脑中的软件机械能数据交互,即网络中不同主机进程间的通信。
目的
-
使用网络把多方连接在一起,进行数据交互
-
为了让不同电脑上的软件可以进行数据交互
2.网络编程的基础知识
2.1软件的开发架构
2.1.1c/s架构
c/s即Client(客户端)和Server(服务器)
2.1.2b/s架构
b/s即Browser(浏览器)和Server(服务器)
2.1.3TCP/IP协议
TCP/IP (Transmission Contr Protocl)/(Internet Protocol)
TCPIP是标准的协议,其可以使世界范围内的计算机通过Internet或本地通信。
TCP/IP事实上是一些协议(protocols)的合集。当前大多数使用中的通信都使用TCP协议。
Internet是在一些共享的线路上发送数据的。例如:在您的计算机上也许同时运行着几个应用程序,如Web浏览器、通讯软件等程序,而您只须通过一条单一的线路来连接互联网。上面所有的程序都共享这个连接,简单地说,用户往往不会觉察到这个共享的发生。
2.2地址
2.2.1地址与标识
不同的网络中,采用唯一的标识就是地址
2.2.2 ip地址的作用
ip地址:用来在网络中标记一台电脑,比如192.168.1.1;在同一网络中是唯一的。
例如,在一个学校中每个学生的学号都是互不相同的。
2.3IP地址的分类
-ipv4,32位二进制构成,分成四段,每一段为2^8-1(四个字节)
-ipv6,128位二进制构成
每一个IP包含两个部分:
- 网络号
- 主机号
以太网适配器 以太网:
连接特定的 DNS 后缀 . . . . . . . :
描述. . . . . . . . . . . . . . . : Realtek PCIe GbE Family Controller
物理地址. . . . . . . . . . . . . : E8-6A-64-AC-C2-5F
DHCP 已启用 . . . . . . . . . . . : 是
自动配置已启用. . . . . . . . . . : 是
IPv6 地址 . . . . . . . . . . . . : 2001:250:6405:6005:7986:b40a:3b5c:e998(首选)
临时 IPv6 地址. . . . . . . . . . : 2001:250:6405:6005:6984:6e65:f35b:1563(首选)
本地链接 IPv6 地址. . . . . . . . : fe80::7986:b40a:3b5c:e998%15(首选)
IPv4 地址 . . . . . . . . . . . . : 192.168.1.103(首选)
子网掩码 . . . . . . . . . . . . : 255.255.255.0
获得租约的时间 . . . . . . . . . : 2019年8月5日 8:10:47
租约过期的时间 . . . . . . . . . : 2019年8月5日 11:10:45
默认网关. . . . . . . . . . . . . : fe80::22a:6aff:fefa:ff3c%15
192.168.1.1
(1) IPv4可提供4,294,967,296个地址,IPv6将原来的32位地址空间增大到128位,数目是2的128次方。能够对地球上每平方米提供6×1023个网络地址,在可预见的将来是不会耗尽的。
(2) IPv4 使用地址解析通讯协议 (ARP) ,IPv6使用用多点传播 Neighbor Solicitation 消息取代地址解析通讯协议 (ARP) 。
(3) IPv6中路由器能使用Flow Label字段识别IPv4不能识别的用于服务质量确定的QoS处理的payload
(4) IPv4的回路地址为: 127.0.0.1;IPv6的回路地址为 : 000:0000:0000:0000:0000:0000:0000:0001 可以简写为 ::1。
(5) 在IPv4中,动态主机配置协议( Dynamic Host ConfigurationProtocol,DHCP)实现了主机IP地址及其相关配置的自动设置。一个DHCP服务器拥有一个IP地址池,主机从DHCP服务器租借IP地址并获得有关的配置信息(如缺省网关、DNS服务器等),由此达到自动设置主机IP地址的目的。IP v6继承了IPv4的这种自动配置服务,并将其称为全状态自动配置(stateful autoconfiguration)。
(6) IPv4使用 Internet 群组管理通讯协议 (IGMP) 管理本机子网络群组成员身份,在IPv中IGMP被Multicast Listener Discovery (MLD) 消息取代
(7) 内置的安全性。IPSec由IETF开发是确保秘密、完整、真实的信息穿越公共IP网的一种工业标准。IPsec不再是IP协议的补充部分,在IPv6中IPsec是IPv6自身所具有的功能。IPv4选择性支持IPSec,IPv6自动支持IPSec。
(8) 更好的QoS支持。QoS是网络的一种安全机制,通常情况下不需要QoS,但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。在IPv6 的包头中定义了如何处理与识别传输, IPv6 包头中使用 Flow Label 来识别传输,可使路由器标识和特殊处理属于一个流量的封包。流量是指来源和目的之间的一系列封包,因为是在 IPv6 包头中识别传输,所以即使透过 IPSec 加密的封包 payload,仍可实现对 QoS 的支持。
2.3.1 A类IP地址
一个A类地址由1个字节的网络地址和3个字节主机地址组成,其网络地址的最高位必须是“0”,
地址范围1.0.0.1-126.255.255.254
二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
一个字节为8位二进制,全为1时就是十进制为255
可用的A类网络有126个,每个网络能容纳1677214个主机
2.3.2 B类IP地址
一个B类地址由2个字节的网络地址和2个字节的主机地址组成,其网络地址的最高位必须是“10”,
地址范围128.1.0.1-191.255.255.254
二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
可用的B类网络有16384个,每个网络能容纳65534主机
2.3.3 C类IP地址
一个C类地址由3字节的网络地址和1字节的主机地址组成,其网络地址的最高位必须是“110”
范围192.0.1.1-223.255.255.254
二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
C类网络可达2097152个,每个网络能容纳254个主机
2.3.4 D类地址用于多点广播
D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。
它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中
多点广播地址用来一次寻址一组计算机
地址范围224.0.0.1-239.255.255.254
网上视频会议、网上视频点播就是采用多点广播
广播地址 (Broadcast Address) 是专门用于同时向同一网络中所有主机发送数据的一个地址。在使用TCP/IP 协议的网络中, 主机标识段 HOST ID 为全1 的IP 地址为广播地址,广播分组传送给 HOST ID 段所涉及的所有计算机. 例如, 对于 192.168.50.26(255.255.255.0) 网段,其广播地址为192.168.50.255, 当发出一个目的地址为 192.168.50.255 的数据时, 它将被分发给该网段上的所有计算机. 飞秋,内网通就是通过广播地址来广播数据的
2.3.5 E类IP地址
以“1111”开始,为将来使用保留
E类地址保留,仅作实验和开发用
2.3.6 私有ip
在国际规定中有一部分IP地址是用于我们的局域网使用,作为私网IP,不在公网中使用的,它们的范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
2.3.7 回路地址
IP地址127.0.0.1~127.255.255.255用于回路测试,
3.网络通信过程
3.1 两台电脑的网络
说明
- 如果两台电脑之间通过网线连接是可以直接通信的,但是需要提前设置好ip地址以及网络掩码
- 并且ip地址需要控制在同一网段内,例如 一台为
192.168.1.1
另一台为192.168.1.20
则可以进行通信
3.2 使用集线器组成一个网络
说明
- 当有多台电脑需要组成一个网时,那么可以通过集线器(Hub)将其链接在一起
- 一般情况下集线器的接口较少
- 集线器有个缺点,它是以广播的方式发送数据,即如果集线器接收到来自A电脑的数据本来是想转发给B电脑,如果此时它还连接着另外两台电脑C、D,那么它会把这个数据给每个电脑都发送一份,因此会导致网络拥堵
3.3. 使用交换机组成一个网络
说明
- 克服了集线器以广播发送数据的缺点,当需要广播的时候发送广播,当需要单播的时候又能够以单播的方式进行发送
- 它已经替代了之前的集线器
- 企业中就是用交换机来完成多态电脑设备的链接成网络的
3.4 使用路由器连接多个网络
3.5 通信过程(复杂)
较为复杂的通信过程请自行搜索
说明
- 在浏览器中输入一个网址时,需要将它先解析出ip地址来
- 当得到ip地址之后,浏览器以tcp的方式3次握手链接服务器
- 以tcp的方式发送http协议的请求数据 给 服务器
- 服务器tcp的方式回应http协议的应答数据 给浏览器
总结
- MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
- IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
- 网络掩码:用来区分ip地址的网络号和主机号
- 默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关 *集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
- 交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
- 路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
- DNS:用来解析出IP(类似电话簿)
- http服务器:提供浏览器能够访问到的数据
4.端口:
在整个网络通信中通过对IP地址和端口的识别来区分不同的网络服务
-
端口号
- 用来表示区别网络中不同的应用,操作系统会对不同的端口进行编号,这就是端口号
- 端口号使用16位,两个字节的数字来标识,范围是0-( 2 16 − 1 2^{16}-1 216−1)
-
知名端口
80:分配给http服务
21:分配给FTP服务
-
动态端口(Dynamic Ports)
动态分配是指一个程序需要网络通信时会向主机申请网络端口,关闭程序时释放端口
- 一边不会固定分配,动态分配,范围从1024-65535
-
端口查看:
netstat -ano
5.开放式系统互联网参考模型(Open System Intreconnecti0n Reference Model)简称OSI
4.1互联网分层
按照分工不同把互联网协议从逻辑上划分了层级:
这个标准定义了网络的七层框架,试图使得计算机在整个世界范围内实现互联。
在OSI中,网络体系结构被分成七层。
- 物理层
- 定义了通信设备的传输规范,规定了激活、维持和关闭通信节点之间的机械特性、电气特性和功能特性等。此层为上层协议提供了一个传输数据的物理媒介。
- 数据链路层
- 定义了数据封装以及传送的方式。这个层次的数据单位称为“帧”。数据链路层包括两个重要的子层:逻辑链路控制层(Logic Link Control,LLC)和介质访问控制层(Media Access Control,MAC)。LLC用来对节点间的通信链路进行初始化,并防止链路中断,确保系统的可靠通信。而MAC则用来检测包含在数据帧中的地址信息。这里的地址是链路地址或物理地址,是在设备制造的时候设置的。网络上的两种设备不能有相同的物理地址,否则会造成网络信息传送失败。
- 网络层
- 定义了数据的寻址和路由方式。这一层负责对子网间的数据选择路由,并实现网络互连等功能。
- 传输层
- 为数据提供端到端传输。这是比网络层更高的层次,是主机到主机的层次。传输层将对上层的数据进行分段并进行端到端传输。另外,还提供差错控制和流量控制机制。
- 会话层
- 用来为通信的双方制定通信方式,包括建立和拆除会话。另外,此层将会在数据中插入校验点来实现数据同步。
- 表示层
- 为不同的用户提供数据和信息的转换。同时还提供解压缩和加解密服务。这一层保证了两个主机的信息可以互相理解。
- 应用层
- 控制着用户绝大多数对于网络应用程序的访问,提供了访问网络服务的接口。
6.几个协议
6.1Sockrt简介
不同电脑上的进程标识与识别
0
用唯一的来标识唯一标志在标记一个进程
在电脑上,可以用进程号(PI)标识唯一.
什么是Sockit:
sockitsis(套接字子)时节间通信的一种方法市)
与其他进程通信不同:
- 能够进行不同主机间得通信
创建一个一个Sockrt:
impore socket
socket.socket(add essFami)
参数说明:
Address Faillly地址族
- AF_INET:internet间进程通信,实际公厝最常用
- AF_UBNIX:同一台机器进程间通讯
demo
客户端:
高老师 2019/8/5 14:15:40
# client.py
import socket
# 创建一个socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# print(dir(s))
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port = 9995
# 连接服务,指定主机和端口
s.connect((host, port))
# 接收小于1024字节的数据
msg = s.recv(1024)
s.close()
print(msg.decode('utf-8'))
服务端:
import socket
# 创建一个socket对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 主机名
host = socket.gethostname()
# 端口号
port = 9995
#绑定端口
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 简历客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址:t %s" % (str(addr)))
msg = "网络编程测试。" + "rn"
clientsocket.send(msg.encode("utf-8"))
clientsocket.close()
Socket 对象(内建)方法
函数 | 描述 |
---|---|
服务器端套接字 | |
s.bind() | 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。 |
s.accept() | 被动接受TCP客户端连接,(阻塞式)等待连接的到来 |
客户端套接字 | |
s.connect() | 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。 |
s.connect_ex() | connect()函数的扩展版本,出错时返回出错码,而不是抛出异常 |
公共用途的套接字函数 | |
s.recv() | 接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。 |
s.send() | 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。 |
s.sendall() | 完整发送TCP数据,完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。 |
s.recvform() | 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。 |
s.sendto() | 发送UDP数据,将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。 |
s.close() | 关闭套接字 |
s.getpeername() | 返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。 |
s.getsockname() | 返回套接字自己的地址。通常是一个元组(ipaddr,port) |
s.setsockopt(level,optname,value) | 设置给定套接字选项的值。 |
s.getsockopt(level,optname[.buflen]) | 返回套接字选项的值。 |
s.settimeout(timeout) | 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect()) |
s.gettimeout() | 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None。 |
s.fileno() | 返回套接字的文件描述符。 |
s.setblocking(flag) | 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。 |
s.makefile() | 创建一个与该套接字相关连的文件 |
用网络注调试助手时,端口号会一直变动
6.2UDP网络程序
UDP—>User Datagram Protocol(用户数据报协议)是一个无连接的简单的面向数据报的运输层协议.
[外链图片转存失败(img-KJi7Wu1b-1565093605147)(C:UsersLenovoDesktopQQ图片20190805151830.png)]
优点:
- 传输速度快(udp在传输时无需在客户端和服务器端建立连接,也无超时重新发送机制)
缺点:
- 不能保证可靠性(udp本身是一个面向无连接的协议,每一个数据都是一个独立的数据,包含完整的源地址或者目的地址,在网络上以任何可能的路径传往目的地.因此,数据能否到达,到达时间无法保证.)
特点:
- UDP是面向无连接的通信协议
- 包括一个目的端口号和一个源端口号信息,通讯不需要连接,能够实现网络发送
- 传输数据大小有限,每个被传输的数据报必须限定在64K以内
- 是一个不可靠的协议,发送出去的数据报不一定以相同次序到达接收端.
UDP一般多用于多点通信和实时的数据业务
- 视频
- 语言广播
发送数据
创建一个UDP客户端程序的流程:
- 创建一个客户端套接字
- 发送/接收数据
- 关闭套接字
socket和file的区别:
- file针对指定模块进行’打开’,‘读写’,‘关闭’
- spcket针对服务端和客户端socket进行’打开’,‘读写’,‘关闭’
demo
import socket
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#
addr=('192.168.1.112',8345) #目标地址和端口
sendData=input('请输入要发送的数据:')
while True:
udp_socket.sendto(sendData.encode('gbk'),addr)
sendData = input('请输入要发送的数据:')
udp_socket.close()
6.2.1 udp绑定端口
一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定
但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?
如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定
demo:
import socket
udp_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
local_addr=('',5553) #ip地址和端口号
udp_socket.bind(local_addr)
recv_data=udp_socket.recvfrom(1024)
print(recv_data[0].decode('gbk'))
udp_socket.close()
小结:
- 一个udb网络程序可以不绑定端口,此时系统会自动分配一个端口.重新运行此程序,端口号可能会发生变化.
- 一个udp网络程序,可以绑定信息(IP,Ports).如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否时此进程的.
6.3TCP协议
TCP(transmiss Control Protocol)是一种面向来连接的,可靠的,基于字节流的传输层通信协议.
TCP通信需要经过创建连接,数据传输,终止连接三个步骤.
6.3.1TCP特点
-
面向连接
通信双方必须先建立连接才能进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输。
双方间的数据传输都可以通过这个连接进行。
完成数据交换后,双方断开此连接,以释放系统资源。
这种连接是一对一的
因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。
-
可靠传输
1)TCP采用发送应答机制
TCP发送的每个报文段都必须得到接收方的应答才认为这个TCP报文段传输成功
2)超时重传
发送端发出一个报文段之后就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段。
TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。
3)错误校验
TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
- 流量控制和阻塞管理
流量控制用来避免主机发送得过快而使接收方来不及完全收下。
6…3.2TCP和UDP的不同点
- 面向连接
- 有序的数据传输
- 重发丢失的数据包
- 舍弃重复的数据包
- 阻塞/流量控制
- TCP通信类似于打电话(在通信开始前,要先建立相关链接才可以发送数据),UDP类似写信,不需要建立连接,即可
用TCP进行socket编程:
- 客户端:
- 要主动连接服务器IP和指定端口
- 服务器:
- 监听指定端口
- 对每个新的连接,创建一个新的线程或者进程进行处理
- 通常服务器无限运行,一个端口不能同时被两个socket访问
TCP客户端和服务端各自socket创建与交互
tcp服务器创建流程:
- Socket 创建一个套接字(买手机)
- 绑定一个IP及端口(插卡)
- listen()使套接字从主动变为被动链接,开启监听模式(开机,待机状态)
- accept等待客户端连接
- revc/send接收发送数据
- 关闭和客户端交互的套接字
- 关闭监听套接字
demo:
客户端
import socket
#创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#目标服务器信息
server_ip=input('请输入服务器ip:')
server_port=input('请输入服务器端口:')
#连接服务器
tcp_socket.connect((server_ip,server_port))
#传递信息
send_data=input('请输入发送数据:')
tcp_socket.secd(send_data.encode('gbk'))
#接收服务器端发回信息
reve_data=tcp_socket.reve(1024)
print('接收到的数据为:',reva_data.decode('gbk'))
#关闭用于监听
tcp_socket.close()
服务器
import socket
#创建套接字
tcp_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定本地IP
tcp_socket.bind('',1234) #端口号<1024有特殊用途
#设置监听
tcp_socket.listen(5)
#监听的目的:socket默认为主动模式,listen()将主动模式改为被动模式,5是指能够同时接收到客户端的最大数为5
#创建新的套接字
new_socket,addr=tcp_socket.accept()
#创建新套接字的原因:服务器接收到请求后生成一个新的的套接字,专门用于新来的客户端进行1对1服务,此时服务器的套接字的任务时等待一个新的客户端套接字连接它
#收/发数据
content=new_socket.recv(1024)
print('接收到的数据:',content.decode('gkb'))
data=input('请输入要发送的数据: ')
new_socket.send(data.encode('gbk'))
#关闭用于通信socket
new_socket.close()
#关闭用于监听
tcp_socket.close()
tcp注意点
- tcp服务端一般情况下都需要绑定,否则客户端找不到这个服务端
- tcp客户端一般不绑定,因为是主动连接服务端,所以只要确定好服务端的ip、port等信息就好,本地客户端可以随机
- tcp服务端中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务端时必须要做的
- 当客户端需要连接服务端时,就需要使用connect进行连接,udp是不需要连接的而是直接发送,但是tcp必须先连接,只有连接成功才能通信
- 当一个tcp客户端连接服务端时,服务端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务
- listen后的套接字是被动套接字,用来接收新的客户端的连接请求的,而accept返回的新套接字是标记这个新客户端的
- 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够连接服务端,但是之前已经连接成功的客户端正常通信。
- 关闭accept返回的套接字意味着这个客户端已经服务完毕
- 当客户端的套接字调用close后,服务端会recv解堵塞,并且返回的长度为0,因此服务端可以通过返回数据的长度来区别客户端是否已经下线
TCP协议:
当应用程序希望通过TCP与另一个应用程序通信时会发送一个请求,这个请求必须送达一个确切的地址,在双方握手之后,TCP会在两个程序之间建立一个全双工(full-duplex)的通信.这个全双工通信将占用两个计算机之间的通信线路,知道它被一方或者双方关闭为止
TCP有6个标志位:标志位是一种二进制的指令
- SYN:发起一个新连接
- FIN:释放一个连接
- ACK:确认一个连接*-
TCP三次握手
TCO是因特网的传输层协议,使用三次握手协议建立连接.当主动方发出SYN请求后,等待对方的回答,等待对方回答的SYN+ACK,并最终对对方的SYN执行ACK确认,这种建立方法可以防止产生错误的连接.
过程:
- 客户端发送SYN(seq=x)报文交给服务器端,进入SYN_send状态
- 服务器接收到SYN报文,回应一个SYN(seq=y)+ACK(x+1),进入SYN_RECV状态
- 客户端接收到服务器的SYN报文,回应一个ACK(y+1),进入一个Established的状态
三次握手完成,客户端和服务端成功建立连接,可以开始传送数据
TCP四次挥手
建立一个连接需要三次握手,而终止一个连接需要经过四次挥手,这个是由TCP的半关闭(half-close)造成的.
- 某个应用进程首先调用close,称该端执行主动关闭(active close).该端的TCP于是发送一个FIN字节表示数据发送完毕.
- 接收到FIN的对端执行被动关闭(passive close),这个FIN由TCP确认.
- FIN的接收也作为一个文件结束符(end of file)传递给接收端应用进程,放在已排队等候该应用进程接受的任何其他数据之后.因为,FIN的接收意味着接收端在相应连接上再也没有其他数据可接收.
- 一段时间后,接收到这个文件结束符的应用进程将会调用close关闭它的套接字.这导致它的TCP也发送一个FIN.
- 接收这个最终FIN的原发送端TCP(即执行主动关闭的那端),确认这个FIN.(既然每端都需要一个FIN和一个ACK,因此,通常需要四个字节)
[外链图片转存失败(img-0Ye2BhFS-1565093605148)(C:UsersLenovoDesktopQQ图片20190806112951.jpg)]
7.补充概念
7.1广播
- 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要),由于其不用路径选择,所以其网络成本可以很低廉。有线电视网就是典型的广播型网络,我们的电视机实际上是接受到所有频道的信号,但只将一个频道的信号还原成画面。在数据网络中也允许广播的存在,但其被限制在二层交换机的局域网范围内,禁止广播数据穿过路由器,防止广播数据影响大面积的主机。
7.2 Mac地址
-
head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。
-
mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
7.3ARP协议 ——查询IP地址和MAC地址的对应关系
-
ARP(Address Resolution Protocol)ji1地址解析协议,是根据IP地址获取的物理地址一个TCP/IP协议。
主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址。
地址解析协议建立在网络中各个主机互相信任的基础上,网络内的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测真实性就会将其写入本机ARP缓存; 收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源
7.4路由器
-
路由器(Router),是连接因特网中各局域网、广域网的设备,它会根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号。 路由器是互联网络的枢纽。,路由和交换机之间的主要区别就是路由发生在第三层(网络层)而交换机发生在OSI参考模型第二层(数据链路层)。这一区别决定了路由和交换机在移动信息的过程中需使用不同的控制信息,所以说两者实现各自功能的方式是不同的。
路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。
7.5局域网
- 局域网(Local Area Network,LAN)是指在某一区域内由多台计算机互联成的计算机组。一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。
7.6子网掩码
- 所谓”子网掩码”,就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.10.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
最后
以上就是无辜硬币为你收集整理的Python基础-网络编程Python基础-网络编程的全部内容,希望文章能够帮你解决Python基础-网络编程Python基础-网络编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复