python D26 socket、网络整个通信流程

一、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台电脑,也可以是一幢100层大楼里的1000台电脑。局域网可以是独立封闭运行的,也可以是和外网相连接的。
所谓外网,也就是广域网。是一种地域跨度非常大的网络集合。它是由无数个局域网+独立服务器构成的。注意,此处所说的局域网既可以是小型的广域网,也可以是局域网。
    实际上,从规模上来看我们很难分辨局域网与广域网,因为大小都是相对的。所以。真正局域网与广域网的分别是通过IP地址来实现的。
    任何一台电脑要上网,都必须在网络上有一个唯一的IP地址。在局域网内,这个IP地址是唯一的。但是在另外一个局域网,这个IP地址仍然能够使用。

四、DNS服务器

  当我们请求https:\\www.JD.com的时候,首先电脑会在本地的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查询请求。再找不到就根据‘根提示文件’向负责顶级域‘.com’的DNS服务器查询

      第四步:'根DNS服务器'根据查询域名中的'xyz.com',再向xyz.com的区域服务器查询

      第五步:www.xyz.abc.com的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查询请求。再找不到就根据‘根提示文件’向负责顶级域‘.com’的根DNS服务器查询

      第四步:根DNS服务器直接将其区域DNS服务器的ip地址返回给本地服务器,而不用再向xyz.com的区域服务器查询。

      第五步:(京东有自己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地址,而直接根据MAC地址产生选择转发端口的算法又十分简单,非常便于采用ASIC专用芯片实现。显然,第二层交换机的解决方案,实际上是一个“处处交换”的廉价方案,虽然该方案也能划分子网、限制广播、建立VLAN,但它的控制能力较小、灵活性不够,也无法控制各信息点的流量,缺乏方便实用的路由功能。

第三层交换机,是直接根据第三层网络层IP地址来完成端到端的数据交换的。
三层交换机的工作原理:
    使用IP的设备A------------------------三层交换机------------------------使用IP的设备B
    比如A要给B发送数据,已知目的IP,那么A就用子网掩码取得网络地址,判断目的IP是否与自己在同一网段。
    如果在同一网段,但不知道转发数据所需的MAC地址,A就发送一个ARP请求,B返回其MAC地址,A用此MAC封装数据包并发送给交换机,交换机起用二层交换模块,查找MAC地址表,将数据包转发到相应的端口。
    如果目的IP地址显示不是同一网段的,那么A要实现和B的通讯,在流缓存条目中没有对应MAC地址条目,就将第一个正常数据包发送向一个缺省网关,这个缺省网关一般在操作系统中已经设好,对应第三层路由模块,所以可见对于不是同一子网的数据,最先在MAC表中放的是缺省网关的MAC地址;然后就由三层模块接收到此数据包,查询路由表以确定到达B的路由,将构造一个新的帧头,其中以缺省网关的MAC地址为源MAC地址,以主机B的MAC地址为目的MAC地址。通过一定的识别触发机制,确立主机A与B的MAC地址及转发端口的对应关系,并记录进流缓存条目表,以后的A到B的数据,就直接交由二层交换模块完成。这就通常所说的一次路由多次转发。
表面上看,第三层交换机是第二层交换器与路由器的合二而一,然而这种结合并非简单的物理结合,而是各取所长的逻辑结合。其重要表现是,当某一信息源的第一个数据流进行第三层交换后,其中的路由系统将会产生一个MAC地址与IP地址的映射表,并将该表存储起来,当同一信息源的后续数据流再次进入交换环境时,交换机将根据第一次产生并保存的地址映射表,直接从第二层由源地址传输到目的地址,不再经过第三路由系统处理,从而消除了路由选择时造成的网络延迟,提高了数据包的转发效率,解决了网间传输信息时路由产生的速率瓶颈。所以说,第三层交换机既可完成第二层交换机的端口交换功能,又可完成部分路由器的路由功能。即第三层交换机的交换机方案,实际上是一个能够支持多层次动态集成的解决方案,虽然这种多层次动态集成功能在某些程度上也能由传统路由器和第二层交换机搭载完成,但这种搭载方案与采用三层交换机相比,不仅需要更多的设备配置、占用更大的空间、设计更多的布线和花费更高的成本,而且数据传输性能也要差得多,因为在海量数据传输中,搭载方案中的路由器无法克服路由传输速率瓶颈。

第四层交换机
    显然,第二层交换机和第三层交换机都是基于端口地址的端到端的交换过程,虽然这种基于MAC地址和IP地址的交换机技术,能够极大地提高各节点之间的数据传输率,但却无法根据端口主机的应用需求来自主确定或动态限制端口的交换过程和数据流量,即缺乏第四层智能应用交换需求。第四层交换机不仅可以完成端到端交换,还能根据端口主机的应用特点,确定或限制它的交换流量。简单地说,第四层交换机是基于传输层数据包的交换过程的,是一类基于TCP/IP协议应用层的用户应用交换需求的新型局域网交换机。第四层交换机支持TCP/UDP第四层以下的所有协议,可识别至少80个字节的数据包包头长度,可根据TCP/UDP端口号来区分数据包的应用类型,从而实现应用层的访问控制和服务质量保证。所以,与其说第四层交换机是硬件网络设备,还不如说它是软件网络管理系统。也就是说,第四层交换机是一类以软件技术为主,以硬件技术为辅的网络管理交换设备。
最后值得指出的是,某些人在不同程度上还存在一些模糊概念,认为所谓第四层交换机实际上就是在第三层交换机上增加了具有通过辨别第四层协议端口的能力,仅在第三层交换机上增加了一些增值软件罢了,因而并非工作在传输层,而是仍然在第三层上进行交换操作,只不过是对第三层交换更加敏感而已,从根本上否定第四层交换的关键技术与作用。我们知道,数据包的第二层IEEE802.1P字段或第三层IPToS字段可以用于区分数据包本身的优先级,我们说第四层交换机基于第四层数据包交换,这是说它可以根据第四层TCP/UDP端口号来分析数据包应用类型,即第四层交换机不仅完全具备第三层交换机的所有交换功能和性能,还能支持第三层交换机不可能拥有的网络流量和服务质量控制的智能型功能。
重要技术
    如上所述,第二层交换设备是依赖于MAC地址和802.1Q协议的VLAN标签信息来完成链路层交换过程的,第三层交换/路由设备则是将IP地址信息用于网络路径选择来完成交换过程的,第四层交换设备则是用传输层数据包的包头信息来帮助信息交换和传输处理的。也就是说,第四层交换机的交换信息所描述的具体内容,实质上是一个包含在每个IP包中的所有协议或进程,如用于Web传输的HTTP,用于文件传输的FTP,用于终端通信的Telnet,用于安全通信的SSL等协议。这样,在一个IP网络里,普遍使用的第四层交换协议,其实就是TCP(用于基于连接的对话,例如FTP)和UDP(用基于无连接的通信,例如SNMP或SMTP)这两个协议。
    由于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 = conn.recv(1024) # 接收客户端信息
    print("来自客户端的消息:", from_client_msg.decode("utf-8")) # 显示信息
    server_msg = input("请输入对话(q退出):") # 向客户端发送信息 信息必须是bytes类型的(需要编码)
    if server_msg.upper() == "Q":
        break
    else:
        conn.send(server_msg.encode("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和端口
client.connect(server_ip_port) # 连接服务端ip和端口

while 1:
    client_msg = input("请输入对话(q退出):") # 想服务端发送信息 必须是bytes类型
    if client_msg.upper() == "Q":
        break
    else:
        client.send(client_msg.encode("utf-8"))

        from_server_msg = client.recv(1024)
        print("来自服务端的信息:", from_server_msg.decode("utf-8"))  # 将接受的信息bytes解码

client.close()
client 客户端

猜你喜欢

转载自www.cnblogs.com/z520h123/p/9996667.html