网络编程基础
一.软件开发的架构
我们所了解的涉及的到两个程序之间通讯应用大致可以分为两种:
第一种是应用类:qq 微信 网盘
第二种是web类:百度,知乎,博客园等使用浏览器就可以访问的桌面应用
这些应用本质都是两个程序之间的通讯.而这两个分类对应了两个框架
1.c/s架构:
clience 与server,客户端与服务端架构,这种架构也是用户层面来划分的,这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。
2.b/s架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。 Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。
二.网络基础
1.tcp协议和 udp协议
(1)TCP协议是面向连接的,可靠地协议,传输效率低全双工通信(发送缓存&接受缓存).面向字节流.应用:Web浏览器,电子邮件,文件传输程序.
(2)UDP不可靠的,无连接服务的,传输效率高(发送前延时小),一对一,一对多,多对一,面向报文,尽最大努力服务,无拥塞控制,使用UDP的应用:域名系统(DNS);视频流;IP语音.
2.TCP协议的三次握手四次挥手
(1)三次握手
socket客户端向服务端发起连接请求:三次握手
client.concent()
客户端 | 服务端 | |
第一次 | 我要来了 | |
第二次 | 你来吧 | |
第三次 | 好的,我这就来 |
(2)四次挥手
客户端 | 服务端 | |
第一次 | 我要走了 | |
第二次 | 走就走,但是我处理一些事 | |
第三次 | 我处理完了,你走吧 | |
第四次 | 我走了 |
3.基础概念
(1)osi七层模型:网络数据传输
物理层:建立.维护.断开物理连接(将数据转化成电信号发送)
数据链路层:逻辑链接.进行硬件地址寻址,差错校验等(MAC)
网络层:进行逻辑寻址,实现不同网络之间的路径选择(IP)
传输层:定义传输数据的协议端口号,及流控和差错效验(TCP/UDP)
会话层:建立,管理,终止会话 (保持登录或链接状态) 应用偷偷携带一点其他数据: cookies/session
表示层:数据的表示,安全,压缩(看到数据,如图片和视频) 生产数据:session/cookies
应用层:网络服务与最终用户的一个接口(使用软件) 打开软件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
首先,计算机A和B之间要有物理层的连接,可以是有线比如同轴电缆或者双绞线通过RJ-45的电路接口连接,也可以是无线连接例如WIFI。先简化一下,考虑局域网,暂不讨论路由器和交换机以及WIFI热点。这些物理层的连接建立了比特流的原始传输通路。 接下来,数据链路层登场,建立两台计算机的数据链路。如果A和B所在的网络上同时连接着计算机C,D,E等等,A和B之间如何建立的数据链路呢?这一过程就是物理寻址,A要在众多的物理连接中找到B,依赖的是计算机的物理地址即MAC地址,对就是网卡上的MAC地址。以太网采用CSMA/CD方式来传输数据,数据在以太网的局域网中都是以广播方式传输的,整个局域网中的所有节点都会收到该帧,只有目标MAC地址与自己的MAC地址相同的帧才会被接收。A通过差错控制和接入控制找到了B的网卡,建立可靠的数据通路。 那IP地址呢? 数据链路建立起来了,还需要IP地址么?我们FTP 命令中制定的是IP地址而不是MAC地址呀?IP地址是逻辑地址,包括网络地址和主机地址。如果A和B在不同的局域网中,中间有着多个路由器,A需要对B进行逻辑寻址才可以的。物理地址用于底层的硬件的通信,逻辑地址用于上层的协议间的通信。在以太网中:逻辑地址就是IP地址,物理地址就是MAC 地址。在使用中,两种地址是用一定的算法将他们两个联系起来的。所以,IP是用来在网络上选择路由的,在FTP的命令中,IP中的原地址就是A的IP地址,目标地址就是B的IP地址。这应该就是网络层,负责将分组数据从源端传输到目的端。 A向B传输一个文件时,如果文件中有部分数据丢失,就可能会造成在B上无法正常阅读或使用。所以需要一个可靠的连接,能够确保传输过程的完整性,这就是传输层的TCP协议,FTP就是建立在TCP之上的。TCP的三次握手确定了双方数据包的序号、最大接受数据的大小(window)以及MSS(Maximum Segment Size)。TCP利用IP完成寻址,TCP中的提供了端口号,FTP中目的端口号一般是21。传输层的端口号对应主机进程,指本地主机与远程主机正在进行的会话。 会话层用来建立、维护、管理应用程序之间的会话,主要功能是对话控制和同步,编程中所涉及的session是会话层的具体体现。表示层完成数据的解编码,加解密,压缩解压缩等,例如FTP中bin命令,代表了二进制传输,即所传输层数据的格式。 HTTP协议里body中的Json,XML等都可以认为是表示层。应用层就是具体应用的本身了,FTP中的PUT,GET等命令都是应用的具体功能特性。 简单地,物理层到电缆连接,数据链路层到网卡,网络层路由到主机,传输层到端口,会话层维持会话,表示层表达数据格式,应用层就是具体FTP中的各种命令功能了。
osi 五层模型
物理层:建立.维护.断开物理连接(将数据转化成电信号发送)
数据链路层:逻辑链接.进行硬件地址寻址,差错校验等(MAC)
网络层:进行逻辑寻址,实现不同网络之间的路径选择(IP)
传输层:定义传输数据的协议端口号,及流控和差错效验(TCP/UDP)
会话层:建立,管理,终止会话 (保持登录或链接状态)
会话层 表示层:数据的表示,安全,压缩(看到数据,如图片和视频)
应用层:网络服务与最终用户的一个接口(使用软件)
(2)
MAC:
MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。在OSI模型中,第三层网络层负责IP地址,第二层数据链路层则负责 MAC地址。因此一个主机会有一个MAC地址,而每个网络位置会有一个专属于它的IP地址。
MAC地址是网卡决定的,是固定的。
IP:
IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。常见的IP地址,分为IPv4与IPv6两大类。在网络中为了区别不同的计算机,也需要给计算机指定一个连网专用号码,这个号码就是“IP地址”
(以太网发明出来的时候,IP还没有垄断网络层协议,那时还有Novell网的IPX/SPX协议、DEC公司开发的CLNP网络协议,以及Apple公司开发的Apple Talk协议,以太网需要支持这所有的网络层协议,如果没有MAC地址,势必需要网卡解读网络层协议头的地址信息,而每一种网络层的地址都大相径庭,所以增加了以太网卡的实现复杂度。
而网卡有了MAC地址,可以不依赖于任何网络层协议,可以独立判断一个以太帧是否接收(依据MAC地址匹配),这样大大简化了网卡的实现。
即使以后出现更多的网络层协议,网卡也无需太多的改变,这就是网络分层的精髓,一层的内部实现无需知晓其上层、或下层协议字段。)
子网掩码:
内网中192.168.1.199的前三组是网络号,后一组是主机号,子网掩码就是255.255.255.0
首先要说明的是:不是某个IP的网络号和主机号决定子网掩码是什么,而是子网掩码决定了某个IP地址的网络号与主机号是什么,IP地址是要搭配子网掩码使用的。例如上面的子网掩码决定了192.168.1.199的前三段192.168.1是网络号,最后一段199是主机号。
网关:
网关实质上是一个网络通向其他网络的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转发数据包的过程
端口:![](https://img2018.cnblogs.com/blog/1451262/201809/1451262-20180915230117580-586990109.png)
可以认为是设备与外界通讯交流的出口。
DNS:
域名和ip 的对应光系在哪里找:
先在本地找:
本地电脑: c:\Windows\System32\drivers\etc\hosts
linux : /etc/hosts
然后在DNS服务器里面找,
在网上,所有的地址都是ip地址,但这些ip地址太难记了,所以就出现了域名(比如http://baidu.com)。
# 而域名解析就是将域名,转换为ip地址的这样一种行为。
# 例如:访问www.baidu.com,实质是把域名解析成IP
arp:
ARP(地址解析协议) 其主要用作将IP地址翻译为以太网的MAC地址#在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。#在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。
#所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
#ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
HTCP:
动态主机配置协议(Dynamic Host Configuration Protocol,简称DHCP)是一个局域网的网络协议,该协议允许服务器向客户端动态分配 IP 地址和配置信息。
使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,
广播:(原因不知道mac地址是什么)
局域网内MAC地址
广播风暴: 机器特别多,大家都发消息,找一个人,所有人都接收,接收到拆解判断是不是,交换机 和路由器在一定程度上避免了广播风暴
交换机与路由器:
'交换机'
用于在同一网络内数据快速传输转发,工作在数据链路层;
通过MAC寻址,不能动态划分子网;
只能在一条网络通路中运行,不能动态分配。
'路由器'
是一个网关设备,内部局域网到公网的一个关卡;
工作在网络层;
通过IP寻址,可以划分子网;
可以在多条网络通道中运行,可以动态分配IP地址。
'简单说'
交换机就是把一根网线变成多根网线;
路由器就是把一个网络变成多个网络;
如果不上外网,只是局域网,交换机即可;
如果上外网,并且给网络划分不同网段,就必须用路由器。
三.客户端服务端(模拟ssh)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket server=socket.socket() server.bind(('192.168.13.67',8000)) server.listen(5) while 1: # 服务端可以循环接收 conn,addr=server.accept() while 1: # 可以循环接收内容 data=conn.recv(1024) if data==b'q': break print(data.decode('utf8')) conn.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket clicent=socket.socket() clicent.connect(('192.168.13.67',8000)) while 1: name=input('请输入你的姓名输入Q退出') if name.strip().upper()=="Q": clicent.send(b'q') break clicent.send(name.encode('utf8')) clicent.close()