一、C/S、B/S架构
client客户<------->server服务端
browser浏览器<------>server服务端
到底什么是网络?
人之间要通信,首先底层的物理链接介质要建好,还要通信。
1.物理链接介质只是通信的载体
2.要有通信的统一标准(例如英语)
============================================================
计算机要跟其他计算机联系
物理层:负责接网线,往外联网用,机器上有个网卡负责连接网线,交换机连接路由器,路由器连接防火墙(统称为物理链接介质) 只负责将数据转成二进制。
数据链层(以太网协议):1组电信号构成一个数据包,称之为'祯'。0101010111110就是电信号 再来另外一组电信号就是另外一组电信号。一组数据帧分成:报头和head和数据data两部分。
==============================================================================================================================
head data。一部分代表头,一部分代表数据。头相当于信封,数据代表信得内容。 head包括发送者源地址,接手者目标地址,数据类型6个字节。
但凡一个数据都不能是一个单纯的数据,都要配一个头,头是用来描述数据的,头一定要满足一个特征,固定的长度。
mac地址就是计算机上网卡的地址,有集成的网卡,还有独立的网卡。
以太网规定但凡接入互联网的机器一定要有一块网卡,因为网卡是来标识你在哪,所以那块网卡标识为以太网卡,计算机上为什么有网卡这块硬件,就是以太网规定的
以太网协议传播数据的方式,称之为广播。计算机通信基本靠吼
有了以太网的标准,还有了广播的古老工作传输方式,能不能实现全世界范围内计算机的通信?
答案是能
1.首先底层的物理链接地址都必须连接好。
2.每一台机器上都必备一块网卡。
==============================================================================================================================
mac地址只能在局域网里面用,到此为止。跨局域网,mac地址
mac地址只能定位在局域网内的地址,光有mac地址还不行,需要标识对方在哪个小圆圈,mac地址搞定不了就靠网络层ip协议,ipv4和ipv6 ip的第六个版本
IP协议定义了一个新的地址,IP地址用来标识什么?IP地址就是帮我们来找到局域网在哪的。
目前为止两个地址
IP地址:IP标识对方的机器在哪个局域网里面。
MAC地址:对方的机器在局域网哪个位置。
IP+MAC能标识全世界范围内独一无二的机器。客户端和服务端通信。
本质原理是软件与软件之间的通信,客户端的软件跟服务端的软件进行通信,但是运行需要机器作为介质。
IP地址网络层
传输层:TCP/UDP协议
基于网络通信的软件都有一个对应端口
一共三个地址mac IP还有端口地址,所有运行的软件都有一个对应端口。
接下来的任务,是写一个客户端软件还有一个服务端软件,无论他们分散在世界的哪个角落,客户端都能找到服务端,这是优先解决的问题。
必须有个办法来标识,全世界范围内独一无二的软件在哪。
IP地址用来定位到这台计算机在哪个局域网之内,mac地址用来定位这台计算机在局域网哪个为止,端口地址找到这台机器上独一无二的应用软件
IP+MAC+端口 服务端和客户端都要对应这3个地址。但是服务端比较特殊,服务端必须与服务端的地址捆绑在一起,告诉所有的客户端,我在这个位置
=====================================================================
应用层:应用层是程序员写的,标准是程序员定的 可以用一些公用的协议http,mail,ftp
发包以及解包的过程,
应用层以自己的标准组织好给传输层,传输层再包一层,丢给网络层,丢给数据链接层,再给物理层(打散了)。 源mac和目标mac
发包(一层层包的过程)和解包(一层层拆的)的过程
互联网通信原理介绍
ARP
IP---->mac
mac--->IP
mac地址是硬件地址,是不会变得,ip地址是可以变得
arp的功能用来通过ip获取mac,获取mac地址想怎么通信就怎么通信
计算机会自动调一个arp协议,把ip地址转化成mac地址
跨局域网 mac地址不能吼出去
ipv4 点分时进制,每一部分都是10进制,每一部分的取值范围0-255
子网掩码的作用:
就可以判断任意两个IP地址是否存在于同一个网络
互联网通信原理
传输层有两个协议
一个是TCP一个是UDP,负责帮我们传输数据的,产生的数据最先交给传输层,传输层最先由操作系统控制的,应用层是应用程序自己控制的,传输层以下都是操作系统控制的,应用程序来一个数据要交给操作系统。
操作系统经过传输层交给对方的操作系统,再交给对方的传输层再交给对方的应用程序。
自己的传输层和对方的传输层要建一个双向的通路
TCP协议发一次数据握一次手---------------三次握手建链接
传输层以下建了一个通路
三次握手每个位置都有相应的状态
机器同时服务于大量的用户,这种状态称之为并发,如果并发请求书过多,服务端会滞留(服务端三个状态,lister,recv,establish),服务端在客户数不多的情况下,状态会迅速消失
并发状态太少的情况下看不到RCVD状态因为会立刻转化成establish状态。
如果出现高并发的情况
三次握手的最终目的建双向通路
udp协议不可靠传输协议,不建链接,udp传输效率比较高,就发链接
tcp好处:安全,效率低
UDP好处不安全,效率高
转账涉及tcp协议 qq聊天,查询有关的操作用udp协议
==========================================================
基于tcp协议的套接字通信(网络编程)
AF_INET基于网络通信的套接字
SOCK_STREAM 流氏协议其实就是TCP协议
SOCK_DGRAM UDP协议
127.0.0.1 就代表本机,这个IP地址别人访问不到,只能自己访问,这个称为本地回环地址专门用来自己写程序调试用的,客户端服务端没必要分担到两台机器了,分担到一台机器就可以了
基于tcp协议的套接字通信
服务端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买电话 #AF_INET基于网络通信的套接字 SOCK_STREAM流氏协议(tcp协议)SOCK_DGRAM(udp协议)
phone.bind(('127.0.0.1',8080)) #插手机卡 #127.0.0.1本地回环地址,专门写程序的时候自己调用的 #端口号8080 0-65535(自己用的) 0-1024(系统用的)
phone.listen(5) #开机#5相当于最大挂起的链接数 半连接池 5代表同一时间可以来5个请求 可以建n个连接但是同一时间来的请求数只有5
print('start...')
conn,client_addr=phone.accept() #等电话连接 conn相当于电话线
print('连接来了',conn,client_addr)
#收发消息
msg=conn.recv(1024) #收消息1024是一个最大的限制
print('客户端的消息',msg)#收到客户端的消息
conn.send(msg.upper())#客户端回消息
#挂电话
conn.close()#回收系统资源
#关机
phone.close()#关闭套接字
客户端
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8080)) #拨电话 地址为服务端的ip和端口 phone.send('hello'.encode('utf-8')) #发消息 发字符串 data=phone.recv(1024) #收消息 print(data) phone.close() #客户端的端口可以变,服务端的端口是不变的 基于TCP的套接字通信
为什么会报IP地址端口被占用的问题
跟机器有关,机器反应反应慢,隔一段时间才会回收掉