pythonD26socket、网络整个通信流程
pythonD26socket、⽹络整个通信流程
⼀、C/S架构(client server)
软件C/S架构:客户端\服务端构架:京东、淘宝、今⽇头条、qq、、、、
  B/S架构:浏览器(browser)\服务端>>>统⼀接⼝可以访问多个⽹站
硬件 C/S架构:打印机
⼆、⽹络通信整个流程:
⽹线:传输电信号(低压⾼压)
集线器:将所有连接到集线器的⽹络设备连通起来
交换机:升级版的集线器
⽹卡:接收电信号
MAC地址:物理地址:58-20-B1-44-99-DB(前三位是⽣产⼚商标识,后三位是⽣产流⽔编号。每⼀台电脑的MAC地址是惟⼀的)
每个设备的mac地址号码是全球唯⼀的。 head中包含的源和⽬标地址由来:ethernet规定接⼊internet的设备都必须具备⽹卡,发送端和接收端的地址便是指⽹卡的地址,即mac 地址。  mac地址:每块⽹卡出⼚时都被烧制上⼀个世界唯⼀的mac地址,长度为48位2进制,通常由12位16进制数表⽰(前六位是⼚商编号,后六位是流⽔线号)
单播:单台电脑信息传到交换机中
⼴播:交换机将受到的信息播到所有电脑中
⼴播风暴:⽹络拥堵,信息不安全
ip地址:
IPv4 地址:192.168.15.68 # 4个点分⼗进制
作⽤:划分⼴播域
IPv4:192.168.15.0-192.168.15.255 #⼋位进制 256个电脑
DHCP:⾃动分配IP地址(交换机中)
Arp表:保存着ip地址和mac地址对应关系
Arp协议:通过ip地址获取mac地址
⼦⽹掩码:计算两个ip地址是否属于同⼀⽹段:
255.255.255.0
源ip地址:192.168.15.46
  转为⼆进制: 
  11000000.10101000.00001111.00101110(源ip)
  11111111.11111111.11111111.00000000(掩码)
  11000000.10101000.00001111.00000000 #192.168.15.0
  ⽬标ip:192.168.15.30  (同⼀个⽹段)
路由器转发消息
路由器协议:计算路由转发消息的最优路径
端⼝号:0-65535,确定电脑⾏的应⽤程序(每个应⽤程序都有⼀个对应的端⼝号)
ip地址+端⼝ = 确定某个电脑上的某个应⽤程序
三、内⽹和外⽹: 
    所谓内⽹就是我们平常说的局域⽹。局域⽹就是在固定的⼀个地理区域内由2台以上的电脑⽤⽹线和其他⽹络设备搭建⽽成的⼀个封闭的计算机组。它可以是邻居之间的2台电脑,也可以是⼀幢00层⼤楼⾥的1000台电脑。局域⽹可以是独⽴封闭运⾏的,也可以是和外⽹相连接的。
所谓外⽹,也就是⼴域⽹。是⼀种地域跨度⾮常⼤的⽹络集合。它是由⽆数个局域⽹+独⽴服务器构成的。注意,此处所说的局域⽹既可以是⼩型的⼴域⽹,也可以是局域⽹。    实际上,从规模上来看我们很难分辨局域⽹与⼴域⽹,因为⼤⼩都是相对的。所以。真正局域⽹与⼴域⽹的分别是通过IP地址来实现的。
    任何⼀台电脑要上⽹,都必须在⽹络上有⼀个唯⼀的IP地址。在局域⽹内,这个IP地址是唯⼀的。但是在另外⼀个局域⽹,这个IP地址仍然能够使⽤。
四、DNS服务器
  当我们请求https:\\www.JD的时候,⾸先电脑会在本地的DNS缓存中是否有这个DNS缓存(DNS(Domain Name Server,域名服务器)是进⾏域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了⼀张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。域名是Internet上某⼀台计算机或计算机组的名称,⽤于在数据传输时标识计算机的电⼦⽅位(有时也指地理位置)。域名是由⼀串⽤点分隔的名字组成的,通常包含组织名,⽽且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。 DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的。域名服务器是指保存有该⽹络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应⼀个IP地址,⼀个IP地址可以有多个域名,⽽IP地址不⼀定有域名。域名系统采⽤类似⽬录树的等级结构。域名服务器通常为客户机/服务器模式中的服务器⽅,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。)本地的DNS缓存是在我们访问过⼀个⽹站之后,例如京东,那么本地会保存⼀个京东域名和京东服务器IP地址的映射关系,将来再次请求的时候,就不⽤再到外部的DNS上查询这个域名对应的IP地址了,提⾼了效率,如果是第⼀次请求,请看上⾯的DNS查询过程
步骤
  本地查询顺序:
    浏览器缓存:浏览器会按照⼀定的频率缓存DNS记录。chrome://net-internals/#dns 查看chormeDNS缓存。
    操作系统缓存:如果浏览器缓存中不到需要的DNS记录,那作系统中。cmd命令ipconfig /displaydns ⽤于查看操作系统dns缓存。
    路由缓存:路由器也有DNS缓存。本机的hosts⽂件 Windows host⽂件路径: C:\WINDOWS\system32\drivers\etc\hosts (由于直接修改之后不能保存,可以copy⼀
份到桌⾯,修改之后,在替换掉原路径下的⽂件就可以了),hosts⽂件以静态映射的⽅式提供IP地址与主机名的对照表。
    ISP(⽹络服务提供商):如果还是没有,那么就去检查ISP有没有吧~,每⼀个ISP(⽹络服务提供商),或⼀个⼤学,甚⾄是⼀个⼤学⾥的系都会有⼀个⾃⼰的本地域名服
务器,他会在url第⼀次访问时缓存该域名的指向。下次再访问时,他会从缓存⾥把这个url曾经指向的IP调出来。
    递归查询
      第⼀步:在hosts静态⽂件、DNS解析器缓存中查某主机的IP地址
      第⼆步:上⼀步⽆法到,去DNS本地服务器(即域服务器)查,其本质是去区域服务器、服务器缓存中查
      第三步:本地DNS服务器查不到就向ISP(ISP是互联⽹服务提供商(Internet Service Provider))的简称,ISP有专门的DNS服务器应对DNS查询请求。再不到就根
据‘根提⽰⽂件’向负责顶级域‘’的DNS服务器查询
      第四步:'根DNS服务器'根据查询域名中的'xyz',再向xyz的区域服务器查询
      第五步:abc的DNS服务器直接解析该域名,将查询到的ip再原路返回给请求查询的主机
    迭代查询:
      第⼀步:在hosts静态⽂件、DNS解析器缓存中查某主机的IP地址
      第⼆步:上⼀步⽆法到,在DNS本地服务器(即域服务器)查所有本层次的区域服务器
      第三步:本地DNS服务器查不到就向ISP是互联⽹服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求。再不到就查询上⼀
层次的所有区域服务器,以此类推直⾄根域名DNS服务器‘.’
      第四步:到达根域名服务器后⼜向下查询,直⾄查到结果为⽌。
    迭代查询与递归查询结合
    递归查询需要经过逐层查询才能获得查询结果,当查询具有许多层次的DNS结构时效率很低,所以⼀般采⽤两者相结合的查询⽅式。
      第⼀步:在hosts静态⽂件、DNS解析器缓存中查某主机的ip地址
      第⼆步:上⼀步⽆法到,去DNS本地服务器(即域服务器)查,其本质是去区域服务器、服务器缓存中查
      第三步:本地DNS服务器查不到就向ISP是互联⽹服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求。再不到就根据‘根
徐字组词提⽰⽂件’向负责顶级域‘’的根DNS服务器查询
      第四步:根DNS服务器直接将其区域DNS服务器的ip地址返回给本地服务器,⽽不⽤再向xyz的区域服务器查询。
      第五步:(京东有⾃⼰DNS服务器)本地DNS服务器将结果返回给请求的主机
四、⽹关:通过NAT技术⼦⽹的ip转换为公⽹ip通过公⽹的ip就能访问整个⽹络
  然后通过路由A转发将消息发出去,消息中包含⽬标路由D的⽹关的IP地址,⽹关分很多的类型:传输⽹关、应⽤⽹关、协议⽹关等等,我们经常说的⽹关是指的传输⽹关,
简称⽹关,我们主要就看它,⽹关在路由器这⾥,当请求信息发送到了⽹关这⾥的时候,我们先到路由表⾥⾯看看有没有这个请求的⽬标地址的IP,如果没有说明不是我们⾃⼰
⽹络内部的IP地址,需要路由转发出去,到internet⽹络中,但是⽹络这么⼤,怎么办,那么通过⽹关计算出⼀个最佳的传输路径去到对应的⽬标⽹关地址,在路由转发的过程
中(当请求被路由B接收到了之后,路由B打开之后发现不是⾃⼰的,就会把请求信息包继续转发)然后传输到这个⽹关地址的路由器上,⽬标⽹关路由器上设置了⼀些IP地址+端
⼝和各个服务器上的映射关系,即便是所有的交换机都接收到了这个请求,但是还是能够到对应的服务器。在通过交换机发送到对应的服务器上
那么⽹关到底是什么呢?⽹关实质上是⼀个⽹络通向其他⽹络的IP地址。⽐如有⽹络A和⽹络B,⽹络A的IP地址范围为 “192.168.1.1~192. 168.1.254”,⼦⽹掩码为
九阴真经门派255.255.255.0;⽹络B的IP地址范围为“192.168.2.1~192.168.2.254”,⼦⽹掩码为255.255.255.0。在没有路由器的情况下,两个⽹络之间是不能进⾏TCP/IP通信的,即使是两个
⽹络连接在同⼀台交换机(或集线器)上, TCP/IP协议也会根据⼦⽹掩码(255.255.255.0)判定两个⽹络中的主机处在不同的⽹络⾥。⽽要实现这两个⽹络之间的通信,则必
须通过⽹关。如果⽹络A中的主机发现数据包的⽬的主机不在本地⽹络中,就把数据包转发给它⾃⼰的⽹关,再由⽹关转发给⽹络B的⽹关,⽹络B的⽹关再转发给⽹络B的某个
主机。⽹络B向⽹络A转发数据包的过程也是如此。
细说⼆层交换机、三层交换机、四层交换机。百科:
第⼆层交换机,是根据第⼆层数据链路层的MAC地址和通过站表选择路由来完成端到端的数据交换的。
⼆层交换机具体的⼯作流程如下:
(1)当交换机从某个端⼝收到⼀个数据包,它先读取帧头中的源MAC地址,并将MAC地址与源端⼝做对应存储在站表中。
(2)再去读取帧头中的⽬的MAC地址,并在地址表中查相应的端⼝;
(3)如表中有与这⽬的MAC地址对应的端⼝,把数据包直接复制到这端⼝上;
(4)如表中不到相应的端⼝则把数据包⼴播到同⼀VLAN下的所有端⼝,当⽬的机器对源机器回应时,交换机⼜可以学习⼀⽬的MAC地址与哪个端⼝对应,在下次传送数据时就不再需要对所有端⼝进⾏⼴播了。
不断的循环这个过程,对于全⽹的MAC地址信息都可以学习到,⼆层交换机就是这样建⽴和维护它⾃⼰的地址表。
因为站表的建⽴与维护是由交换机⾃动完成,⽽路由器⼜是属于第三层设备,其寻址过程是根据IP地址寻址和通过路由表与路由协议产⽣的。所以,第⼆层交换机的最⼤好处是数据传输速度快,因为它只须识别数据帧中的MAC地址,⽽直接根据M
第三层交换机,是直接根据第三层⽹络层IP地址来完成端到端的数据交换的。
三层交换机的⼯作原理:
使⽤IP的设备A------------------------三层交换机------------------------使⽤IP的设备B
⽐如A要给B发送数据,已知⽬的IP,那么A就⽤⼦⽹掩码取得⽹络地址,判断⽬的IP是否与⾃⼰在同⼀⽹段。
如果在同⼀⽹段,但不知道转发数据所需的MAC地址,A就发送⼀个ARP请求,B返回其MAC地址,A⽤此MAC封装数据包并发送给交换机,交换机起⽤⼆层交换模块,查MAC地址表,将数据包转发到相应的端⼝。
如果⽬的IP地址显⽰不是同⼀⽹段的,那么A要实现和B的通讯,在流缓存条⽬中没有对应MAC地址条⽬,就将第⼀个正常数据包发送向⼀个缺省⽹关,这个缺省⽹关⼀般在操作系统中已经设好,对应第三层路由模块,所以可见对于不是同⼀⼦⽹表⾯上看,第三层交换机是第⼆层交换器与路由器的合⼆⽽⼀,然⽽这种结合并⾮简单的物理结合,⽽是各取所长的逻辑结合。其重要表现是,当某⼀信息源的第⼀个数据流进⾏第三层交换后,其中的路由系统将会产⽣⼀个MAC地址与IP地址的映射第四层交换机
显然,第⼆层交换机和第三层交换机都是基于端⼝地址的端到端的交换过程,虽然这种基于MAC地址和IP地址的交换机技术,能够极⼤地提⾼各节点之间的数据传输率,但却⽆法根据端⼝主机的应⽤需求来⾃主确定或动态限制端⼝的交换过程和数最后值得指出的是,某些⼈在不同程度上还存在⼀些模糊概念,认为所谓第四层交换机实际上就是在第三层交换机上增加了具有通过辨别第四层协议端⼝的
能⼒,仅在第三层交换机上增加了⼀些增值软件罢了,因⽽并⾮⼯作在传输层,⽽是仍然在第重要技术
如上所述,第⼆层交换设备是依赖于MAC地址和802.1Q协议的VLAN标签信息来完成链路层交换过程的,第三层交换/路由设备则是将IP地址信息⽤于⽹络路径选择来完成交换过程的,第四层交换设备则是⽤传输层数据包的包头信息来帮助信息交换由于TCP和UDP数据包的包头不仅包括了“端⼝号”这个域,它还指明了正在传输的数据包是什么类型的⽹络数据,使⽤这种与特定应⽤有关的信息(端⼝号),就可以完成⼤量与⽹络数据及信息传输和交换相关的质量服务,其中最值得说明的是如⼆三四层交换机
整个⽹络通信流程图
五、初识socket
主要是创建⼀个服务端,在创建服务端的时候,主要步骤如下:滴滴司机怎么注册
创建socket对象socket——》绑定IP地址和端⼝bind——》监听listen——》得到请求accept——》接收请求recv——》发送信息send——》关闭close
import socket
# 实例化⼀个socket对象
server = socket.socket()  # 创建⼀个⼿机(server)
ip_port = ("192.168.15.68", 8999) # 创建⼀个ip,和端⼝相当于买了个电话卡
server.bind(ip_port) # 插卡
# 监听
server.listen() # 开机
# 等待客户端连接
conn, adds = server.accept() # 等别⼈电话,回产⽣阻塞
print(conn)  # conn连接管道
print(adds)  # adds客户端地址  #('192.168.15.68', 60392) 60392:客户端端⼝号电脑随机分配
while 1:
没工作怎么办理信用卡
from_client_msg = v(1024) # 接收客户端信息
print("来⾃客户端的消息:", from_client_msg.decode("utf-8")) # 显⽰信息
server_msg = input("请输⼊对话(q退出):") # 向客户端发送信息信息必须是bytes类型的(需要编码)
if server_msg.upper() == "Q":
break
else:
conn.send(de("utf-8"))
conn.close() # 关闭通道
server.close() # 关机关闭socket
server 服务单以家人之名主题曲
客户端代码就是连接服务器,接收和发送消息,具体流程如下:
创建socket对象socket——》connet连接服务器——》获取消息recv——》发送消息send——关闭close
import socket
# 实例化⼀个socket对象
client = socket.socket() # 创建⼀个客户端
server_ip_port = ("192.168.15.68", 8999) # 服务端的ip和端⼝
while 1:
client_msg = input("请输⼊对话(q退出):") # 想服务端发送信息必须是bytes类型
if client_msg.upper() == "Q":
break
else:
生成两种沉淀的复分解反应client.send(de("utf-8"))
from_server_msg = v(1024)
print("来⾃服务端的信息:", from_server_msg.decode("utf-8"))  # 将接受的信息bytes解码
client.close()
client 客户端
3、基本⽅法描述
在使⽤socket模块的时候,创建对象⼀般是使⽤如下的代码:
[python]
1. s = socket.socket()
在使⽤默认值的时候,表⽰创建的是TCP 的socket,地址家族表⽰为socket.AF_INET,socket类型默认值为socket.SOCK_STREAM表⽰为TCP的,⽽UDP的为
socket.SOCK_DGRAM,表⽰为数据包
绑定的代码如下:
[python]
1. s.bind((IP,port))
注意在绑定的时候,参数只有⼀个表⽰为元组tuple,其中第⼀个元素为ip地址或者是hostname,第⼆个参数为port端⼝号,也就是开始监听哪个IP地址的哪个端⼝
监听的代码如下:
[python]
1. s.listen(5)
其中的参数为整数,5表⽰阻塞五个连接,实际上,,经过测试,⼗⼏个都没问题,主要是阻塞式的,当有⼀个连接上的时候,那么其他的都不会连接上,只有在第⼀个推出的时候,其他的才能进⾏连接,开始还以为是可以同时连接五个,然后测试下,发现不⾏,⽆论是同⼀个服务器上还是不同的机器上,是不能同时进⾏连接的,也就是所谓的阻塞式。
被动接受请求的代码如下:
[python]
1. conn,addres = s.accept()
返回的是⼀个元组,也就是在接受客户端的连接,返回的第⼀个元素是⼀个socket对象,可以认为是客户端的socket对象,address表⽰为客户端的地址,其实这个也就使⽤和客户端进⾏通信的。
客户端连接服务器端的代码如下:
[python]
1. s.connect((ip,port))
参数为服务器的IP地址和服务器监听的端⼝。
发送消息的代码如下:
[python]
1. conn.send('string is send')
2. conn.sendall('send')
l两个都是⽤来发送消息的,区别就是sendall尽量⼀次发送,⽽send的话主要看接收能⼒,如果超出范围的话,那么会进⾏发送两次进⾏发送
接收消息的代码如下:
[python]
1. v(1024)
主要⽅法是recv⽅法表⽰接收消息,最多接收的字节数为1024,那么多余的字符将会在下次接收的过程中进⾏接收。
4、运⾏客服端和服务端
在运⾏客户端和服务端代码之后,发现是可以交互的,也就是客户端和服务端进⾏说话,就想其他的⼀些交流软件⼀样,注意,在上述的代码中还存在⼀些bug,并不是指异常处理
在上述的代码中,主要的思路就是如果客户端输⼊为空,那么会⼀直输⼊,除⾮输⼊exit,那么退出,输⼊了字符之后,才会发送到服务端
如果服务端回复为空,那么会要求服务端⼀直输⼊,输⼊字符后发送给客户端,如果客户端退出,那么断开连接,继续监听。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。