1. C/S 架构 : client 客户端/ sever 服务端
软件c/s架构: QQ, 微信, 浏览器等, 其中中浏览器又比较特殊,很多网站是基于浏览器来进行访问的,浏览器和各个网站服务端进行的通讯方式又常被成为B\S架构(浏览器英文名称:Browser)
硬件c/s架构: 打印机
2. 网络通信流程:
以本地的电脑浏览器访问京东网站为例
(1) 网卡和mac地址
- 电脑插网线的地方就叫做网卡,网卡提供了网络的接口,这是硬件上面的,关于电脑的网卡,并不是Ip地址,而是全球唯一的mac地址,专门给网络设备设定,电脑出厂的时候给定的
- head中包含的源和目标地址由来:ethernet规定接入internet的设备都必须具备网卡,发送端和接收端的地址便是指网卡的地址,即mac地址。
- mac地址:每块网卡出厂时都被烧制上一个世界唯一的mac地址,长度为48位2进制,通常由12位16进制数表示(前六位是厂商编号,后六位是流水线号)
(2) IP地址
编码的回顾: 一个字节等于8位,8个2进制的数可以表示256个字节此处IP地址是由点分割的四个十进制的数,而十进制的数在计算机中是由二进制表示的,即
- 0.0.0.0--255.255.255.255 (十进制)
- 0000000.00000000.00000000.00000000 -- 11111111.11111111.11111111.11111111 (二进制)
(3) 网络通信流程
arp协议功能:广播的方式发送数据包,获取目标主机的mac地址
流程:
第一步:打开浏览器,想要请求访问京东,在地址栏输入了网址:www.jd.com。(www.jd.com是域名就是一个IP地址的名称,IP地址不好记,所有有了域名。)
第二步:先将请求信息发给了交换机,然后交给了路由器,路由发给DNS服务器,通过DNS协议去找我们要访问的京东的IP地址:
第三步:查到的京东服务器对应的IP地址之后,路由器通过路由协议找到一个路由转发的最优路径,将你的请求信息还送给这个IP地址的京东的路由器
第四步:京东的路由器发给了京东网站的服务器上
第五步:京东网站服务器按照来的时候的路径,在返回给你他自己的网站
第六步:当你打开浏览器的时候,你的电脑给你的浏览器这个运行起来的程序给了一个编号,叫做端口号,当你的电脑收到京东发送过来的消息的时候,你的电脑通过端口号找到你的浏览器,你的浏览器拿到了京东的网站信息,然后将网站呈现在了自己的浏览器上
(4) 内网和外网
- 所谓内网就是我们平常说的局域网。局域网就是在固定的一个地理区域内由2台以上的电脑用网线和其他网络设备搭建而成的一个封闭的计算机组,它可以是邻居之间的2台电脑,也可以是一幢100层大楼里的1000台电脑。局域网可以是独立封闭运行的,也可以是和外网相连接的。
- 所谓外网,也就是广域网。是一种地域跨度非常大的网络集合。它是由无数个局域网+独立服务器构成的。注意,此处所说的局域网既可以是小型的广域网,也可以是局域网。
实际上,从规模上来看我们很难分辨局域网与广域网,因为大小都是相对的。所以。真正局域网与广域网的分别是通过IP地址来实现的。
任何一台电脑要上网,都必须在网络上有一个唯一的IP地址。在局域网内,这个IP地址是唯一的。但是在另外一个局域网,这个IP地址仍然能够使用。(网络A里有一台IP地址为192.168.1.231的客户端,网络B里也可以有一台同样IP的电脑。那么。我们就说这2台机器分别在2个局域网里。但是在广域网内,所有的IP地址都是唯一的,不可重复)
如果只有内网的ip地址你是不能上网的,你上网肯定要通过一个外网地址,这个外网地址又称为公网地址,这个公网地址是全球唯一的,他在你的对外出口的路由器上,也就是你的外网网关地址
(5) 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地址了,提高了效率.
(6) 交换机、路由器和网关(含DHCP)
那么网关到底是什么呢?网关实质上是一个网络通向其他网络的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转发数据包的过程也是如此。
路由器对外部网络的通信都是通过外网接口(wan口)去转发出去的,也就是不管你是内网中的哪个电脑,你的请求都要通过路由的外网接口发送出去,别人对你的请求都是通过外网接口接收进来的,至于路由器上对内的lan口是怎么分配IP地址给内网的,要看路由器怎么设置划分vlan也就是子网(内部局域网),每个lan口的IP地址可以是静态的,也可以是动态分配的(DHCP协议),而且可以划分网段,例如:我的1号lan口对接的网段是192.168.1.0-192.168.1.255,那么所有这个网段的电脑的信息进出都走这个lan口到路由器上,对于连接路由器的交换机来讲,主要的作用就是搭桥用的,搭桥的意思就是让连接该交换机的所有电脑都能够连接起来,只要是同一个网段的互相都可以进行通信,当然这个也要看交换机怎么配置.
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段 交换机又分二层交换机和三层交换机,二层交换机主要就是个搭桥的作用,三层交换机还兼有路由的作用,一般现在的交换机都有DHCP功能,也就是说交换机下面连接的这些电脑的子网IP或者说是局域网IP也可以由交换机来动态生成和分配,路由器和交换机所生成的子网IP都是自己在路由器和交换机上设置的,和路由器上的外网IP没有关系,具体的划分又分为24位的16位的等等,举例:24位的就是10.11.1.0-10.11.1.255这256个IP地址,0表示后面的8bit是00000000,255表示后面的8bit是11111111
3. 初始socket
#编写服务端 import socket #创建一个socket对象 server = socket.socket() #创建一个手机 ip_port =("192.168.15.51",8900) #绑定ip地址和端口 server.bind(ip_port) #监听ip地址和端口 server.listen() print("等待中...0101") #等待客户端的连接 conn,addr = server.accept() #conn是连接的通道, addr是地址信息, 阻塞中 #接受消息 from_client_msg = conn.recv(1024) #接收的消息是bytes类型,需要转换为字符串 print(from_client_msg.decode("utf-8")) conn.send("盖浇饭".encode("utf-8")) conn.close() server.close()
#编写客户端 import socket client = socket.socket() server_ip_port = ("192.168.15.51",8900) #连接服务端 client.connect(server_ip_port) #发消息 client.send("中午吃啥".encode("utf-8")) #send里的消息必须是字节类型 from_server_msg = client.recv(1024) print(from_server_msg.decode("utf-8")) #关闭连接 client.close()